美文网首页android技术
Android RecycleView notifyItemCh

Android RecycleView notifyItemCh

作者: 没有了遇见 | 来源:发表于2021-12-21 13:02 被阅读0次

    在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);
            }
        }
    
    
    

    总结:

    刷新的闪烁问题导致原因很多,要具体问题具体分析,去除动画比较方便简单适合一部分需求,当去除动画以及设置不刷新还不生效的时候可以考虑单条局部刷新的逻辑

    留个赞再走吧,点击有惊喜!!!

    相关文章

      网友评论

        本文标题:Android RecycleView notifyItemCh

        本文链接:https://www.haomeiwen.com/subject/svotqrtx.html