IllegalStateException“适配器的内容已更改,但ListView未收到通知”

时间:2012-06-30 12:47:13

标签: android android-listview android-cursoradapter

我正在ListViewSimpleCursorAdapter

我收到错误: -

  

java.lang.IllegalStateException:适配器的内容有   已更改,但ListView未收到通知。确保   您的适配器的内容不会从后台线程修改,但是   仅来自UI线程。 [在ListView(2131361944,类   android.widget.ListView)with Adapter(class   com.pocketpharmacist.adapter.DrugClassesListAdapter)]

:当: -

在我的Fragment我已使用适配器启用过滤,并过滤列表我得到了一个EditText

现在, 1)当我开始输入过滤器的文本虚拟键盘活跃时,它开始使用列表

进行过滤

2)但是,当我隐藏Keybord时,真正的过滤活跃起来。如果我点击listItem 并使用 keybord alive ,它会给我上述错误,这很明显,因为数据没有反映到UI

进入深层后我知道例如我想在中搜索ABCDE 列表中我已经在Edittext中输入了ABC现在当我添加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)

谢谢

2 个答案:

答案 0 :(得分:5)

我更改了过滤方法而不是写

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

我更改了它并开始使用FilterListener 并在该方法中调用notifyDataSetChanged,现在一切都像魅力一样

答案 1 :(得分:0)

适配器是UI的一部分,因此您需要确保它不是从后台线程请求它,而不是从UI线程请求它。请转到vogella.com并搜索适配器。本网站教程将为您提供正确的指导。