我想做的是:运行后台线程,该线程计算ListView的内容并部分更新ListView,同时计算结果。
我必须避免的是:我无法弄乱后台线程中的ListAdapter内容,因此我继承了AsyncTask并从onProgressUpdate发布结果(向适配器添加条目)。我的适配器使用结果对象的ArrayList,对这些arraylist的所有操作均已同步。
其他人的研究:有非常有价值的数据在这里。对于大约500个用户的组,我几乎每天都遭受崩溃,当我list.setVisibility(GONE)/trackList.setVisibility(VISIBLE)
在onProgressUpdate中添加块时,崩溃降低了10倍,但没有消失。(有人在回答中建议)
我有时得到的结果:请注意,这种情况很少发生(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次插入一次,以避免闪烁和突然的列表更改。无法以这种方式完成,请在基本列表更改时始终通知适配器。这个错误现在对我早已消失。