本篇文章主要实现两个功能:
1.在 RecyclerView 中使用 CheckBox 时,解决选中一个 CheckBox ,因为复用的关系,造成多个 CheckBox 被选中。
2.实现CheckBox全选功能及数据交互。
问题一:CheckBox重复显示问题:
1.使用bean类将setOnCheckedChangeListener的状态与bean类状态同步。
2.在每次设置checkbox是否选中的时候先把setOnCheckedChangeListener置为null。
代码示例:
首先新建一个bean类,bean类包含业务数据模型及CheckBox状态
public class CheckBoxTestBean {
private String name;
//是否选中状态
private boolean isSelectd;
public boolean isSelectd() {
return isSelectd;
}
public void setSelectd(boolean selectd) {
isSelectd = selectd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} }
在onBindViewHolder方法中设置CheckBox对应的bean状态
@Override
public void onBindViewHolder(@NonNull final ChecBoxHolder holder, final int position) {
if (mCheckBoxTestBeanList != null) {
holder.mTvName.setText(mCheckBoxTestBeanList.get(position).getName());
holder.mCbState.setOnCheckedChangeListener(null);
holder.mCbState.setChecked(mCheckBoxTestBeanList.get(position).isSelectd());
holder.mCbState.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
mCheckBoxTestBeanList.get(position).setSelectd(true);
} else {
mCheckBoxTestBeanList.get(position).setSelectd(false);
}
}
});
}
}
问题二:设置全选及获取全选数据
首先在Activity里编写全选的点击事件,然后循环业务数据bean模型,把bean里CheckBox状态全部设置为true,最后设置数据到适配器就可以完成全选。
mCbAllChoose.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
for (int i = 0; i < mCheckBoxTestBeanList.size(); i++) {
mCheckBoxTestBeanList.get(i).setSelectd(true);
}
} else {
for (int i = 0; i < mCheckBoxTestBeanList.size(); i++) {
mCheckBoxTestBeanList.get(i).setSelectd(false);
}
}
mChecBoxTestAdapter.setCheckBoxListData(mCheckBoxTestBeanList);
mRyTest1.setAdapter(mChecBoxTestAdapter);
}
});
点击确定, 获取选中的数据
mTvSure.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCheckBoxTestBeanList = mChecBoxTestAdapter.getCheckBoxTestBeanList();
if (mCheckBoxTestBeanList != null) {
int j = 0;
for (int i = 0; i < mCheckBoxTestBeanList.size(); i++) {
//当isSelectd状态为true时,为选中状态
if (mCheckBoxTestBeanList.get(i).isSelectd()) {
String mName = mCheckBoxTestBeanList.get(i).getName();
j++;
}
}
Toast.makeText(MainActivity.this, "选择了" + j + "个", Toast.LENGTH_SHORT).show();
}
}
});