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);
}
@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
Android高级控件(一)——ListView绑定CheckBox实现全选,增加和删除等功能的更多相关文章
- Android高级控件(一)——ListView绑定CheckBox实现全选,添加和删除等功能
Android高级控件(一)--ListView绑定CheckBox实现全选,添加和删除等功能 这个控件还是挺复杂的.也是项目中应该算是比較经常使用的了,所以写了一个小Demo来讲讲,主要是自己定义a ...
- Android高级控件(六)——自定义ListView高仿一个QQ可拖拽列表的实现
Android高级控件(六)--自定义ListView高仿一个QQ可拖拽列表的实现 我们做一些好友列表或者商品列表的时候,居多的需求可能就是需要列表拖拽了,而我们选择了ListView,也是因为使用L ...
- Android 高级控件(七)——RecyclerView的方方面面
Android 高级控件(七)--RecyclerView的方方面面 RecyclerView出来很长时间了,相信大家都已经比较了解了,这里我把知识梳理一下,其实你把他看成一个升级版的ListView ...
- Android高级控件(五)——如何打造一个企业级应用对话列表,以QQ,微信为例
Android高级控件(五)--如何打造一个企业级应用对话列表,以QQ,微信为例 看标题这么高大上,实际上,还是运用我么拿到listview去扩展,我们讲什么呢,就是研究一下QQ,微信的这种对话列表, ...
- Android高级控件(四)——VideoView 实现引导页播放视频欢迎效果,超级简单却十分的炫酷
Android高级控件(四)--VideoView 实现引导页播放视频欢迎效果,超级简单却十分的炫酷 是不是感觉QQ空间什么的每次新版本更新那炫炫的引导页就特别的激动,哈哈,其实他实现起来真的很简单很 ...
- Android高级控件(三)—— 使用Google ZXing实现二维码的扫描和生成相关功能体系
Android高级控件(三)-- 使用Google ZXing实现二维码的扫描和生成相关功能体系 摘要 现在的二维码可谓是烂大街了,到处都是二维码,什么都是二维码,扫一扫似乎已经流行到习以为常了,今天 ...
- Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现
Android高级控件(二)--SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现 写这个的原因呢,也是因为项目中用到了gif动画,虽然网上有很多的架包可以实现,不过我们还 ...
- Android高级控件(三)—— 使用Google ZXing实现二维码的扫描和生成相关功能体系
Android高级控件(三)-- 使用Google ZXing实现二维码的扫描和生成相关功能体系 摘要 如今的二维码可谓是烂大街了.到处都是二维码.什么都是二维码,扫一扫似乎已经流行到习以为常了,今天 ...
- Android高级控件--AdapterView与Adapter
在J2EE中提供过一种非常好的框架--MVC框架,实现原理:数据模型M(Model)存放数据,利用控制器C(Controller)将数据显示在视图V(View)上.在Android中有这样一种高级控件 ...
随机推荐
- VMware Tools (ubuntu系统)安装详细过程与使用
前一段时间博主在VMware虚拟机上安装了Ubuntu系统,如果还没有安装的同学可以参考博主上一篇文章:VMware Ubuntu安装详细过程. 猿友们都知道linux不太好用,如果你想将你主机Win ...
- 代码优化>>>Android ListView适配器三级优化详解
转载本专栏每一篇博客请注明转载出处地址,尊重原创.此博客转载链接地址:点击打开链接 http://blog.csdn.net/qq_32059827/article/details/52718489 ...
- JAVA面向对象-----抽象类注意细节
抽象类可以没有抽象方法(java.awt.*的类就是这样子操作的). 抽象类可以继承普通类与抽象类. 抽象类不能直接使用类名创建实例,但是有构造方法,构造方法是让子类进行初始化. 抽象类一定有构造方法 ...
- 集成JPA+springmvc+spring+EJB中的Java EE应用
EJB是sun的JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序.凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台.EJB (Enterprise Jav ...
- java虚拟机 jvm 方法区实战
和java堆一样,方法区是一块所有线程共享的内存区域,用于保存系统的类信息,类的信息有哪些呢.字段.方法.常量池.方法区也有一块内存区域所以方法区的内存大小,决定了系统可以包含多少个类,如果系统类太多 ...
- 【Netty源码解析】NioEventLoop
上一篇博客[Netty源码学习]EventLoopGroup中我们介绍了EventLoopGroup,实际说来EventLoopGroup是EventLoop的一个集合,EventLoop是一个单线程 ...
- FFmpeg源代码简单分析:avcodec_close()
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- Cocos2D实现RPG队伍菜单任意调整角色顺序的效果
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 前一篇我们实现了队伍实现拖尾效果,但是在实际游戏中我们往往需要 ...
- (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 通用的星星类已经完成了,下面我们来实现具体的变长和缩短道具. 变 ...
- Deploying Customizations in Oracle E-Business Suite Release 12.2
DeployingCustomizations in Oracle E-Business Suite Release 12.2 This documentdescribes how to deploy ...