在RecycleView notifyItemChanged(position) 刷新得时候部分情况下会出现图片闪烁问题,导致此问题出现的原因有几种,项目中出现了这个问题再次记录下集中解决思路供大家梳理
原因:
1.条件情况下执行了动画操作导致了刷新闪烁问题
2.图片重新加载导致了刷新问题
3:全局刷新导致Item数据重新填充刷新了Item
解决方案:
1.关闭动画效果
//关闭动画效果
SimpleItemAnimator sa=(SimpleItemAnimator )recycleView.getItemAnimator();
sa.setSupportsChangeAnimations(false);
//设置动画为空
setItemAnimator(null)
2.设置setHasFixedSize(true) 让RecyclView 不走重绘逻辑
源码原因.png
//设置为True 不走重绘逻辑
recycleView.setHasFixedSize(true)
3.做单条局部刷新 不刷新不必要的数据(这个最好使用)
方法说明
1.调用 notifyItemChanged() 传入payload 参数的时候执行局部刷新
mMediaAdapter.notifyItemChanged(position, "1")
2.在Adapter中实现三个参数的 onBindViewHolder()方法,带有payloads
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull List<Object> payloads) {
//判断是做局部刷新还是单条刷新
if (payloads != null && payloads.size() > 0 && "1".equals(payloads.get(0))) {
Log.e("", "");
MediaViewHolder mediaViewHolder = (MediaViewHolder) holder;
int temType = getItemViewType(position);
if (temType == MediaAdapter.TYPE_NORMAL) {
Media mMedia = getItem(position);
binding = (MediaImageItemBinding) mediaViewHolder.getBinding();
//单选
if (mOptions.singlePick || mOptions.isNeedCrop() || (mOptions.getSelectMode() == PickerConfig.PICKER_ONLY_ONE_TYPE && mMedia.mediaType == 3)) {
binding.checkImage.setVisibility(View.GONE);
} else {
binding.checkImage.setVisibility(View.VISIBLE);
binding.checkImage.setImageDrawable(mMedia.isSelect() ? ContextCompat.getDrawable(mContext, R.drawable.iv_media_checked) : ContextCompat.getDrawable(mContext, R.drawable.xc_weixuan));
}
}
} else {
//单挑刷新
super.onBindViewHolder(holder, position, payloads);
}
}
总结:
刷新的闪烁问题导致原因很多,要具体问题具体分析,去除动画比较方便简单适合一部分需求,当去除动画以及设置不刷新还不生效的时候可以考虑单条局部刷新的逻辑
网友评论