在开发过程中,出现了一个The content of the adapter has changed的异常。
当从网络上读取了数据,并且更新了Adapter中的数据,但是,在后
台线程中并没有通知ListView对数据进行更新,就会出现了这个异常。
- 在ListView的layoutChildren()方法里有如下一段方法:
// Handle the empty set by removing all views that are visible
// and calling it a day
if (mItemCount == 0) {
resetList();
invokeOnItemScrollListener();
return;
} else if (mItemCount != mAdapter.getCount()) {
throw new 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(" + getId() + ", " + getClass()
+ ") with Adapter(" + mAdapter.getClass() + ")]");
}
即,当ListView缓存的数据Count和ListView中Adapter.getCount()不等时,会抛出该异常。
- 因此,当更新Adapter数据之后,必须立即通知ListView更新数据,数据更新和更新
ListView必须在UI线程中同步执行。