我将解释我的实际问题。如果需要,我还会附上一些代码。
场景是这样的:我创建了一个 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)