解决使用RecycleView长按显示多选按钮格式混乱问题

问题描述
使用RecycleView实现长按删除功能时,当长按某个Item之后,将全局变量mIsCheckBoxShow设为View.VISIBLE,并调用adapter的notifyDataSetChanged()方法,但是有的Item的checkBox能够显示,有的没有显示,格式混乱。
RecycleView格式混乱图片


原因:

暂时不太清楚。。。

解决方案

重新设置checkBoxVisibility属性。
其他的样式混乱应该也可以这么解决,在OnBindViewHolder中重新设置组件的属性。

public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
    
    
        ...
        // 防止显示错乱
        holder.mCheckBox.setVisibility(mIsCheckBoxShow);
}

Adapter和Entity部分的代码如下:

public class PictureEntity {
    
    
    // 文件路径 这个也多余
    String mFilePath;
    // 文件的bitmap,显示用,有点多余
    Bitmap mBitmap;
    // 文件,主要用来获取图片的详细信息的
    File mFile;
}
public class MyRecycleViewAdapter extends RecyclerView.Adapter<MyRecycleViewAdapter.ViewHolder> {
    
    
    public static ArrayList<PictureEntity> mPictureEntities = new ArrayList<>();
    static ArrayList<Integer> sSelectedImage = new ArrayList<>();
    Context mContext;
    // 图片下面的checkbox的可见性。某个Item长按之后,这个值会被修改为View.VISIBLE
    static int mIsCheckBoxShow = View.GONE;

	// 构造方法传入Context,有用
    public MyRecycleViewAdapter(ArrayList<PictureEntity> pictureEntities, Context context) {
    
    
        mPictureEntities = pictureEntities;
        mContext = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
    
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
    
    
        PictureEntity bitmap = mPictureEntities.get(position);
        holder.mImageView.setImageBitmap(bitmap.mBitmap);
        // 防止显示错乱
        holder.mCheckBox.setVisibility(mIsCheckBoxShow);
        // imageView的点击事件
        holder.mImageView.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                Intent intent = new Intent(mContext, DetailActivity.class);
                intent.putExtra("position", position);
                mContext.startActivity(intent);
            }
        });
        // imageView的长按事件
        holder.mImageView.setOnLongClickListener(new View.OnLongClickListener() {
    
    
            @Override
            public boolean onLongClick(View v) {
    
    
                // 修改mIsCheckBoxShow的值为View.VISIBLE,
                // 所有的chebox都将可见
                mIsCheckBoxShow = View.VISIBLE;
                // notifyDataSetChanged
                notifyDataSetChanged();
                // 消费掉此事件
                return true;
            }
        });
    }


    @Override
    public int getItemCount() {
    
    
        return mPictureEntities.size();
    }


    static class ViewHolder extends RecyclerView.ViewHolder {
    
    
        // 图片
        ImageView mImageView;
        // 图片下面的checkbox
        CheckBox mCheckBox;

        public ViewHolder(View view) {
    
    
            super(view);
            mCheckBox = view.findViewById(R.id.delete_check_box);
            mImageView = view.findViewById(R.id.image_view);
            mCheckBox.setVisibility(mIsCheckBoxShow);
        }
    }
}

参考:RecyclerView使用之——数据刷新混乱及解决方案

猜你喜欢

转载自blog.csdn.net/qq_41359651/article/details/119392762
今日推荐