我想做的事:运行一个后台线程来计算 ListView 内容并部分更新 ListView,同时计算结果。
我知道我必须避免什么:我不能弄乱后台线程中的 ListAdapter 内容,因此我继承了 AsyncTask 并从 onProgressUpdate 发布结果(将条目添加到适配器)。我的适配器使用结果对象的ArrayList,这些数组列表上的所有操作都是同步的。
其他人的研究: 有非常有价值的数据here http://permalink.gmane.org/gmane.comp.handhelds.android.devel/82685。我还遭受了大约 500 个用户组的几乎每天的崩溃,当我添加list.setVisibility(GONE)/trackList.setVisibility(VISIBLE)
在 onProgressUpdate 中阻止,崩溃降低了 10 倍,但并未消失。 (有人建议在answer http://www.mailinglistarchive.com/html/android-developers@googlegroups.com/2010-04/msg01174.html )
有时我得到了什么:请注意,这种情况很少发生(对于 3500 个用户之一来说每周一次)。但我想完全摆脱这个错误。这是部分堆栈跟踪:
`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)
[...]
Help?不再需要,见下文
最终答案:事实证明,我正在打电话notifyDataSetChanged
每 5 次插入一次,以避免闪烁和突然的列表更改。不能以这种方式完成,当基本列表更改时始终通知适配器。这个错误对我来说早已消失了。
我遇到过同样的问题。
我正在将项目添加到我的ArrayList
在 UI 线程之外。
解决方案:我都做了,adding the items
并打电话给notifyDataSetChanged()
在 UI 线程中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)