Android高级控件(一)——ListView绑定CheckBox实现全选,添加和删除等功能
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实现全选,添加和删除等功能相关推荐
- Android高级控件(一)——ListView绑定CheckBox实现全选,增加和删除等功能
Android高级控件(一)--ListView绑定CheckBox实现全选,增加和删除等功能 这个控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小Demo来讲讲,主要是自定义adap ...
- Android高级控件之ListView的优化以及下拉刷新页面
1.ListView的优化 在优化之前我们先来说说配置器的自定义,为什么需要自定义配置器呢,因为系统自带的配置器不能满足我们的需求,所以就需要我们自己写配置器来实现功能, 但是在创建ListView时 ...
- Android 高级控件(七)——RecyclerView的方方面面
Android 高级控件(七)--RecyclerView的方方面面 RecyclerView出来很长时间了,相信大家都已经比较了解了,这里我把知识梳理一下,其实你把他看成一个升级版的ListView ...
- 移动开发技术(Android)——实验5 Android高级控件的应用
移动开发技术--实验5 Android高级控件的应用 一.实验目的 二.实验内容 1.Spinner.ListView控件与Adapter适配器(一) 2.Spinner.ListView控件与Ada ...
- Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现...
Android高级控件(二)--SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现 写这个的原因呢,也是因为项目中用到了gif动画,虽然网上有很多的架包可以实现,不过我们还 ...
- Android高级控件(四)——VideoView 实现引导页播放视频欢迎效果,超级简单却十分的炫酷
Android高级控件(四)--VideoView 实现引导页播放视频欢迎效果,超级简单却十分的炫酷 是不是感觉QQ空间什么的每次新版本更新那炫炫的引导页就特别的激动,哈哈,其实他实现起来真的很简单很 ...
- Android高级控件----AdapterView与Adapter详解
在J2EE中提供过一种非常好的框架--MVC框架,实现原理:数据模型M(Model)存放数据,利用控制器C(Controller)将数据显示在视图V(View)上.在Android中有这样一种高级控件 ...
- 《移动项目实践》实验报告——Android高级控件
实验目的 1.熟悉App开发常用的一些高级控件及相关工具,主要包括日期时间控件的用法.列表类视图及其适配器的用法.翻页类视图及其适配器的用法.碎片及其适配器的用法等: 2.熟悉四大组件之一广播Broa ...
- android 批量查找view,Android Recyclerview实现多选,单选,全选,反选,批量删除的功能
效果图如下: recyclerview 实现多选,单选,全选,反选,批量删除的步骤 1.在recyclerview布局中添加上底部的全选和反选按钮,删除按钮,和计算数量等控件 2.这里选中的控件没有用 ...
- android 全选功能,Android Recyclerview实现多选,单选,全选,反选,批量删除的功能
效果图如下: Recyclerview 实现多选,单选,全选,反选,批量删除的步骤 1.在Recyclerview布局中添加上底部的全选和反选按钮,删除按钮,和计算数量等控件 2.这里选中的控件没有用 ...
最新文章
- AAAI 2021: 微调对小样本学习究竟起何作用?搜索或是解决方案
- 常用String方法
- React 项目----内联样式style的使用 (12)
- python3.6使用教程-如何使用python编程《python3.6 教程》
- 【Python】如何学好Python
- mseloss pytorch_PyTorch 卷积与BatchNorm的融合
- C语言 十六进制整数字符串转十进制整数
- 浅聊一下各类以太网媒体接口MII/RMII/SMII/GMII/RGMII/SGMII
- 转:[kipmi0]进程导致系统负载高
- 【MySql】100问
- sklearn文本特征提取
- FlowNet到FlowNet2.0:基于卷积神经网络的光流预测算法
- 国产操作系统统信UOS简单体验评测
- HR必备基础能力之人性
- nginx源码的安装与磁盘分区
- android 仿微博评论编辑框_android 仿新浪微博开写篇
- java秒表程序_运用Java编写 秒表程序
- 开闭原则(Open Closed Principle)
- ERD Online 元数据管理开放平台
- 好记性不如烂笔头——Vite篇
热门文章
- cisco 的端口聚合
- vb.net它SqlHelper制备及应用
- 改变swap分区大小
- vsftp启用root用户
- Invalid escape sequence(valid ones are \b \t \n \f \r \ \' \\)
- 类和对象之Scala程序
- 简单php网站的mysql优化小结
- [原]tornado 源码分析系列目录
- 推荐第三方SQL查询工具
- 60多年来计算机是根据什么的发展,计算机复习题98197.doc