IllegalStateException «Содержимое адаптера изменилось, но ListView не получил уведомление»

У меня ListView с SimpleCursorAdapter

Я получаю сообщение об ошибке: –

java.lang.IllegalStateException: содержимое адаптера изменилось, но ListView не получил уведомление. Убедитесь, что содержимое вашего адаптера не изменяется из фонового потока, а только из потока пользовательского интерфейса. [в ListView (2131361944, класс android.widget.ListView) с адаптером (класс com.pocketpharmacist.adapter.DrugClassesListAdapter)]

Когда:-

В моем Fragment я включил фильтрацию с помощью адаптера, и для фильтрации списка я получил один EditText.

Теперь, 1) когда я начинаю вводить текст для фильтра, Виртуальная клавиатура оживает, и она начинает фильтровать с помощью списка

2) но настоящая фильтрация оживает, когда я прячу клавиатуру. и если я нажимаю на listItem с активной клавиатурой, это дает мне указанную выше ошибку, которая очевидна, поскольку данные не отражаются в пользовательском интерфейсе.

Углубившись вглубь, я узнал, что например я хочу искать ABCDE в списке. Я ввел ABC в Edittext, теперь, когда я добавляю D, он показывает мне фильтр для ABC, а теперь снова, если я добавлю E, он показывает фильтр для ABCD, Buuut Данные изначально изменены на заднем фоне. что является причиной ошибки.

Но я не могу понять, как это решить

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

Услышьте мой код

Метод от TextWatcher

public void afterTextChanged(Editable s) {
    searchAdapter.getFilter().filter(s.toString());
    searchAdapter.notifyDataSetChanged();
    drugListView.requestLayout();       
}

Logcat, как показано ниже

06-30 18:14:54.299: E/AndroidRuntime(6922): FATAL EXCEPTION: main
06-30 18:14:54.299: E/AndroidRuntime(6922): 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. [in ListView(2131361944, class android.widget.ListView) with Adapter(class com.pocketpharmacist.adapter.DrugClassesListAdapter)]
06-30 18:14:54.299: E/AndroidRuntime(6922):     at android.widget.ListView.layoutChildren(ListView.java:1555)
06-30 18:14:54.299: E/AndroidRuntime(6922):     at android.widget.AbsListView$CheckForTap.run(AbsListView.java:2840)
06-30 18:14:54.299: E/AndroidRuntime(6922):     at android.os.Handler.handleCallback(Handler.java:587)
06-30 18:14:54.299: E/AndroidRuntime(6922):     at android.os.Handler.dispatchMessage(Handler.java:92)
06-30 18:14:54.299: E/AndroidRuntime(6922):     at android.os.Looper.loop(Looper.java:132)
06-30 18:14:54.299: E/AndroidRuntime(6922):     at android.app.ActivityThread.main(ActivityThread.java:4028)
06-30 18:14:54.299: E/AndroidRuntime(6922):     at java.lang.reflect.Method.invokeNative(Native Method)
06-30 18:14:54.299: E/AndroidRuntime(6922):     at java.lang.reflect.Method.invoke(Method.java:491)
06-30 18:14:54.299: E/AndroidRuntime(6922):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
06-30 18:14:54.299: E/AndroidRuntime(6922):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
06-30 18:14:54.299: E/AndroidRuntime(6922):     at dalvik.system.NativeStart.main(Native Method)

Спасибо


person Nixit Patel    schedule 30.06.2012    source источник


Ответы (2)


Я изменил метод фильтрации вместо того, чтобы писать

public void afterTextChanged(Editable s) {
    searchAdapter.getFilter().filter(s.toString());
    searchAdapter.notifyDataSetChanged();
    drugListView.requestLayout();       
}

Я изменил его и начал использовать FilterListener и вызвал notifyDataSetChanged в этом методе, и теперь все работает как часы

person Nixit Patel    schedule 13.07.2012

Адаптер является частью пользовательского интерфейса, поэтому вам необходимо убедиться, что он не запрашивается из фонового потока, чем требуется для запроса из потока пользовательского интерфейса. Перейдите на страницу vogella.com и найдите адаптер. этот учебник по сайту поможет вам правильно.

person Soumyadip Das    schedule 30.06.2012