欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中ListView绑定CheckBox实现全选增加和删除功能(DEMO)

程序员文章站 2024-03-07 15:11:27
listview控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小demo来讲讲,主要是自定义adapter的用法,加了很多的判断等等等等….我们先来看看实现...

listview控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小demo来讲讲,主要是自定义adapter的用法,加了很多的判断等等等等….我们先来看看实现的效果吧!

Android中ListView绑定CheckBox实现全选增加和删除功能(DEMO)

好的,我们新建一个项目lvcheckbox

Android中ListView绑定CheckBox实现全选增加和删除功能(DEMO)

我们事先先把这两个布局写好吧,一个是主布局,还有一个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());

是一个计算方式,当我们删除之后,实际上数组是需要重新排列的,同时按钮也要变回全选状态的

Android中ListView绑定CheckBox实现全选增加和删除功能(DEMO)

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),希望对大家有所帮助