Android中ListView绑定CheckBox实现全选增加和删除功能(DEMO)
程序员文章站
2024-03-06 15:59:44
listview控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小demo来讲讲,主要是自定义adapter的用法,加了很多的判断等等等等….我们先来看看实现...
listview控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小demo来讲讲,主要是自定义adapter的用法,加了很多的判断等等等等….我们先来看看实现的效果吧!
好的,我们新建一个项目lvcheckbox
我们事先先把这两个布局写好吧,一个是主布局,还有一个listview的item.xml,相信不用多说
activity_main.xml
<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" > <relativelayout android:layout_width="match_parent" android:layout_height="50dp" android:background="#238286" > <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerinparent="true" android:text="listview绑定checkbox" android:textcolor="#fff" /> <textview android:id="@+id/tv_add" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentright="true" android:layout_centervertical="true" android:layout_marginright="17dp" android:text="增加" android:textcolor="#fff" /> </relativelayout> <listview android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" > </listview> <linearlayout android:layout_width="match_parent" android:layout_height="50dp" android:orientation="horizontal" > <button android:id="@+id/btn_detele" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginright="1dp" android:layout_weight="1" android:background="#238286" android:text="删除" android:textcolor="#fff" /> <button android:id="@+id/btn_select_all" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginleft="1dp" android:layout_weight="1" android:background="#238286" android:text="全选" android:textcolor="#fff" /> </linearlayout> </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="50dp" android:gravity="center_vertical" android:orientation="horizontal" > <textview android:id="@+id/tvtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginleft="15dp" android:layout_weight="7" android:text="text" /> <checkbox android:id="@+id/cbcheckbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" /> </linearlayout>
item.xml只有两个控件,很好理解吧
初始化控件
我们用initview()方法来初始化这些控件
private void initview() { tv_add = (textview) findviewbyid(r.id.tv_add); tv_add.setonclicklistener(this); btn_detele = (button) findviewbyid(r.id.btn_detele); btn_detele.setonclicklistener(this); btn_select_all = (button) findviewbyid(r.id.btn_select_all); btn_select_all.setonclicklistener(this); listview = (listview) findviewbyid(r.id.listview); }
然后继承点击事件,button的和listview的
implements onclicklistener,onitemclicklistener
自定义adapter
这里最难的就是adapter了
1.bean
我们为了数据的记录方便,我们提前写一个实体类
package com.lgl.lvcheckbox; public class bean { private string title; // 构造方法 public bean(string title) { super(); this.title = title; } public string gettitle() { return title; } public void settitle(string title) { this.title = title; } }
listadapter
这里所有的都写了注释,也方便大家看清
package com.lgl.lvcheckbox; import java.util.arraylist; import java.util.hashmap; import java.util.list; import java.util.map; import android.content.context; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.baseadapter; import android.widget.checkbox; import android.widget.compoundbutton; import android.widget.compoundbutton.oncheckedchangelistener; import android.widget.textview; /** * 自定义适配器 * * @author lgl * */ public class listadapter extends baseadapter { // 数据集 private list<bean> list = new arraylist<bean>(); // 上下文 private context mcontext; // 存储勾选框状态的map集合 private map<integer, boolean> ischeck = new hashmap<integer, boolean>(); // 构造方法 public listadapter(context mcontext) { super(); this.mcontext = mcontext; // 默认为不选中 initcheck(false); } // 初始化map集合 public void initcheck(boolean flag) { // map集合的数量和list的数量是一致的 for (int i = 0; i < list.size(); i++) { // 设置默认的显示 ischeck.put(i, flag); } } // 设置数据 public void setdata(list<bean> data) { this.list = data; } // 添加数据 public void adddata(bean bean) { // 下标 数据 list.add(0, bean); } @override public int getcount() { // todo auto-generated method stub // 如果为null就返回一个0 return list != null ? list.size() : 0; } @override public object getitem(int position) { // todo auto-generated method stub return list.get(position); } @override public long getitemid(int position) { // todo auto-generated method stub return position; } @override public view getview(final int position, view convertview, viewgroup parent) { viewholder viewholder = null; view view = null; // 判断是不是第一次进来 if (convertview == null) { view = layoutinflater.from(mcontext).inflate(r.layout.item, null); viewholder = new viewholder(); viewholder.title = (textview) view.findviewbyid(r.id.tvtitle); viewholder.cbcheckbox = (checkbox) view .findviewbyid(r.id.cbcheckbox); // 标记,可以复用 view.settag(viewholder); } else { view = convertview; // 直接拿过来用 viewholder = (viewholder) view.gettag(); } // 拿到对象 bean bean = list.get(position); // 填充数据 viewholder.title.settext(bean.gettitle().tostring()); // 勾选框的点击事件 viewholder.cbcheckbox .setoncheckedchangelistener(new oncheckedchangelistener() { @override public void oncheckedchanged(compoundbutton buttonview, boolean ischecked) { // 用map集合保存 ischeck.put(position, ischecked); } }); // 设置状态 if (ischeck.get(position) == null) { ischeck.put(position, false); } viewholder.cbcheckbox.setchecked(ischeck.get(position)); return view; } // 优化 public static class viewholder { public textview title; public checkbox cbcheckbox; } // 全选按钮获取状态 public map<integer, boolean> getmap() { // 返回状态 return ischeck; } // 删除一个数据 public void removedata(int position) { list.remove(position); } }
当然,有些方法是后面写的,我们提前写好,比如删除和增加什么的
初始化数据
我们默认总是需要点数据的
private void initdata() { // 默认显示的数据 list<bean> list = new arraylist<bean>(); list.add(new bean("张三")); list.add(new bean("李四")); list.add(new bean("王五")); adapter = new listadapter(this); adapter.setdata(list); listview.setadapter(adapter); }
增加数据
// 添加数据 case r.id.tv_add: adapter.adddata(new bean("刘桂林")); // 通知刷新适配器 adapter.notifydatasetchanged(); break;
全选数据
当我们全选的时候,按钮应该为全不选的,所以这里我们这里有状态的
case r.id.btn_select_all: // 全选——全不选 map<integer, boolean> ischeck = adapter.getmap(); if (btn_select_all.gettext().equals("全选")) { adapter.initcheck(true); // 通知刷新适配器 adapter.notifydatasetchanged(); btn_select_all.settext("全不选"); btn_select_all.settextcolor(color.yellow); } else if (btn_select_all.gettext().equals("全不选")) { adapter.initcheck(false); // 通知刷新适配器 adapter.notifydatasetchanged(); btn_select_all.settext("全选"); btn_select_all.settextcolor(color.yellow); } break;
删除数据
删除也是要考虑很多因素
// 删除数据 case r.id.btn_detele: // 拿到所有数据 map<integer, boolean> ischeck_delete = adapter.getmap(); // 获取到条目数量,map.size = list.size,所以 int count = adapter.getcount(); // 遍历 for (int i = 0; i < count; i++) { // 删除有两个map和list都要删除 ,计算方式 int position = i - (count - adapter.getcount()); // 判断状态 true为删除 if (ischeck_delete.get(i) != null && ischeck_delete.get(i)) { // listview删除数据 ischeck_delete.remove(i); adapter.removedata(position); } } btn_select_all.settext("全选"); btn_select_all.settextcolor(color.white); adapter.notifydatasetchanged(); break;
这里的
int position = i - (count - adapter.getcount());
是一个计算方式,当我们删除之后,实际上数组是需要重新排列的,同时按钮也要变回全选状态的
listview的点击
我们直接点击也是可以勾选cheakbox选中的 // listview的点击事件 @override public void onitemclick(adapterview<?> parent, view view, int position, long id) { // 判断view是否相同 if (view.gettag() instanceof viewholder) { // 如果是的话,重用 viewholder holder = (viewholder) view.gettag(); // 自动触发 holder.cbcheckbox.toggle(); } }
以上所述是小编给大家介绍的android中listview绑定checkbox实现全选增加和删除功能(demo),希望对大家有所帮助