OnItemClick не отвечает на клики

искали listview OnClick not рабочие страницы, не решает.

my Activity заполняет список, вызывая собственный адаптер MyArrayAddapter, который расширяет класс ArrayAdapter.

Проблема: onItemClick() или setOnItemClick() не отвечают.

когда я нажимаю на любой из элементов, никаких действий не происходит, даже операторы журнала не выполняются.

<<>>

фрагмент кода:

В моем классе, который расширяет Activity, реализует OnItemClickListener, я инициализирую и вызываю следующие функции в методе OnCreate():

    private void listViewSet() {

        MyArrayAdapter adapter = new MyArrayAdapter(    this,   R.id.tvrow, rootListWrapper );
        // Assign adapter to ListView
        listView.setAdapter(    adapter     );  
        listView.setOnItemClickListener(    this    );  //******
        listView.performClick();
    }

Даже тосты не появляются :(

@Override
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
        Log.v(  "OnCLick", "asdfhjdf" );
        Toast.makeText(  this,  "Component "+ rootListWrapper.get( position ).toString() + " clicked.", Toast.LENGTH_LONG ).show();

        root = rootListWrapper.get(  position  );
        rootListWrapper = root.children;        
        this.listViewSet();
    }

Примечание: когда я нажимаю на элемент списка, я получаю точно такие же сообщения, отличающиеся только отметкой времени. Я получаю 7-8 таких новых сообщений. LogCat перед кликом:

03-15 09:54:06.507: W/Trace(1825): Unexpected value from nativeGetEnabledTags: 0
03-15 09:54:06.877: W/Trace(1825): Unexpected value from nativeGetEnabledTags: 0
03-15 09:54:06.877: W/Trace(1825): Unexpected value from nativeGetEnabledTags: 0
03-15 09:54:06.947: W/Trace(1825): Unexpected value from nativeGetEnabledTags: 0
03-15 09:54:06.947: W/Trace(1825): Unexpected value from nativeGetEnabledTags: 0
03-15 09:54:07.117: W/Trace(1825): Unexpected value from nativeGetEnabledTags: 0
03-15 09:54:07.117: W/Trace(1825): Unexpected value from nativeGetEnabledTags: 0
03-15 09:54:07.297: W/Trace(1825): Unexpected value from nativeGetEnabledTags: 0

после клика:

03-15 10:05:36.458: W/Trace(1825): Unexpected value from nativeGetEnabledTags: 0
03-15 10:05:36.458: W/Trace(1825): Unexpected value from nativeGetEnabledTags: 0
03-15 10:05:36.480: W/Trace(1825): Unexpected value from nativeGetEnabledTags: 0
03-15 10:05:40.817: W/Trace(1825): Unexpected value from nativeGetEnabledTags: 0
03-15 10:05:40.817: W/Trace(1825): Unexpected value from nativeGetEnabledTags: 0
03-15 10:05:40.917: W/Trace(1825): Unexpected value from nativeGetEnabledTags: 0
03-15 10:05:40.960: W/Trace(1825): Unexpected value from nativeGetEnabledTags: 0

Схема мероприятия:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".BigClass" >

   <ListView
        android:id="@+id/mylist"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</RelativeLayout>

макет для элементов строки:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    android:padding="20dp"
      >     

    <TextView android:id="@+id/tvrow"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:text="Component" />

    <LinearLayout android:weightSum="9"   android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:layout_below="@id/tvrow"   >

    <Button      android:id="@+id/bL"
        android:layout_weight="4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/blue_right"        
         />    
    <Button
        android:id="@+id/bC
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"       
        android:background="@drawable/component2"
         />
    <Button
        android:layout_weight="4"
        android:id="@+id/bR"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"  
        android:background="@drawable/blue_right"
        /> 
   </LinearLayout>
</RelativeLayout>

Он идеально заполняется в первый раз, но я хочу, чтобы при нажатии я мог повторно заполнить его, изменив параметры и снова вызвав метод setAdapter().

Решение этого наверняка поможет многим другим, так как я вижу, что у многих есть неразрешенные сомнения.

java-файл для рассматриваемого класса:

public class BigClass extends Activity implements OnItemClickListener{




    List<Node> rootListWrapper;
    Node root;
    ListView listView;
    GetMethodEx getJSONString;
    JSONObject jObject;
    BigClass HealthNext;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_health_display);

        listView = (ListView) findViewById(R.id.mylist);
        rootListWrapper = new ArrayList<Node>();
        root = new Node();
        getJSONString = new GetMethodEx();
        jObject = new JSONObject();

        //values = new String[] { "Android", "iPhone", "WindowsMobile",
        //        "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
        //        "Linux", "OS/2" };

        this.jsonDataFetch();
        this.listViewSet();

    }
        private void jsonDataFetch() {
        // TODO Auto-generated method stub
         try{
             jObject=new JSONObject(    getJSONString.getInternetData() );           
             root = root.createNode(    jObject );  
             Log.v( "component",    jObject.getString("status") );
             rootListWrapper.add(   root    );
        }catch(Exception e){
            e.printStackTrace();
        }
        Log.v("component", rootListWrapper.toString());
    }


        private void listViewSet() {
            // Define a new Adapter
            // First parameter - Context
            // Second parameter - Layout for the row
            // Third parameter - ID of the TextView to which the data is written
            // Fourth - the Array of data

            MyArrayAdapter adapter = new MyArrayAdapter(    this,   R.id.tvrow, rootListWrapper );
            // Assign adapter to ListView
            listView.setAdapter(    adapter     );  
            listView.setOnItemClickListener(    this    );
            listView.performClick();
        }

    @Override
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
        Log.v(  "OnCLick", "asdfhjdf" );
        Toast.makeText(  BigClass.this,  "Component "+ rootListWrapper.get( position ).toString() + " clicked.",    Toast.LENGTH_LONG ).show();

        root = rootListWrapper.get(  position  );
        rootListWrapper = root.children;
        HealthNext.jsonDataFetch();
        HealthNext.listViewSet();
    }

}

Обновлен LOGCAT: после использования атрибута focusable:false на 3 кнопках.

03-15 10:57:44.798: V/OnCLick(958): asdfhjdf
03-15 10:57:44.952: D/AndroidRuntime(958): Shutting down VM
03-15 10:57:44.952: W/dalvikvm(958): threadid=1: thread exiting with uncaught exception (group=0x40a70930)
03-15 10:57:44.992: E/AndroidRuntime(958): FATAL EXCEPTION: main
03-15 10:57:44.992: E/AndroidRuntime(958): java.lang.NullPointerException
03-15 10:57:44.992: E/AndroidRuntime(958):  at com.example.@@@@@@.BigClass.onItemClick(BigClass.java:86)
03-15 10:57:44.992: E/AndroidRuntime(958):  at android.widget.AdapterView.performItemClick(AdapterView.java:298)
03-15 10:57:44.992: E/AndroidRuntime(958):  at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
03-15 10:57:44.992: E/AndroidRuntime(958):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749)
03-15 10:57:44.992: E/AndroidRuntime(958):  at android.widget.AbsListView$1.run(AbsListView.java:3423)
03-15 10:57:44.992: E/AndroidRuntime(958):  at android.os.Handler.handleCallback(Handler.java:725)
03-15 10:57:44.992: E/AndroidRuntime(958):  at android.os.Handler.dispatchMessage(Handler.java:92)
03-15 10:57:44.992: E/AndroidRuntime(958):  at android.os.Looper.loop(Looper.java:137)
03-15 10:57:44.992: E/AndroidRuntime(958):  at android.app.ActivityThread.main(ActivityThread.java:5039)
03-15 10:57:44.992: E/AndroidRuntime(958):  at java.lang.reflect.Method.invokeNative(Native Method)
03-15 10:57:44.992: E/AndroidRuntime(958):  at java.lang.reflect.Method.invoke(Method.java:511)
03-15 10:57:44.992: E/AndroidRuntime(958):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-15 10:57:44.992: E/AndroidRuntime(958):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-15 10:57:44.992: E/AndroidRuntime(958):  at dalvik.system.NativeStart.main(Native Method)

person gizmoUb    schedule 15.03.2013    source источник
comment
я вообще не хочу реализовывать PerformClick() .. Я читал на каком-то форуме, что PerformClick() можно использовать для удаления этой проблемы. Нет намерения использовать метод onClick(). интересует только OnItemClick()   -  person gizmoUb    schedule 15.03.2013
comment
это listActivity???   -  person Deepzz    schedule 15.03.2013
comment
нет. это простое действие. С объектом ListView listView, взятым из activity_layout.xml, и этот список расширен с помощью расширенного объекта класса ArrayAdapter.   -  person gizmoUb    schedule 15.03.2013


Ответы (2)


Редактировать:

Замените файл строки xml на этот

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:descendantFocusability="true"
    android:padding="20dp"
      >     

    <TextView android:id="@+id/tvrow"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:text="Component" />

    <LinearLayout android:weightSum="9"   android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:layout_below="@id/tvrow"   >

    <Button  android:id="@+id/bL"
        android:layout_weight="4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
           android:focusable="false"
        android:background="@drawable/blue_right"        
         />    
    <Button
        android:id="@+id/bC"
        android:layout_weight="1"
   android:focusable="false"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"       
        android:background="@drawable/component2"
         />
    <Button
        android:layout_weight="4"
        android:id="@+id/bR"
      android:focusable="false"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"  
        android:background="@drawable/blue_right"
        /> 
   </LinearLayout>
</RelativeLayout>

Ваш пользовательский адаптер может иметь фокусируемые элементы, такие как (EditText, Button) и т. д., попробуйте установить фокус элементов строки на false

person Pragnani    schedule 15.03.2013
comment
где я должен установить эти атрибуты в false? 1. один макет имеет только тег ‹ListView› 2. Второй макет имеет все элементы, которые образуют элемент строки. - person gizmoUb; 15.03.2013
comment
опубликовал Activity_layout.xml и row.xml ближе к концу. - person gizmoUb; 15.03.2013
comment
@gizmoUb для набора 3 кнопок android:focusable=false - person Pragnani; 15.03.2013
comment
до сих пор не работает! где еще я должен добавить фокусируемый атрибут? Вы смотрели row.xml? - person gizmoUb; 15.03.2013
comment
@gizmoUb Добавьте свой код адаптера, я также опубликую для вас полный ответ. А пока попробуйте установить android:descendantFocusability=true для вашего относительного макета row.xml - person Pragnani; 15.03.2013
comment
я буду, метод OnItemClick() действительно выполняется сейчас, так как я вижу печать сообщения Log.v. Спасибо!! Тем не менее, вскоре он останавливается с сообщением от logcat как: (см. сообщение) - person gizmoUb; 15.03.2013
comment
@gizmoUb опубликуйте свое сообщение logcat в приведенном выше вопросе - person Pragnani; 15.03.2013
comment
@gizmoUb кажется, ваш rootListWrapper.get(position); возвращая ноль, получайте значение, подобное этому parent.get(position) - person Pragnani; 15.03.2013
comment
Если вы получили ответ, отметьте его как ответ, нажав правую отметку рядом с ответом... - person Pragnani; 15.03.2013

 listView.performClick();

Будет запускать onClick() для просмотра списка, а не для отдельных элементов в списке.

Таким образом, вам также необходимо реализовать метод onClick() для перехвата кликов в вашем списке.

person Kumar Bibek    schedule 15.03.2013
comment
хорошо, в этом случае я вообще не хочу реализовывать PerformClick(). Я читал на каком-то форуме, что PerformClick() можно использовать для удаления этой проблемы. Нет намерения использовать метод onClick(). интересует только OnItemClick() - person gizmoUb; 15.03.2013
comment
Как упомянул Праньяни, есть ли у вас такая ситуация? - person Kumar Bibek; 15.03.2013