Android 更新ListView报 The content of the adapter has changed but ListView did not recive notification

最近在做项目,由于加载ListView的数据源比较大且耗时间,因此加载数据源的时候使用线程去加载在通过Handler方式去更新ListView,但是就遇到了如下的问题:

Android 更新ListView报 The content of the adapter has changed but ListView did not recive notification_第1张图片

      这种错误告诉我们不能再非UI线程中修改ListView的数据源,这样会导致当数据发生改变时,ListView没有及时得到通知。于是借鉴一些网上的案例,本人的解决方式如下:

       定义两个adapter的数据源list1、list2,其中list1是listview的数据源,而list2当做缓存,当我们去开线程去加载数据时,先将加载到的数据赋给list2缓存,然后在handler,AsyncTask中notifyDataSetChanged()时,在 将list2赋给list1。这样每次数据有改变时,都是list2先改变,而当我们在UI线程中更新listview时,在将list2赋给list1,然后在去刷新。

private Handler mHandler = new Handler()
    {
@Override
public void handleMessage(Message msg)
{
   super.handleMessage(msg);
   switch (msg.what)
   {

case 1:
updateNotify();// 数据通过缓存去更新UI
    break;
default:
   break;
   }
}
    };


private void updateNotify()
    {
list1.clear();//这是listview的数据源
list1.addAll(list2);//将list2缓存的数据赋给list1
adapter.notifyDataSetChanged();//最后在去更新UI
    }


另外也有网上的一些其他办法,但本人没有亲测过,大家可以试试。

(1)http://blog.csdn.net/fengyuzhengfan/article/details/39450977

(2)http://www.myexception.cn/android/1824337.html

你可能感兴趣的:(Android)