Android 中ListView带复选框多选、全选、不选处理
来源:互联网 发布:淘宝天猫商城转让 编辑:程序博客网 时间:2024/05/20 02:51
转载请注明出处:http://blog.csdn.net/android_koukou/article/details/54290010
工作快一年了,最近用到ListView带复选框功能,虽然已经做过多次了,但对一些初学者还是有一定的困难,在这里顺便总结一下,供大家参考!!!同时希望大家提出意见!!!!
废话不多说,先看效果
效果一:点击全选,所有复选框选中; 或每个item分别点击选中会触发全选框选中;
效果二:效果一的状态下,随意取消一个item选中状态,此时全选框改变为不选中
效果三:点击全选框为不选中状态,此时所有item为不选中状态
下面是代码部分:
一、首先是activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="csttech.com.checkdemo.MainActivity"> <CheckBox android:id="@+id/ckb_main" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#666666" android:padding="10dp" android:text="全选"/> <ListView android:id="@+id/list_main" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView></LinearLayout>二、item.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" android:gravity="center_vertical" android:orientation="horizontal" android:padding="10dp"> <TextView android:id="@+id/text_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1"/> <CheckBox android:id="@+id/ckb" android:focusable="false" android:focusableInTouchMode="false" android:clickable="false" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout></LinearLayout>
三、MainActivity.class
package csttech.com.checkdemo;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.ListView;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { private ListView mListView; private List<Model> models; private CheckBox mMainCkb; private MyAdapter mMyAdapter; //监听来源 public boolean mIsFromItem = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); initViewOper(); } /** * view初始化 */ private void initView() { mListView = (ListView) findViewById(R.id.list_main); mMainCkb = (CheckBox) findViewById(R.id.ckb_main); } /** * 数据加载 */ private void initData() { //模拟数据 models = new ArrayList<>(); Model model; for (int i = 0; i < 15; i++) { model = new Model(); model.setSt(i + "******"); model.setIscheck(false); models.add(model); } } /** * 数据绑定 */ private void initViewOper() { mMyAdapter = new MyAdapter(models, this, new AllCheckListener() { @Override public void onCheckedChanged(boolean b) { //根据不同的情况对maincheckbox做处理 if (!b && !mMainCkb.isChecked()) { return; } else if (!b && mMainCkb.isChecked()) { mIsFromItem = true; mMainCkb.setChecked(false); } else if (b) { mIsFromItem = true; mMainCkb.setChecked(true); } } }); mListView.setAdapter(mMyAdapter); //全选的点击监听 mMainCkb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { //当监听来源为点击item改变maincbk状态时不在监听改变,防止死循环 if (mIsFromItem) { mIsFromItem = false; Log.e("mainCheckBox", "此时我不可以触发"); return; } //改变数据 for (Model model : models) { model.setIscheck(b); } //刷新listview mMyAdapter.notifyDataSetChanged(); } }); } //对item导致maincheckbox改变做监听 interface AllCheckListener { void onCheckedChanged(boolean b); }}
四、MyAdapter.class
package csttech.com.checkdemo;import android.content.Context;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.CheckBox;import android.widget.TextView;import java.util.List;/** * Created by zhaiydong on 2017/1/9. */public class MyAdapter extends BaseAdapter { private List<Model> data; private Context context; private MainActivity.AllCheckListener allCheckListener; public MyAdapter(List<Model> data, Context context, MainActivity.AllCheckListener allCheckListener) { this.data = data; this.context = context; this.allCheckListener = allCheckListener; } @Override public int getCount() { return data.size(); } @Override public Object getItem(int i) { return data.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(final int i, View view, ViewGroup viewGroup) { ViewHoder hd; if (view == null) { hd = new ViewHoder(); LayoutInflater layoutInflater = LayoutInflater.from(context); view = layoutInflater.inflate(R.layout.item_list, null); hd.textView = (TextView) view.findViewById(R.id.text_title); hd.checkBox = (CheckBox) view.findViewById(R.id.ckb); view.setTag(hd); } Model mModel = data.get(i); hd = (ViewHoder) view.getTag(); hd.textView.setText(mModel.getSt()); Log.e("myadapter", mModel.getSt() + "------" + mModel.ischeck()); final ViewHoder hdFinal = hd; hd.checkBox.setChecked(mModel.ischeck()); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { CheckBox checkBox = hdFinal.checkBox; if (checkBox.isChecked()) { checkBox.setChecked(false); data.get(i).setIscheck(false); } else { checkBox.setChecked(true); data.get(i).setIscheck(true); } //监听每个item,若所有checkbox都为选中状态则更改main的全选checkbox状态 for (Model model : data) { if (!model.ischeck()) { allCheckListener.onCheckedChanged(false); return; } } allCheckListener.onCheckedChanged(true); } }); return view; } class ViewHoder { TextView textView; CheckBox checkBox; }}
五、Model
package csttech.com.checkdemo;/** * Created by zhaiydong on 2017/1/9. */public class Model { private boolean ischeck; private String st; public boolean ischeck() { return ischeck; } public void setIscheck(boolean ischeck) { this.ischeck = ischeck; } public String getSt() { return st; } public void setSt(String st) { this.st = st; }}demo下载地址:http://download.csdn.net/detail/android_koukou/9733420
1 0
- Android 中ListView带复选框多选、全选、不选处理
- listview控件中复选框全选
- Android开发——listview中嵌套checkBox复选框实现单选、全选删除列表内容
- jquery复选框全选与不选
- ListView中加复选框并实现全选(全不选)
- 复选框全选或不全选
- android ListView中Checkbox实现单选,全选,全不选功能
- js实现复选框 全选、反选、不选
- jquery复选框全选,反选和不选
- jQuery复选框全选、不选、反选
- 【JS】全选、不选、反选复选框(模板)
- js-复选框的全选,反选,不选
- 制作复选框的全选和不选效果
- Android 带checkbox的listView 实现多选,全选,反选
- Android 带checkbox的listView 实现多选,全选,反选
- Android 带checkbox的listView 实现多选,全选,反选
- Android 带checkbox的listView 实现多选,全选,反选
- Android 带checkbox的listView 实现多选,全选,反选
- android圆角图片
- 项目代码风格要求
- 《机器学习实战》K近邻(KNN)分类
- C++课后习题4.21
- [课堂笔记]二.Java语法基础
- Android 中ListView带复选框多选、全选、不选处理
- 上传base64格式的图片
- 第三章 练习 知识点 课后作业
- SpringBoot项目实战--Jetty
- Python GUI (一)
- Python3 基础:单元测试
- 第四章的小知识点
- [转载]STM32学习笔记——控制GPIO输出点亮LED灯(直接操作存储器)
- 水仙花数