引言:在项目中经常使用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,尽量分页加载数据,不要一页加载过多!
以上是查看源码后的一些理解,源码很枯燥,故写的大众了些,方便理解,若有不对的地方,也请大佬指教!