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

Nix*_*tel 0 android android-listview android-cursoradapter

我ListView有SimpleCursorAdapter

我得到的错误: -

java.lang.IllegalStateException:适配器的内容已更改,但ListView未收到通知.确保不从后台线程修改适配器的内容,而只是从UI线程修改.[在ListView(2131361944,类android.widget.ListView)中使用Adapter(类com.pocketpharmacist.adapter.DrugClassesListAdapter)]

什么时候:-

在我的Fragment我已启用过滤器与适配器,并过滤列表我有一个EditText.

现在,1)当我开始输入过滤器的文本时,虚拟键盘变为活动状态,并开始使用列表进行过滤

2)但是,当我隐藏Keybord时,真正的过滤活跃起来.如果我点击listItem与keybord alive它会给我上面的错误,这是显而易见的,因为数据没有反映到UI

深入了解之后,我知道例如我想在列表中搜索ABCDE我已经在Edittext中输入ABC了,当我添加D时它向我显示ABC的过滤器,现在再次如果我添加E它会向我显示过滤器对于ABCD,Buuut Data最初是在后台更改的.这是错误的原因.

但我无法弄清楚如何解决这个问题

notifyDataSetChanged没有效果,请帮助我,任何提示或想法都可以工作

听到我的代码

方法来自 TextWatcher

public void afterTextChanged(Editable s) {
    searchAdapter.getFilter().filter(s.toString());
    searchAdapter.notifyDataSetChanged();
    drugListView.requestLayout();       
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

谢谢

Nix*_*tel 5

我已经改变了过滤方法而不是写作方法

public void afterTextChanged(Editable s) {
    searchAdapter.getFilter().filter(s.toString());
    searchAdapter.notifyDataSetChanged();
    drugListView.requestLayout();       
}
Run Code Online (Sandbox Code Playgroud)

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