自定义相册时候的复选框☑️问题。

本文详细介绍了如何在Android应用中利用RecycleView实现相册功能,重点讲解了Checkbox在列表项中的正确使用方法,避免复用问题,并提供了删除选中图片的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的相册里是一个recycleView所以操作起来也很方便,我这里直接就粘贴条目布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:scaleType="centerCrop"
        android:layout_marginTop="30dp"
        android:layout_centerInParent="true"
        android:id="@+id/imagg"
        android:src="@mipmap/ic_launcher"
        android:layout_width="180dp"
        android:layout_height="180dp" />

    <CheckBox
        android:id="@+id/check_pic"
        android:button="@null"
        android:background="@drawable/chexpic"
        android:layout_alignRight="@+id/imagg"
        android:layout_marginRight="8dp"
        android:layout_marginTop="22dp"
        android:layout_width="30dp"
        android:layout_height="30dp" />
</RelativeLayout>

很重要的一点是,为了避免删除条目的时候checkbox不被复用,初始化的时候做一下操作

checkStates = new SparseArray<>();
for (int i = 0; i < mlist.size(); i++) {
    checkStates.put(i, false);
}

在点击删除的操作的时候

//点击删除图片
btn_delet.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        for (int i = 0; i < checkStates.size() ; i++) {
            if (checkStates.valueAt(i)){
                checkStates.delete(checkStates.keyAt(i));
                i -- ;
            }
        }
        if (delectOnclick != null){
            delectOnclick.setDelectclcik(mllists,fl_delect);
        }
        recycleAdapter.notifyDataSetChanged();
    }
});

然后在adapter中进行设置【记住这里面的条目个数必须用传过来的记录chex的集合】

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

然后在onBindViewHolder中加入

holder.check_pic.setChecked(cheStatues.valueAt(position));

然后设置监听

holder.check_pic.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        boolean isChecked;
        if (holder.check_pic.isChecked()){
            checked(BitmapFactory.decodeFile(alist.get(position)),position);
            isChecked = true;
        }else {
            cancleChecked(BitmapFactory.decodeFile(alist.get(position)),position,holder.check_pic);
            isChecked = false;
        }
        cheStatues.setValueAt(position, isChecked);
    }
});

然后点击删除

//点击删除
context.setDelectOnclick(new XiangCe.DelectOnclick() {
    @Override
    public void setDelectclcik(List<String> mllits,FrameLayout fl_delect) {
        //删除选择的sd卡中的图片
        delectpic(mllits);
        llist.clear();
            for (int i = 0; i < mllits.size(); i++) {
                alist.remove(Integer.parseInt(mllits.get(i)));
            }
            mllits.clear();
            fl_delect.setVisibility(View.GONE);
            notifyDataSetChanged();
        }
});

ok完美。

强调一下,必须用setOnClickListener,不要用 setOnCheckedChangeListener。因为button中的setCheck方法会默认调用setOnCheckedChangeListener,所以我们在这里做操作会出现问题,所以有俩种方式解决。

第一种:

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

//当按钮被按下时会触发此listener if(!buttonView.isPressed())

return;

}

第二种:

就是我们程序中的点击事件setOnClickListener。

欢迎来吐槽交流?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值