Android Monkey导致android.widget.HeaderViewListAdapter中的适配器通知异常

时间:2012-08-27 10:56:28

标签: android android-monkey

我遇到了常见的问题:

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。

我仔细阅读了HeaderViewListAdapterListAdapterListView的源代码。当IllegalStateException中的项目计数不等于ListView提供的计数时,会引发ListAdapter。在这种情况下,ListAdapterHeaderViewListAdapterHeaderViewListAdapter计数是客户端代码传递的原始ListAdapter的计数,加上页眉和页脚的大小。

我追查了我的代码。对ListView的所有访问都在UI线程上,并且notifyDataSetChanged()始终跟随适配器。我正在使用一个页脚。

在正常使用中不会发生这种情况。是猴子吗?但是Monkey如何从其他线程修改我的变量?

  • 更多Monkey Testing后更新

我删除了对addFooterView()的调用,删除了页脚。 Monkey不再触发异常。我应该在某个时候删除对addFooterView()的电话吗?

3 个答案:

答案 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。

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/widget/ListView.java?av=f#1538

答案 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方法,并且从那以后就没有得到异常。