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

来源:互联网 发布:淘宝如何取消超级推广 编辑:程序博客网 时间:2024/06/05 09:29

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();  }});

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

代码点这里

0 0
原创粉丝点击