我正在ListView
与SimpleCursorAdapter
我收到错误: -
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)
谢谢
答案 0 :(得分:5)
我更改了过滤方法而不是写
public void afterTextChanged(Editable s) {
searchAdapter.getFilter().filter(s.toString());
searchAdapter.notifyDataSetChanged();
drugListView.requestLayout();
}
我更改了它并开始使用FilterListener
并在该方法中调用notifyDataSetChanged
,现在一切都像魅力一样
答案 1 :(得分:0)
适配器是UI的一部分,因此您需要确保它不是从后台线程请求它,而不是从UI线程请求它。请转到vogella.com并搜索适配器。本网站教程将为您提供正确的指导。