百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

Android ListView绑定CheckBox实现全选,增加和删除等功能

citgpt 2024-06-26 14:59 7 浏览 0 评论

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

>好的,我们新建一个项目LvCheckBox

Android ListView绑定CheckBox实现全选,增加和删除等功能

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

}

}

好的,这样的话就可以实现了,如果不懂的话可以下载本文demo参考,觉得好的点个赞

Demo下载地址:http://download.csdn.net/detail/qq_26787115/9423306

相关推荐

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...

2024-10-24 16:21 citgpt

Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解

取消回复欢迎 发表评论: