我遇到了常见的问题:
java.lang.IllegalStateException: The content of the adapter has changed but List
View did not receive a notification. Make sure the content of your adapter is no
t modified from a background thread, but only from the UI thread. [in ListView(2
131427573, class android.widget.ListView) with Adapter(class android.widget.Head
erViewListAdapter)]
但适配器不是我的代码,而是android.widget.HeaderViewListAdapter
这是使用Jellybean。
我仔细阅读了HeaderViewListAdapter
,ListAdapter
和ListView
的源代码。当IllegalStateException
中的项目计数不等于ListView
提供的计数时,会引发ListAdapter
。在这种情况下,ListAdapter
是HeaderViewListAdapter
。 HeaderViewListAdapter
计数是客户端代码传递的原始ListAdapter
的计数,加上页眉和页脚的大小。
我追查了我的代码。对ListView
的所有访问都在UI线程上,并且notifyDataSetChanged()
始终跟随适配器。我正在使用一个页脚。
在正常使用中不会发生这种情况。是猴子吗?但是Monkey如何从其他线程修改我的变量?
我删除了对addFooterView()
的调用,删除了页脚。 Monkey不再触发异常。我应该在某个时候删除对addFooterView()
的电话吗?
答案 0 :(得分:9)
您可以尝试将这样的内容添加到ListView:
@Override
protected void layoutChildren() {
try {
super.layoutChildren();
} catch (IllegalStateException e) {
ZLog.e(LOG, "This is not realy dangerous problem");
}
}
如果添加headerview或footerview ListView,并且当你通知notifyDataSetChanged()时,它会将mItemCount更改为真实适配器的项目数,但右侧将返回添加了headercount和footercount的虚假itemcount。
答案 1 :(得分:1)
我会解释我的实际问题。 如果需要,我还会附上一些代码。
场景是这样的:我创建了一个将列表附加到OnScrollListener的EndlessList。当我到达List的末尾时,我启动一个AsyncTask(如果有要加载的数据)。
在preExecute中,我向页脚添加了一个视图(微调器)。在doInBackground我从互联网上获取数据,在onPostExecute中我将数据添加到适配器,我删除了页脚视图(加载微调器)。您必须将其删除,因为您无法访问该视图并将其置于GONE上。
在我的代码中,我从不进行notifyDataSetChange,因为在适配器(我从JB源代码克隆的ArrayAdapter)中,当你执行addAll时它会自动执行它
/**
* Adds the specified Collection at the end of the array.
*
* @param collection The Collection to add at the end of the array.
*/
public void addAll(Collection<? extends T> collection) {
synchronized (mLock) {
if (mOriginalValues != null) {
mOriginalValues.addAll(collection);
} else {
mObjects.addAll(collection);
}
}
if (mNotifyOnChange) notifyDataSetChanged();
}
它运作良好,但有时它会因为这个该死的错误而崩溃,我无法解决它:
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(16908298, class android.widget.ListView) with Adapter(class android.widget.HeaderViewListAdapter)]
at android.widget.ListView.layoutChildren(ListView.java:1545)
at android.widget.AbsListView.onTouchModeChanged(AbsListView.java:2239)
at android.view.ViewTreeObserver.dispatchOnTouchModeChanged(ViewTreeObserver.java:591)
at android.view.ViewRoot.ensureTouchModeLocally(ViewRoot.java:2122)
at android.view.ViewRoot.ensureTouchMode(ViewRoot.java:2106)
at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2216)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1886)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)
答案 2 :(得分:1)
我知道这是一个迟到的回复....但我最近刚收到这个错误....我正在使用android-amazing-listview。我得到的结果与
相同(class android.widget.HeaderViewListAdapter)]).
对我有用的解决方案是&gt;
我认为这个问题源于getAdapter
返回AmazingAdapter
而不是包裹的HeaderListViewAdapter
导致计数有时不同的事实。我只是从AmazingListView中删除了getAdapter方法,并且从那以后就没有得到异常。