问题解决——关于RecyclerView在执行notifyDataSetChanged()出现加载混乱的问题

本来没有写博客的习惯,但是这个问题困扰了我很久,网上也找了很多方法,但是都没有完美的解决,今天偶然发现了问题的所在,所以写出来分享一下,希望对后面遇到这种问题的朋友有所帮助~

嗯,以后应该也不要那么懒,多写一些才对...

先说下我的情况,最近的需求是做一个类似朋友圈的东西,做完之后,在上拉加载新的动态时候,新加载的动态会被上一个动态影响,比如新加载的动态其实是没有图片的,但是如果它之前的一个有,那么新加载的一个也会有图片,跟之前的那个一模一样,不管是图片数目还是内容,删除动态的时候也会出现类似的情况。毋庸置疑,这肯定是复用造成的问题,但是刚开始无从下手,真的郁闷...

不知道大家有没有注意到,一般只有在有很多item的时候,比如网络请求获取数据,需要进行上拉刷新或者下拉加载的时候调用notifyDataSetChanged()才会出现加载数据混乱的情况,单纯的加载一些死数据的时候,我并没有遇到过这种情况。开始的时候我也是一点头绪没有,在网上找了各种方法,下面我把解决过程说一下,毕竟这些方法对我没用,但是可能对其他情况有效也说不定:

0、废多看崩!我的解决方案就是,Adapter中的逻辑,有if尽量加else,当然这个不绝对,也可能有例外情况。下面的内容是解决过程中的探索,换句话说就是,废话,如果有兴趣您可以稍微看看...

1、viewHolder.setIsRecyclable(false);简单粗暴的方法,不复用RecyclerView,调用。这基本能干掉大部分混乱的问题,但是对于少数数据的加载还没太大影响,如果数据很多就会比较卡了,而且基本我们能遇到加载混乱的问题,都是伴有大量数据的,所以...

2、mAdapter.setHasStableIds(true);顾名思义,就是为item设置固定的ID,我用这个方法时,下拉刷新后,直接不加载新的数据了,哭...

3、mRecyclerView.setAdapter(mAdapter);看完这个之后,你是不是会奇怪,这不是最开始的时候为RecyclerView添加适配器吗?不错,不过这个是放在获取了新增数据之后再调用一次,用完这个之后,新的数据可以正常加载了,也没出现混乱的情况,如果我们进行的是下拉刷新,那没问题,但是!如果我们进行的是上拉加载,不管你在何处进行了上拉,页面都会跳回到第一个item处!坑爹!这个原理应该是类似重新加载了下RecyclerView,而且Log也会报错,只不过我这边不会出现程序崩溃的情况。

4、这一条是我看到第三条的情况下想到的:

mList.addAll(_list);
lastPosition = layoutManager.findFirstVisibleItemPosition();  
mAdapter = new MyViewAdapter(mContext, mList);
setOnclick();    
mAdapter.setCircleInfo(ownerId, circleId);
mRecyclerView.setAdapter(mAdapter);
if (currentPage != 1) {
    if (mList.size() - 1 >= lastPosition) {
        mRecyclerView.scrollToPosition(lastPosition);
    }
}

基本原理也是重新加载,只不过重新加载之前我会先获取当前能看到的第一个item的position,重新加载之后再直接跳转到这个位置。这样看似是很OK,但是每次都重新加载肯定会造成资源浪费,而且当前能看到的第一个item的position很难正好就跟屏幕对其,所以跳转的时候,会造成屏幕向上或者下跳转一点距离,体验不好。

5、最后,是我的完美解决方案。其实我一直在想,这个情况会不会是个系统bug?但是如果是,这么久肯定有人反馈,也肯定修复了,所以我就想是不是我这边出问题了,毕竟如果需要其他毕竟偏的方式来解决混乱的问题,这是不合理的。于是我就重新想了想,我这里混乱的情况主要是出现在图片加载,其他地方基本都是正常的,查看了adapter中图片加载的代码,发现在设置图片的VISIBLE和GONE的时候,没有成对出现,即有图片的时候是VISIBLE,没有图片的位置也应该设置为GONE,修改了之后,再试一下,果然没问题了!到最后,其实还是自己的问题,哈哈...(尴尬)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值