RecycleView的notifyItemRemoved使用注意

转载请标明出处,维权必究:http://77blogs.com/?p=483

我们为了移除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);
 

 

支持scrollTo的RecycleView

文章链接:http://77blogs.com/?p=556

RecycleView内部没有帮我们实现ScrollTo的方法,不过帮我们实现了ScrollBy,我们可以通过ScrollBy自定义一个支持scrollTo的RecycleView。


 

 

Scrapped or attached views may not be recycled

在使用recycleView的时候出现了错误Scrapped or attached views may not be recycled

原因:

view没有被recycled,recyclerView的数据进行清空操作之后,在重新添加数据之前忘记了通知界面进行重新绘制,所以崩溃。
解决方法只要在clear数据之后代码中记得加notifyDataSetChanged() 即可。

 

参考链接:https://blog.csdn.net/u013106366/article/details/54024113

还发现一种情况是在上拉加载更多或者下拉刷新之后忘记使控件重置了。要记得上拉或者下拉之后加上代码:


 

转载请标明:http://77blogs.com/?p=567

RecycleView设置顶部分割线(记录一个坑)

大家都知道,想给RecycleView设置分割线可以重写RecyclerView.ItemDecoration

项目过程中,遇到一个需求:RecycleView顶部有一条灰色的间隔,我想到了给RecycleView设置分割线的方法,当然只给第一个Item设置,而且在上方。

 

在onDrawOver方法中可以绘制分割线。

这里有一个需要注意的坑,调试了很久,最终才发现,难受。

在onDrawOver里面,一开始我设置top = 0;因为绘制在顶部嘛。结果出现了一个现象,顶部分割线一直停留在顶部,不会跟着移动。最后改为int top = child.getTop() – params.topMargin – mDivider.getIntrinsicHeight();才成功了。为什么呢?

因为直接写top = 0;这是绝对位置了,要让分割线也跟着滑动,需要用的是相对位置,相对于item的位置,这样才能够跟着item滑动

 

调用

recyclerView.addItemDecoration(new MyDividerItemDecoration(this, R.drawable.item_decoration));

item_decoration代码如下:


 

或者我们可以直接代码中创建Drawable,然后传进去:


 

尊重劳动成果,转载请标明出处:http://77blogs.com/?p=569