1. ホーム
  2. android

[解決済み】Android、ListView IllegalStateException。"アダプタの内容が変更されましたが、ListViewは通知を受け取っていません"

2022-04-18 18:25:26

質問

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

避けなければならないことが分かっていること : ListAdapterの内容をバックグラウンドスレッドからいじることはできないので、AsyncTaskを継承して、onProgressUpdateから結果(アダプタへのエントリの追加)を発行するようにしました。アダプタは結果オブジェクトの ArrayList を使用し、その ArrayList に対する操作はすべて同期化されています。

他の方々の研究 非常に貴重なデータです。 こちら . 私も ~500 人のユーザーのグループでほぼ毎日クラッシュに悩まされましたが、私が list.setVisibility(GONE)/trackList.setVisibility(VISIBLE) ブロックに追加したところ、クラッシュは10分の1に減少しましたが、消滅したわけではありません。(それは 答え )

時々受け取るもの このような現象はめったに起こりません(3.5kユーザーのうち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回挿入するごとに、ちらつきや突然のリスト変更を避けるためです。ベースリストが変更されたら常にアダプタに通知するようなやり方ではダメなのです。このバグは、今ではもうとっくになくなりました。

解決方法は?

同じ問題が発生しました。

に項目を追加していたのですが ArrayList UIスレッドの外側で

解決方法 私は両方やりました。 adding the items と呼ばれ notifyDataSetChanged() をUIスレッドで実行します。