Android ListView中的Adapter, 抛出下面的错误:
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(-1, class com.ringcentral.android.utils.ui.widget.PullToRefresh$7) with Adapter(class android.widget.HeaderViewListAdapter)]
估计大家也会遇到过.按照翻译过来,就是在后台线程更新了Adapter的数据, 嗯,可以按照这样排除错误.但是,当我左看右看上看下看,怎么就找不出我在后台更新数据,纠结了几天之后,终于发现问题了:
我重写了ListView中的getAdapter方法,因为之前我在ListView中添加了一个Footer,然后在另外的地方想获取ListView的数据Adapter,但是,添加了Footer的ListView, getAdapter方法返回的是HeaderViewListAdapter类型的Adapter,此Adapter包装了真正了数据Adapter,所以我这样写想让getAdapter返回真正的数据Adapter:
public ListAdapter getAdapter() {
ListAdapter adapter = super.getAdapter();
if (adapter instanceof HeaderViewListAdapter) {
return ((HeaderViewListAdapter) adapter).getWrappedAdapter();
}
return adapter;
}
这样是能正常返回数据Adapter了,但是碰到的问题就是上面的问题.ListView内部会调用getAdapter方法返回数据.重写了getAdapter后获取到的数据就不是原来的数据了,所以才会出现这样的数据不同步的情况.
我的解决办法是,不重写getAdapter,想获取数据就直接使用Adapter中引用的数据.之前我是在onItemClick()中使用到了getAdapter获取数据.如果非得使用getAdapter获取数据,那...可以使用前面这个方法变通一下.