<转载>RecyclerView的刷新方法
2017-10-27 23:43
471 查看
感谢原作者! 一只呆萌的萌呆
RecyclerView的刷新方法非常强大,不比以前僵硬的ListView的notify全部了.有必要熟练掌握、
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()); //进行列表全部刷新
很完美的解决了。
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()); //进行列表全部刷新
很完美的解决了。
相关文章推荐
- <android>RecyclerView列表局部刷新
- <转载>使CSS文字图片div元素居中方法之水平居中的几个方法
- XRecyclerView的刷新方法(自用,有瑕疵)
- <转载>SQL Server 数据库 执行命令(方法 2:带参数的 SQL 命令)
- <转载>在.NET中运行外部程序的3种方法
- <转载>使CSS文字图片div元素居中方法之水平居中的几个方法
- Recyclerview或Listview实时刷新,item点击事件失效的解决方法
- <Android 基础(三十五)> RecyclerView多类型Item的正确实现姿势
- <转载>Android通过onDraw实现在View中绘图操作
- <Android 基础(四)> RecyclerView
- <转载>CSS解决图片过大撑破DIV的方法
- <转载>DIV+CSS position定位方法总结
- <转载>DIV+CSS position定位方法总结
- SwipeRefreshLayout(下拉刷新)与RecyclerView之简单使用<一>
- [AS尝龟]导入RecyclerView后错误解决方法:Error:Execution failed for task ':app:processDebugManifest'. > Manifest
- <转载>提高 ASP.NET Web 应用性能的 24 种方法和技巧
- recyclerview的notifyDataSetChang不刷新问题(转载)
- <转载>C# Login窗口的实现方法
- <转载>在Win7下硬盘安装ubuntu9.10方法小结
- RecyclerView 调用notifyDataSetChanged()方法刷新后 自动滚动到顶部 问题解决办法