异常: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.
解决办法分析:
既然与listView绑定了的list发生了变化而没来得及通知listView导致了上述的异常,那我们就针对这一点,只要listView与list绑定后,在listView显示之前不要让list发现变化就行了。做法有很多种,我个人的做法是这样子的:
首先,定义一个独立的List:
private List<Map<String,Object>> data = null;
接着,在onCreate中初始化它(当然,你也可以在每次用到它的时候初始化它,不过这样子会初始化很多歌对象,浪费内存,不推荐):
data = new ArrayList<Map<String,Object>>();
然后,在创建adapter之前,把list中数据放入到集合data中,注意千万不要直接赋值:data = list(这是错误的,因为这样data也指向了list所在的内存地址,即data跟list是同一个对象,list改变的话data也跟着改变);应该这么做:
data.clear();//要先清空data中的数据,避免把list中的数据重复放入data中。
data.addAll(list);//这样做,list中的数据就放入到data中,之后list在后台线程中改变,但data不会改变,这时,你再
SimpleAdapter adapter = new SimpleAdapter(LocalActivity.this,data,R.layout.local_music_list,new String[] {"local_name","local_size"}, new int[]{R.id.local_name,R.id.local_size});
listView与data绑定,就不会发生上述异常了!
几句重要源码:
1、第一步代码:
private void initData() {
storeInfoList = new ArrayList<StoreSimpleInfoEntity>(); // 实例化对象
sendRequestGetNearShop(flag, firstPage); // 异步请求数据
myAdapter = new StoreInfoAdapter3(NearByStoreActivity.this,storeInfoList); // 初始化适配器
curNewStoreList.setAdapter(myAdapter);
curNewStoreList.setPullLoadEnable(true);
curNewStoreList.setXListViewListener(this);
curNewStoreList.setOnItemClickListener(this);
}
2、第二步代码:
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case SUCCESS:
storeInfoList.addAll(storeInfo); // 数据成功返回后将返回数据添加到定义好的storeInfoList中
refreshAdapter(storeInfoList);
onLoad();
break;
case FAIL:
break;
case CLOSE:
break;
}
};
};
3、第三步代码:
/**
*
* @Title: refreshAdapter
* @Description:刷新myAdapter适配器
* @param
* @return
* @exception
* 2013-11-14 下午3:40:13
*/
private void refreshAdapter(final List<StoreSimpleInfoEntity> items) {
runOnUiThread(new Runnable() {
public void run() {
myAdapter.refreshAdapter(items);
}
});
}
4、第四步:
适配器中的代码:
/*
* 提供适配器刷新方法
*/
public synchronized void refreshAdapter(List<StoreSimpleInfoEntity> items) {
list = items;
notifyDataSetChanged();
}
就这几步。
写代码时,认真检查代码逻辑。