1.调用notifyItem**方法导致闪烁:
- 方法一
((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
- 方法二
recyclerView.getItemAnimator().setChangeDuration(0);
原因
由于Recycleview调用方法notifyItem**的时候会执行默认的动画导致的。
2.调用notifyDataSetChanged方法导致闪烁
-
解决方法:
notifyDataSetChanged + setHasStableIds(true) + 复写getItemId() 方法 -
原因:
notifyDataSetChanged 导致图片闪烁的真凶 是itemView 重新测量布局导致的,并非createViewHolder 。
3.禁止Recyclerview滑动
重写布局管理器的canScrollVertically方法
RecyclerView.LayoutManager layoutManager = new GridLayoutManager(mActivity, spanCount) {
@Override
public boolean canScrollVertically() {
return false;
}
};
4.为RecyclerView添加头部
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
System.out.println("gridManager.getSpanCount() = " + layoutManager.getSpanCount());
return mAdapter.getItemViewType(position) == TYPE_HEADER
? layoutManager.getSpanCount() : 1;
}
});
5.避免过度刷新使用DiffUtil工具代替notifyDataSetChanged
DiffUtil.DiffResult diffResult =
DiffUtil.calculateDiff(new DiffCallBack(mData, newData), true);
diffResult.dispatchUpdatesTo(this);