欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

RecycleView的notifyItemRemoved使用注意

程序员文章站 2023-03-31 16:16:34
转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10116095.html 我们为了移除RecycleView的某一项,会用RecycleView的notifyItemRemoved(int position)方法,但是需要注意的是:1、用该方法之后并不会 ......

转载请标明出处,维权必究:https://www.cnblogs.com/tangzh/p/10116095.html

我们为了移除recycleview的某一项,会用recycleview的notifyitemremoved(int position)方法,但是需要注意的是:
1、用该方法之后并不会刷新item,也就是说不会重新bind数据,那么position也就没有刷新,每个item对应的position还是原来的那个,那就会有问题,比如现在只剩下3个item,而我们点击删除最后一个item的时候,它的position是原来的position4,那么实际上就是调用recycleview的notifyitemremoved(4),就会出现越界。

 

那我们该怎么做呢?
1、删除之后重新:notifydatasetchanged();,但是这样就没有删除动画。

 

2、使用notifyitemrangechanged(int positionstart, int itemcount)

这个方法,是通知所有观察者: 从positinstart开始的itemcount这些个item已经改变了,与notifyitemrangechanged(position, itemcount, null)等价

positionstart : 是从界面哪个位置的item开始变化,比如你点击界面上的第二个itemview positionstart是1
itemcount : 是已经发生变化的item的个数(包括自己,即正在点击这个),比如,你点击界面上的第二个itemview,position [1,9] 发生变化,共计9个,因此我们计算是list.size() - position 
此时使用:
notifyitemremoved(position);
notifyitemrangechanged(position, mlist.size() - position);
 
注意如果有headview的话还需要将position加上对应的headview数目,比如有一个headview,那么就需要:
notifyitemremoved(position + 1);
notifyitemrangechanged(position + 1, mlist.size() - position);