Android、ListView IllegalStateException:「アダプタの内容が変更されましたが、ListViewは通知を受信しませんでした」質問する

Android、ListView IllegalStateException:「アダプタの内容が変更されましたが、ListViewは通知を受信しませんでした」質問する

私がしたいこと: 結果が計算されている間に、ListView の内容を計算し、ListView を部分的に更新するバックグラウンド スレッドを実行します。

避けなければならないとわかっていること: バックグラウンド スレッドから ListAdapter のコンテンツを操作することはできないため、AsyncTask を継承し、onProgressUpdate から結果を公開します (アダプターにエントリを追加します)。アダプターは結果オブジェクトの ArrayList を使用し、それらの配列リストに対するすべての操作は同期されます。

他の人の研究: 非常に貴重なデータがありますここ約500人のユーザーグループでほぼ毎日クラッシュが発生していましたが、list.setVisibility(GONE)/trackList.setVisibility(VISIBLE)onProgressUpdateにブロックを追加したところ、クラッシュは10分の1に減りましたが、完全になくなるわけではありませんでした。(答え

私が時々得たもの: 注意してください、これは本当にまれに発生します (3.5k ユーザーの 1 人に 1 週​​間に 1 回)。しかし、このバグを完全に取り除きたいと思っています。以下はスタック トレースの一部です。

`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(2131296334, class android.widget.ListView) with Adapter(class com.transportoid.Tracks.TrackListAdapter)]
at android.widget.ListView.layoutChildren(ListView.java:1432)
at android.widget.AbsListView.onTouchEvent(AbsListView.java:2062)
at android.widget.ListView.onTouchEvent(ListView.java:3234)
at android.view.View.dispatchTouchEvent(View.java:3709)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:852)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
[...]

ヘルプ?もう必要ありません。下記をご覧ください

最終回答:結局、私はnotifyDataSetChangedちらつきや突然のリストの変更を避けるために、5 回の挿入ごとに呼び出していました。その方法では実行できません。ベース リストが変更されたときは常にアダプターに通知します。このバグは、今では私の場合はなくなりました。

ベストアンサー1

私も同じ問題を抱えていました。

ArrayListUI スレッドの外部にアイテムを追加していました。

解決策: 両方を実行し、UI スレッドをadding the items呼び出しました。notifyDataSetChanged()

おすすめ記事