0

私は持っListViewていますSimpleCursorAdapter

私が得ているエラー:-

java.lang.IllegalStateException: アダプターの内容が変更されましたが、ListView は通知を受け取りませんでした。アダプターのコンテンツがバックグラウンド スレッドからではなく、UI スレッドからのみ変更されていることを確認してください。[ListView(2131361944、class android.widget.ListView) with Adapter(class com.pocketpharmacist.adapter.DrugClassesListAdapter)]

いつ:-

Fragmentはアダプタでフィルタリングを有効にしました。リストをフィルタリングするために、私は1つを得ましたEditText

さて、1)フィルターのテキストを入力し始めると、仮想キーボードが生き返りリストでフィルタリングを開始します

2)しかし、Keybord を非表示にすると、実際のフィルタリングが有効になります。そして、キーボードが生きている状態でlistItemをクリックすると、上記のエラーが表示されます。これは、データが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();       
}

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)

ありがとうございました

4

2 に答える 2

5

書くのではなくろ過の方法を変えました

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

私はそれを変更してFilterListenerの使用を開始し、そのメソッドで 呼び出しnotifyDataSetChangedたところ、すべてが魅力的に機能するようになりました

于 2012-07-13T10:54:15.130 に答える
0

アダプターは UI の一部であるため、UI スレッドから要求するのではなく、バックグラウンド スレッドから要求されないようにする必要があります。vogella.comにアクセスして、Adapter を検索してください。このサイトのチュートリアルが適切にガイドします。

于 2012-06-30T12:57:29.110 に答える