关于CheckBox全选以及反选还有单选,多选的逻辑实现

时间:2021-12-04 09:35:47

关于CheckBox全选以及反选还有单选,多选的逻辑实现

首先看下最终的实现效果:

关于CheckBox全选以及反选还有单选,多选的逻辑实现

转载请注明出处:http://blog.csdn.net/u010724819/article/details/53428060

首先,我们来实现CheckBox的选中,这里首先要给CheckBox设置下:

android:descendantFocusability="blocksDescendants"
官方的解释:

关于CheckBox全选以及反选还有单选,多选的逻辑实现

翻译过来就是:

        beforeDescendants:viewgroup会优先其子类控件而获取到焦点

        afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点

        blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点


紧接着我们就可以来做CheckBox的点选操作:

 public View getView(final int position, View convertView, ViewGroup group) {
MyCheckboxBean bean = arr.get(position);
ViewHolder viewHolder;
if(convertView == null){
convertView = mInflater.inflate(R.layout.item_lv_layout,null);
viewHolder = new ViewHolder();
viewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
viewHolder.tv_amount = (TextView) convertView.findViewById(R.id.tv_amount);
viewHolder.chb_manual = (CheckBox) convertView.findViewById(R.id.chb_manual);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
final int tempPosition = position;
viewHolder.chb_manual.setChecked(bean.isByMeChecked());
}
这样我们的CheckBox标记其实是写在了相应的JavaBean字段中:


public class MyCheckboxBean {
private String name;
private boolean byMeChecked;

public MyCheckboxBean(String name,boolean byMeChecked){
this.name = name;
this.byMeChecked = byMeChecked;
}
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public boolean isByMeChecked() {
return byMeChecked;
}

public void setByMeChecked(boolean byMeChecked) {
this.byMeChecked = byMeChecked;
}
}


这样的话,我们就基本完成了CheckBox的点选操作。

下面我们来实现ListView的item的点选操作来更改CheckBox的状态:

 binding.lvManualCheck.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> view, View view1, int i, long l) {
arr.get(i).setByMeChecked(!arr.get(i).isByMeChecked());
adapter.notifyDataSetChanged();
}
});

这样就可以啦。

下面我们来考虑全选的问题:

首先在这里,我们要明确全选的情况就是,所有的子item都被选中,反选也是同理的:

那么我们就可以在初始化Adapter的时候传入头部CheckBox的对象,

  public MyCheckboxAdapter( Context mContext,ArrayList<MyCheckboxBean> arr,CheckBox chb_all_check) {
this.mContext = mContext;
mInflater=LayoutInflater.from(mContext);
this.chb_all_check = chb_all_check;
this.arr = arr;
}

然后,我们在CheckBox的Adapter中getView的时候进行判断:

在每次用户点选子item的CheckBox(包含点击ListView的时候利用set方法的时候所以这里使用OnCheckChangeListener)的时候来进行相应,所以来增加监听:

        viewHolder.chb_manual.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
arr.get(tempPosition).setByMeChecked(isChecked);
//如果全选,则将头布局的checkbox选中,反之同理
int j = 0;
for (int i = 0; i < arr.size(); i++) {
if (arr.get(i).isByMeChecked()) {
j++;
}
}
//CommonUtil.showToast(mContext,j+"");
if (j == arr.size()) {
chb_all_check.setChecked(true);
// Intent intent = new Intent(mActivity, LoginActivity.class);
// // intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// mContext.startActivity(intent);
} else {
chb_all_check.setChecked(false);
}

}
});
这样就可以啦^_^/


但是同时我们也需要对全选CheckBox的状态进行监听(实现全选以及反选):

        //顶部Checkbox的监听
binding.manualChec.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (binding.manualChec.isChecked()) {
// MyApplicationUtil.putCheckMap(true);

for (int i = 0; i < arr.size(); i++) {
if (!arr.get(i).isByMeChecked()) {
arr.get(i).setByMeChecked(true);
adapter.notifyDataSetChanged();
}
}
} else {
// MyApplicationUtil.putCheckMap(false);
for (int i = 0; i < arr.size(); i++) {
if (arr.get(i).isByMeChecked()) {
arr.get(i).setByMeChecked(false);
adapter.notifyDataSetChanged();
}
}
}
}
});

这里的最后一个问题来了,有个需求就是:”在用户全选的时候,我们进行页面跳转,或者发送POST请求“,这里就要求我们对于全选时间进行监听啦,开始我一直使用的是setOnCheckListener,导致每次代码取消全选和反选的时候会造成选择冲突,之后使用了setOnCheckChangeListener完美地解决了这个问题:

//全选以及全部反选状态的操作
binding.manualChec.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
Toast.makeText(MainActivity.this,"全选啦",Toast.LENGTH_SHORT).show();
}
}
});

源码地址:https://github.com/yeluowuhen502/CheckBoxTest 点击打开链接