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

上記の2つの方法を解決できない場合は、方法3:
方法3:2つを組み合わせるしか使用できません

おすすめ

転載: blog.csdn.net/qq_41915623/article/details/102502837