.notifydatasetchanged не работает в расширяемом списке в Android

При синтаксическом анализе xml я вызвал notifydatasetchanged после обновления данных в моем расширяемом списке, но приложение аварийно завершает работу. и мой класс адаптера расширяет BaseExpandableListAdapter. Я использовал следующий код:

class PushNotification extends AsyncTask<String, Void, Void> {


    @Override
    protected Void doInBackground(String... arg0) {
        makeGetRequest();
        return null;
    }
    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        listAdapter = new ExpandableListAdapter(ct, values, scores);
        for(int i=0;i<values.size();i++){

        }
        expListView.setAdapter(listAdapter);
        listAdapter.notifyDataSetChanged();

        expListView.setOnGroupClickListener(new OnGroupClickListener() {

            @Override
            public boolean onGroupClick(ExpandableListView parent, View v,
                    int groupPosition, long id) {
                    values.clear();
                    projected_values(groupPosition);
                listAdapter.notifyDataSetChanged();
                return false;
            }
        });

для прослушивателя групповых кликов я даю значения из метода «projected_values». Logcat показывает следующую ошибку

09-23 02:45:43.469: E/AndroidRuntime(3563): FATAL EXCEPTION: main
09-23 02:45:43.469: E/AndroidRuntime(3563): Process: com.example.xmlparsing, PID: 3563
09-23 02:45:43.469: E/AndroidRuntime(3563): java.lang.IllegalStateException: The content of the
    adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes. [in ListView(2131296256, class android.widget.ExpandableListView) with Adapter(class android.widget.ExpandableListConnector)]
09-23 02:45:43.469: E/AndroidRuntime(3563):     at android.widget.ListView.layoutChildren(ListView.java:1555)
09-23 02:45:43.469: E/AndroidRuntime(3563):     at android.widget.AbsListView.onTouchUp(AbsListView.java:3617)
09-23 02:45:43.469: E/AndroidRuntime(3563):     at android.widget.AbsListView.onTouchEvent(AbsListView.java:3429)
09-23 02:45:43.469: E/AndroidRuntime(3563):     at android.view.View.dispatchTouchEvent(View.java:7690)
09-23 02:45:43.469: E/AndroidRuntime(3563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210)
09-23 02:45:43.469: E/AndroidRuntime(3563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)

пожалуйста, помогите мне


person Chowdary102    schedule 23.09.2014    source источник


Ответы (2)


Прежде всего, не создавайте прослушиватели кликов в Async.

Ошибка ниже: -

The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes.

"Убедитесь, что содержимое вашего адаптера не изменяется из фонового потока, а только из потока пользовательского интерфейса"

В своем посте выполните: -

    listAdapter = new ExpandableListAdapter(ct, values, scores);
    for(int i=0;i<values.size();i++){

    }
    expListView.setAdapter(listAdapter);
    listAdapter.notifyDataSetChanged();

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

person Rahul Gupta    schedule 23.09.2014
comment
я изменил свой код.., написал notifydatasetchanged в Runonuithread и написал onclicklisteners в oncreate.., но он дает ту же ошибку - person Chowdary102; 23.09.2014

напишите listAdapter.notifyDataSetChanged(); в основном файле активности вашего класса, а не записывайте его в методе onPostExecute.

person Mohammed Rampurawala    schedule 23.09.2014