解决使用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使用之——数据刷新混乱及解决方案

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值