我想要做 的:运行一个后台线程来计算 ListView 内容并部分更新 ListView,同时计算结果。
我知道我必须避免 :我不能从后台线程中弄乱 ListAdapter 的内容,所以我继承了 AsyncTask 并从 onProgressUpdate 发布结果(向适配器添加条目)。我的适配器使用结果对象的 ArrayList,这些数组列表上的所有操作都是同步的。
别人的研究: 这里有非常有价值的数据。我几乎每天都会遇到大约 500 名用户的崩溃,当我list.setVisibility(GONE)/trackList.setVisibility(VISIBLE)在 onProgressUpdate 中添加块时,崩溃降低了 10 倍,但并没有消失。(在回答中建议)
list.setVisibility(GONE)/trackList.setVisibility(VISIBLE)
我有时会得到什么 :请注意,这种情况很少发生(每周一次,对于 3.5k 用户之一)。但我想完全摆脱这个错误。这是部分堆栈跟踪:
`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 次插入调用一次,以避免闪烁和突然的列表更改。不能这样做,当基本列表发生变化时总是通知适配器。这个错误现在对我来说早已消失了。
notifyDataSetChanged
我遇到过同样的问题。
我正在将项目添加到ArrayListUI 线程之外。
ArrayList
解决方案:我都做了,并在 UI 线程中adding the items调用。notifyDataSetChanged()
adding the items
notifyDataSetChanged()