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


这个控件还是挺复杂的。也是项目中应该算是比較经常使用的了,所以写了一个小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);}@Overridepublic int getCount() {// TODO Auto-generated method stub// 假设为null就返回一个0return list != null ? list.size() : 0;}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn list.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic 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() {@Overridepublic 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<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;

全选数据

当我们全选的时候,button应该为全不选的,所以这里我们这里有状态的
    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());

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

listview的点击

我们直接点击也是能够勾选cheakbox选中的
// listview的点击事件@Overridepublic 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

转载于:https://www.cnblogs.com/yfceshi/p/7061386.html

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

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

    Android高级控件(一)--ListView绑定CheckBox实现全选,增加和删除等功能 这个控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小Demo来讲讲,主要是自定义adap ...

  2. Android高级控件之ListView的优化以及下拉刷新页面

    1.ListView的优化 在优化之前我们先来说说配置器的自定义,为什么需要自定义配置器呢,因为系统自带的配置器不能满足我们的需求,所以就需要我们自己写配置器来实现功能, 但是在创建ListView时 ...

  3. Android 高级控件(七)——RecyclerView的方方面面

    Android 高级控件(七)--RecyclerView的方方面面 RecyclerView出来很长时间了,相信大家都已经比较了解了,这里我把知识梳理一下,其实你把他看成一个升级版的ListView ...

  4. 移动开发技术(Android)——实验5 Android高级控件的应用

    移动开发技术--实验5 Android高级控件的应用 一.实验目的 二.实验内容 1.Spinner.ListView控件与Adapter适配器(一) 2.Spinner.ListView控件与Ada ...

  5. Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现...

    Android高级控件(二)--SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现 写这个的原因呢,也是因为项目中用到了gif动画,虽然网上有很多的架包可以实现,不过我们还 ...

  6. Android高级控件(四)——VideoView 实现引导页播放视频欢迎效果,超级简单却十分的炫酷

    Android高级控件(四)--VideoView 实现引导页播放视频欢迎效果,超级简单却十分的炫酷 是不是感觉QQ空间什么的每次新版本更新那炫炫的引导页就特别的激动,哈哈,其实他实现起来真的很简单很 ...

  7. Android高级控件----AdapterView与Adapter详解

    在J2EE中提供过一种非常好的框架--MVC框架,实现原理:数据模型M(Model)存放数据,利用控制器C(Controller)将数据显示在视图V(View)上.在Android中有这样一种高级控件 ...

  8. 《移动项目实践》实验报告——Android高级控件

    实验目的 1.熟悉App开发常用的一些高级控件及相关工具,主要包括日期时间控件的用法.列表类视图及其适配器的用法.翻页类视图及其适配器的用法.碎片及其适配器的用法等: 2.熟悉四大组件之一广播Broa ...

  9. android 批量查找view,Android Recyclerview实现多选,单选,全选,反选,批量删除的功能

    效果图如下: recyclerview 实现多选,单选,全选,反选,批量删除的步骤 1.在recyclerview布局中添加上底部的全选和反选按钮,删除按钮,和计算数量等控件 2.这里选中的控件没有用 ...

  10. android 全选功能,Android Recyclerview实现多选,单选,全选,反选,批量删除的功能

    效果图如下: Recyclerview 实现多选,单选,全选,反选,批量删除的步骤 1.在Recyclerview布局中添加上底部的全选和反选按钮,删除按钮,和计算数量等控件 2.这里选中的控件没有用 ...

最新文章

  1. AAAI 2021: 微调对小样本学习究竟起何作用?搜索或是解决方案
  2. 常用String方法
  3. React 项目----内联样式style的使用 (12)
  4. python3.6使用教程-如何使用python编程《python3.6 教程》
  5. 【Python】如何学好Python
  6. mseloss pytorch_PyTorch 卷积与BatchNorm的融合
  7. C语言 十六进制整数字符串转十进制整数
  8. 浅聊一下各类以太网媒体接口MII/RMII/SMII/GMII/RGMII/SGMII
  9. 转:[kipmi0]进程导致系统负载高
  10. 【MySql】100问
  11. sklearn文本特征提取
  12. FlowNet到FlowNet2.0:基于卷积神经网络的光流预测算法
  13. 国产操作系统统信UOS简单体验评测
  14. HR必备基础能力之人性
  15. nginx源码的安装与磁盘分区
  16. android 仿微博评论编辑框_android 仿新浪微博开写篇
  17. java秒表程序_运用Java编写 秒表程序
  18. 开闭原则(Open Closed Principle)
  19. ERD Online 元数据管理开放平台
  20. 好记性不如烂笔头——Vite篇

热门文章

  1. cisco 的端口聚合
  2. vb.net它SqlHelper制备及应用
  3. 改变swap分区大小
  4. vsftp启用root用户
  5. Invalid escape sequence(valid ones are \b \t \n \f \r \ \' \\)
  6. 类和对象之Scala程序
  7. 简单php网站的mysql优化小结
  8. [原]tornado 源码分析系列目录
  9. 推荐第三方SQL查询工具
  10. 60多年来计算机是根据什么的发展,计算机复习题98197.doc