5

我有一个常见的问题:

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 This is using Jellybean。

我通读了 和 的HeaderViewListAdapterListAdapter代码ListView。当项目计数不等于 提供的计数IllegalStateException时抛出。在这种情况下,是。s 计数是客户端代码传递的原始计数,加上页眉和页脚的大小。ListViewListAdapterListAdapterHeaderViewListAdapterHeaderViewListAdapterListAdapter

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

这在正常使用中不会发生。是猴子的原因吗?但是 Monkey 怎么能从其他线程修改我的变量呢?

  • 更多猴子测试后更新

我通过删除对addFooterView(). Monkey 不再触发异常。我应该addFooterView()在某个时候删除对的调用吗?

4

3 回答 3

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更改为真实适配器的itemcount,但是右侧会返回添加了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

于 2013-03-08T08:17:20.790 回答
1

我将解释我的实际问题。如果需要,我还会附上一些代码。

场景是这样的:我创建了一个 EndlessList,将列表附加到 OnScrollListener。当我到达列表的末尾时,我启动了一个 AsyncTask(如果有数据要加载)。

在 preExecute 中,我向页脚添加了一个视图(微调器)。在 doInBackground 中,我从 Internet 获取数据,在 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)
于 2012-10-11T15:29:38.840 回答
1

我知道它的回复迟了....但我最近才收到这个错误....我正在使用android-amazing-listview。我得到同样的错误结束

(class android.widget.HeaderViewListAdapter)]).

对我有用的解决方案是->

我认为这个问题源于这样一个事实,getAdapter即返回AmazingAdapter而不是包装HeaderListViewAdapter有时会导致计数差异。我只是从 AmazingListView 中删除了 getAdapter 方法,此后没有出现异常。

于 2014-02-25T12:10:55.410 回答