解决RecycleView中ViewHolder复用导致图片信息错乱的现象

方法1:使用setTag进行对图片进行标记

public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
        final Note note=notes.get(position);
        final String url=notes.get(position).getPhotoFilePath();
        viewHolder.ivPhoto.setTag(url);     //对ImageView进行标记

        viewHolder.tvId.setText(note.getId() + "");
        viewHolder.tvTitle.setText(note.getTitle());
        viewHolder.tvContent.setText(note.getContent());
        viewHolder.tvTime.setText(note.getTime());
        if (mEditMode == MYLIVE_MODE_CHECK) {
            viewHolder.ivChoiceBox.setVisibility(View.GONE);
        } else {
            viewHolder.ivChoiceBox.setVisibility(View.VISIBLE);

            if (note.getIsChoice()==1) {
                viewHolder.ivChoiceBox.setImageResource(R.drawable.ic_choice);
            } else {
                viewHolder.ivChoiceBox.setImageResource(R.drawable.ic_not_choice);
            }
        }

        final Handler handler = new Handler(){

            public void handleMessage(Message msg){
                switch (msg.what){
                    case 1:
                        //Log.i("TAG","handle message");
                        //从缓存中取出
                        //String photoPath=notes.get(position).getPhotoFilePath();
                        if(note.getPhotoFilePath()!=null){
                            String Classname=note.getClassName();
                            String compressFilePath=note.getPhotoFilePath().replaceAll(Classname,"Compress"+Classname);
                            if(compressFilePath!=null){
                                Bitmap bitmap;
                                bitmap=getBitmapFromMemoryCache(compressFilePath);
                                if(bitmap!=null){
                                    if(url.equals(viewHolder.ivPhoto.getTag())){    //判断标记是否相同
                                        viewHolder.ivPhoto.setImageBitmap(bitmap);
                                        Log.d("是否是从缓存中获取",position+" "+"是");
                                    }
                                }else{
                                    if(url.equals(viewHolder.ivPhoto.getTag())){
                                        bitmap=getBitmap(compressFilePath);
                                        viewHolder.ivPhoto.setImageBitmap(bitmap);
                                        Log.d("是否是从缓存中获取",position+" "+"不是");
                                    }
                                }
                            }else{
                                viewHolder.ivPhoto.setVisibility(View.GONE);
                            }
                        }
                }
            }
        };

方法2:在活动中获取RecycleView实例后,使用

recycleView.setItemViewCacheSize(int); //设置缓存viewholder的个数,防止图片错乱

这里是借鉴:https://blog.csdn.net/MeloDev/article/details/76691951
这位老哥的

如果上面两种方法都解决不了,就只能使用方法3:
方法3:两者综合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RecyclerView复用机制是为了优化性能而设计的,它会复用已经创建的 View,来减少创建新 View 的次数,从而提高滑动的流畅度。在 RecyclerView ,每当一个 item 滑出屏幕时,其对应的 View 会被回收,并放入到一个 ViewPool ,以供后续使用。在需要新的 item 时,先从 ViewPool 获取一个可用的 View,然后通过 onBindViewHolder() 方法将数据绑定到这个 View 上。 但是,这个复用机制也会带来一些问题,比如当 item 的布局和内容变化很大时,可能会出现数据重叠、错乱的问题。这是因为 RecyclerView复用 View 的过程,没有清空之前 View 的状态,导致新的数据与之前的数据混合在一起。 为了解决这个问题,可以采用以下两种方法: 1. 在 onBindViewHolder() 方法,清空之前 View 的状态。这样可以确保每次绑定新数据时,View 的状态都是干净的。比如,可以将需要清空的状态设置为默认值,或者使用 View.setTag() 方法保存状态,在下次使用时再根据 Tag 进行清空。 2. 使用不同的 ViewType。如果 item 的布局和内容变化很大,可以根据数据的类型,设置不同的 ViewType。这样就可以确保每个 View 只会被用于一种类型的数据,避免数据重叠、错乱的问题。在 onCreateViewHolder() 方法,可以根据 ViewType 创建不同的 View。 总之,复用机制是 RecyclerView 的重要特性,可以优化滑动的性能。但是在使用时,需要注意清空之前 View 的状态,或者使用不同的 ViewType 来避免数据重叠、错乱的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值