博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android高级控件(一)——ListView绑定CheckBox实现全选,添加和删除等功能
阅读量:7135 次
发布时间:2019-06-28

本文共 7371 字,大约阅读时间需要 24 分钟。

Android高级控件(一)——ListView绑定CheckBox实现全选,添加和删除等功能


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

这里写图片描写叙述

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

这里写图片描写叙述

我们事先先把这两个布局写好吧,一个是主布局,另一个listview的item.xml。相信不用多说

activity_main.xml

item.xml

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
list = new ArrayList
(); // 上下文 private Context mContext; // 存储勾选框状态的map集合 private Map
isCheck = new HashMap
(); // 构造方法 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
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; } // 全选button获取状态 public Map
getMap() { // 返回状态 return isCheck; } // 删除一个数据 public void removeData(int position) { list.remove(position); }}

当然,有些方法是后面写的,我们提前写好。比方删除和添加什么的

初始化数据

我们默认总是须要点数据的
private void initData() {        // 默认显示的数据        List
list = new ArrayList
(); 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;

全选数据

当我们全选的时候,button应该为全不选的,所以这里我们这里有状态的
case R.id.btn_select_all:            // 全选——全不选            Map
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
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());

是一个计算方式。当我们删除之后。实际上数组是须要又一次排列的,同一时候button也要变回全选状态的

这里写图片描写叙述

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下载地址:

你可能感兴趣的文章
Facebook拟投资10亿美元在弗吉尼亚州打造数据中心
查看>>
图片基础知识梳理(1) ImageView 的 ScaleType 属性解析
查看>>
理解索引:MySQL执行计划详细介绍
查看>>
滑动冲突
查看>>
Ubuntu Linux 中虚拟主机的配置 - 搭配 Nginx
查看>>
1024程序员节最新福利之2018最全Android资料集合
查看>>
源码阅读:SDWebImage(七)——SDWebImageImageIOCoder
查看>>
App 启动优化 之 背景知识
查看>>
检测不同服务器上代码差别的shell的脚本
查看>>
JavaScript的循环方式(1)
查看>>
扎克伯格扎心,传谷歌搜索将接受审查重新进入中国
查看>>
Confluence 6 添加或删除用户组
查看>>
高仿微博弹出式菜单。
查看>>
《Spring Boot极简教程》第14章 Spring Boot集成Swagger2构建自动化Rest API文档
查看>>
MQ单一消息完整流程
查看>>
从0到1:打造移动端H5性能测试平台
查看>>
8- 快速上手Linux玩转典型应用- 缓存服务:Redis&memcached
查看>>
Spring Boot 自定义Spring MVC 配置: WebMvcConfigurationSupport
查看>>
MySQL 配置最低权限运行SP
查看>>
Android VideoView播放在线视频(2)
查看>>