RecycView notifyItemRemoved(),notifyItemInserted(),局部刷新的坑。已解决

引言:在项目中经常使用RecycView,以往刷新数据的做法,notifyDataSetChanged,简单粗暴。并且不会有插入删除动画,为了更好的体验,一般会使用notifyItemRemoved(),notifyItemInserted() 自带动画效果,体验+,但是你会发现,删除错位,甚至数组下标越界。why??? !请看下文


一、先说解决方案:在调用notifyItemRemoved() 或notifyItemInserted()  ,记得调用

wAdapter.notifyItemRangeChanged(position,data.size);//position item下标,data.size 更细后的数据源大小

over,你现在的问题应该解决了。再来简单分析下为什么?

二、RecycView适配器在调用notifyDataSetChanged时, 会去调用requestLayout() ,重绘所有Item,但是调用notifiItemRemoved()/notifiItemInserted()时,则不会这样干,它仅会移除掉当前的数据,并且不会通知适配器,item的下标position已经发生了变化,换句话说就是其它item不知道某个item已经死翘翘了,他们还占在原来的位置上(position),这就导致了数据的错乱。调用notifyItemRangeChange() 就是告诉适配器,在某个范围内Item的位置已经发生了改变,通知item重新排队。

但是也请注意:notifyItemRangeChange() ,当你的数据过大时,他会造成性能影响甚至卡顿... 有些同学会说,那我范围传小一些比如10条,那恭喜你离bug又近了一步。假如是20条数据,你插入数据到第一条,你只更新10条  ,然后去点击10条以外的item时,对不起,10条以外的item不知道,刚刚发生了啥,也和它没关系.... 位置还是错乱。 目前解决也只能是传入所有ItemCount,尽量分页加载数据,不要一页加载过多!

以上是查看源码后的一些理解,源码很枯燥,故写的大众了些,方便理解,若有不对的地方,也请大佬指教!

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值