1.ListView和RecyclerView的adapter在刷新上方法的不同:
- notifyItemChanged(int position) 更新列表position位置上的数据
- notifyItemInserted(int position)列表position位置添加一条数据,有动画效果
- notifyItemRemoved(int position)列表position位置移除一条数据,有动画效果
- notifyItemMoved(int from,int to)列表from位置的数据移动到to位置
- notifyItemRangeChanged(int start,int count)列表从start开始,count个数数据进行刷新
- notifyItemRangeInserted(int start,int count)列表从start开始,添加数量count个数据,有动画效果
- notifyItemRangeRemoved(int start,int count)列表从start开始,移除数量count个数据,有动画效果
2.本次问题:recyclerView使用notifyDataSetChanged()刷新时出现图片闪烁
原因:notifyDataSetChanged()会导致整个itemView刷新,已经测试:相同position刷新其itemView是不同的对象,
例如,刷新后,position为12的用了position为13的itemView,再次刷新时,又用了position为10的itemView,这样每次position
上对应的itemview的imageView就会在重设size时发生闪烁,
解决方法:
用notifyItemRangeInserted()进行增加数据使用的局部刷新,这样原先的itemView就不会重绘
或者用notifyItemRangeChanged()进行单纯的局部刷新
注意:虽然方法是用来局部刷新的,但我们可以把局部刷新变成全部刷新,itemcount设置成list.size()就可以实现不闪烁的全部
刷新了,但最好加上一句
((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
这句话会取消recyclerview的动画效果,不然刷新的话的确不会快闪但会有个动画效果,体验也是不好的.
最后解决:
1.recyclerView调用方法取消动画效果
((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
2.刷新列表使用
adapter.notifyItemRangeChanged(0,list.size()) 进行全部刷新