异步加载Listview The content of the adapter has changed but ListView did not receive a notification

错误

The content of the adapter has changed but ListView did not receive a notification

原因

在Android开发过程中,使用了大量的ListView,发现这个错误偶尔会出现。特别是做压力测试的时候,不停的点击刷新,更容易出现这个错误。代码中已经使用了Adapter的notifyDataSetChanged()方法通知UI更新了,但是还是会出现这个错误。究其根本原因,还是线程之间同步的问题。比如,线程1更新了Adapter中的内容,却还没有来得及通知内容已经更新,就又有线程2更新了Adapter中的内容,这个时候如果线程1再通知内容更新,就会出现上述异常了

解决方法

ListView的滚动有三种状态
第一是静止状态,SCROLL_STATE_IDLE
第二是手指滚动状态,SCROLL_STATE_TOUCH_SCROLL
第三是手指不动了,但是屏幕还在滚动状态。SCROLL_STATE_FLING

在静止状态 进行adapter 更新即可

示例代码如下:

class ListOnScrollListener implements AbsListView.OnScrollListener {

        private int visibleLastIndex;
        private LegworkAdapter adapter;
        private RTPullListView listView;
        private View footer;

        public ListOnScrollListener(LegworkAdapter adapter, RTPullListView listView, View footer) {
            this.adapter = adapter;
            this.listView = listView;
            this.footer = footer;

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                             int visibleItemCount, int totalItemCount) {
            visibleLastIndex = firstVisibleItem + visibleItemCount - 1;
			/* 如果滚动到最后一条 */
        }

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            if (adapter != null) {
                int itemsLastIndex = adapter.getCount(); // 数据集最后一项的索引
                if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && visibleLastIndex == itemsLastIndex) {
                    //静止状态在进行adapter更新 否则异常退出
                    adapter.notifyDataSetChanged();
                    if (page < totalpage) {
                        listView.addFooterView(footer);
                        page = page + 1;
                        flag = true;
                        SharedPreferenceUtils sharedPreferenceUtils = new SharedPreferenceUtils(LegworkActivity.this);
                        String subUrl = sharedPreferenceUtils.getString(SharedPreferEnum.SUB_URL.name());
                        int empId = sharedPreferenceUtils.getInt(SharedPreferEnum.EMP_ID.name());
                        new Task().execute(subUrl, String.valueOf(empId), String.valueOf(page), String.valueOf(Constant.PAGE_SIZE));
                    }
                }
            }
        }
    }



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值