RecyclerView加载更多用notifyDataSetChanged()刷新图片闪烁

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

  • notifyItemChanged(int position) 更新列表position位置上的数据能够调用
  • notifyItemInserted(int position) 列表position位置添加一条数据时能够调用,伴有动画效果
  • notifyItemRemoved(int position) 列表position位置移除一条数据时调用,伴有动画效果
  • notifyItemMoved(int fromPosition, int toPosition) 列表fromPosition位置的数据移到toPosition位置时调用,伴有动画效果
  • notifyItemRangeChanged(int positionStart, int itemCount) 列表从positionStart位置到itemCount数量的列表项进行数据刷新
  • notifyItemRangeInserted(int positionStart, int itemCount) 列表从positionStart位置到itemCount数量的列表项批量添加数据时调用,伴有动画效果
  • notifyItemRangeRemoved(int positionStart, int itemCount) 列表从positionStart位置到itemCount数量的列表项批量删除数据时调用,伴有动画效果

 

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

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

解决方法:测试

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

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

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

 

我在项目中使用了:对象

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

  改进方法:图片

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

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

  很完美的解决了。

 

参考:1.RecyclerView实现瀑布流遇到的各类问题(item移动,加载更多图片闪烁,以及定制各类类型Header和Footer)

   2.RecyclerView之更新UI数据的高级用法

相关文章
相关标签/搜索