Android CheckBox实现多选、全选、反选功能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Luck_Nie/article/details/72026312

CheckBox实现多选、全选、反选功能

前不久项目中用到了多选列表功能,在这里讲述一下实现思路以及需要注意的地方, 不足之处,敬请谅解!


实现多选功能列表一般可以用ListView 或RecyclerView嵌套CheckBox实现,这里用的是ListView。

废话不多,先上图
这里写图片描述

先说一下多选实现思路

首先需要一个Map集合用于存储每一个条目的选中状态。选中哪个条目,则把该条目的位置添加进集合,并设置key为true,删除则设置Map集合中对应的位置的key为false。最后提交的时候,遍历map集合,即可得到所有选中的条目。

全选、反选功能实现思路比较简单

全选是把Map集合中的key全部设置为true即可,而反选则需要遍历Map集合,判断每个key的状态并设置为相反的状态。

下面直接上代码

XML布局文件

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:id="@+id/multi_btn_all"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="全选" />

        <Button
            android:id="@+id/multi_btn_opposite"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="反选" />

        <Button
            android:id="@+id/multi_btn_submit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="提交" />
    </LinearLayout>

    <ListView
        android:id="@+id/multi_lv_listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </ListView>
</LinearLayout>

MultiSelectActivity

创建集合存放数据

//用于存储条目数据
 private List<String> list = new ArrayList<>();
//用户存储条目的选择状态
 private Map<Integer, Boolean> isCheck = new HashMap<>();
 //用于存放已选择的条目
 private List<Integer> selectList = new ArrayList<>();

初始化数据

for (int i = 0; i < 100; i++) {
  //给集合中设置50条数据
  list.add("设置第" + i + "条数据");
  //初始化所有条目为未选中状态
  isCheck.put(i, false);
}

给条目设置数据

//设置数据
if (multiSelectAdapter == null) {
  multiSelectAdapter = new MultiSelectAdapter(list, isCheck, MultiSelectActivity.this);
  listView.setAdapter(multiSelectAdapter);
} else {
  multiSelectAdapter.notifyDataSetChanged();
}

接下来看一下适配器 MultiSelectAdapter.class

首先通过构造函数设置数据

public Map<Integer,Boolean> isCheck ;
private List<String> list;
private Context context;

//通过构造函数获取数据
public MultiSelectAdapter(List<String> list,Map<Integer,Boolean> isCheck, Context context) {
  this.list = list;
  this.context = context;
  this.isCheck = isCheck;
}

设置条目checkBox 的点击事件

viewHolder.mCheckBox.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      if (isCheck.get(position)) {
        //如果取消,则设置map集合中为false
        viewHolder.mCheckBox.setChecked(false);
        isCheck.put(position,false);
      } else {
        //如果选中,则设置map集合中为true
        viewHolder.mCheckBox.setChecked(true);
        isCheck.put(position,true);
      }
    }
  });

注意!!!

注意!!!

注意!!!

在getView 方法返回view之前一定要给CheckBox设置中状态,否则在复用的时候会出现状态错乱

 //给CheckBox设置状态
viewHolder.mCheckBox.setChecked(isCheck.get(position));
return convertView;

接下来看一下全选及反选功能的实现 MultiSelectActivity

全选功能实现

 //全选
selectAll.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    for (int i = 0; i < list.size(); i++) {
      //把集合中所有的选项设置为true,刷新布局
      isCheck.put(i, true);
    }
    //刷新布局
    initData();
  }
});

反选功能实现

//反选
selectOpposite.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    //遍历map集合,设置反选
    for (int key : isCheck.keySet()) {
      if(isCheck.get(key)){
        isCheck.put(key,false);
      }else{
        isCheck.put(key,true);
      }
    }
    //刷新布局
    initData();
  }
});

最后提交

 //提交
submit.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    //清除之前选择的数据
    selectList.clear();
    //遍历map集合
    for (int key : isCheck.keySet()) {
      //判断是否已选择,如果已选择,则添加进selectList
      if(isCheck.get(key)){
        selectList.add(key);
      }
    }

    Toast.makeText(MultiSelectActivity.this,selectList.toString(),Toast.LENGTH_SHORT).show();
  }
});

以上就是简单实现多选列表,全选、反选功能的过程,仅供参考,如有错误之处,还请指正!

代码点这里

猜你喜欢

转载自blog.csdn.net/Luck_Nie/article/details/72026312