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

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


      这种错误告诉我们不能再非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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值