1. 程式人生 > >自定義相簿時候的複選框☑️問題。

自定義相簿時候的複選框☑️問題。

我的相簿裡是一個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。

歡迎來吐槽交流?