我想做的事:运行计算ListView内容的后台线程,并在计算结果的同时部分更新ListView.
我知道我必须避免的:我不能弄乱后台线程中的ListAdapter内容,所以我从OnProgressUpdate继承了AsyncTask和Publish Result(将条目添加到适配器)。我的适配器使用结果对象的ArrayList,这些ArrayList上的所有操作都是同步的。
他人的研究:在这里有非常宝贵的数据。对于一组大约500个用户,我几乎每天都会遇到崩溃,当我在OnProgressUpdate中添加list.setVisibility(GONE)/trackList.setVisibility(VISIBLE)
块时,崩溃减少了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)
[...]
帮助?不再需要,见下文
事实证明,最终答案:,我每插入5次就调用notifyDataSetChanged
,以避免闪烁和突然的列表更改。它不能这样做,当基本列表更改时,总是通知适配器。这只虫子现在对我来说早就消失了。