您的位置:首页 > 其它

<转载>RecyclerView的刷新方法

2017-10-27 23:43 471 查看
感谢原作者! 一只呆萌的萌呆

RecyclerView的刷新方法非常强大,不比以前僵硬的ListView的notify全部了.有必要熟练掌握、

首先来看看对比ListView看一下RecyclerView的Adapter主要增加了哪些方法:


1.notifyItemChanged(int position) 更新列表position位置上的数据可以调用

2.notifyItemInserted(int position) 列表position位置添加一条数据时可以调用,伴有动画效果

3.notifyItemRemoved(int position) 列表position位置移除一条数据时调用,伴有动画效果

4.notifyItemMoved(int fromPosition, int toPosition) 列表fromPosition位置的数据移到toPosition位置时调用,伴有动画效果

5.notifyItemRangeChanged(int positionStart, int itemCount) 列表从positionStart位置到itemCount数量的列表项进行数据刷新

6.notifyItemRangeInserted(int positionStart, int itemCount) 列表从positionStart位置到itemCount数量的列表项批量添加数据时调用,伴有动画效果

7.notifyItemRangeRemoved(int positionStart, int itemCount) 列表从positionStart位置到itemCount数量的列表项批量删除数据时调用,伴有动画效果

问题:加载更多用notifyDataSetChanged()刷新图片闪烁

原因:notifyDataSetChanged()会导致整个itemview刷新,已经测试:相同position刷新其itemview是不同的对象,例如,刷新后,position为12的用了position为13的itemview,再次刷新时,又用了position为10的itemview,这样次position上对应的itemview的ImageView就会在重设size时发生闪烁,此现象是可以用肉眼看到的。

解决方法:

用notifyItemRangeInserted()进行增加数据使用的局部刷新,这样原先的itemview就不会重绘

或者用notifyItemRangeChanged() 进行单纯的局部刷新

注意:虽然方法是用来局部刷新的,但我们可以把局部刷新变成全部刷新,itemCount设成list.size()就可以实现不闪烁的全部刷新了,但最好加上这一句((SimpleItemAnimator)imagesListView.getItemAnimator()).setSupportsChangeAnimations(false);取消RecyclerView的动画效果,不然刷新的话的确不会快闪但会有个动画效果,体验也是不怎么好的。

我在项目中使用了:

  项目场景: 加载网络图片 进行点击刷新 调用时习惯性调用notifyDataSetChanged() 然后出现闪烁情况,图片越多闪烁越严重.

  改进方法:

  1.先调用((SimpleItemAnimator)imagesListView.getItemAnimator()).setSupportsChangeAnimations(false); //取消RecyclerView的动画效果

  2.刷新列表使用了mAdapter.notifyItemRangeChanged(0,imageList.size()); //进行列表全部刷新

  很完美的解决了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: