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;
} // 全选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的点击事件
@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实现全选,添加和删除等功能的更多相关文章

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

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

  2. Android高级控件(六)——自定义ListView高仿一个QQ可拖拽列表的实现

    Android高级控件(六)--自定义ListView高仿一个QQ可拖拽列表的实现 我们做一些好友列表或者商品列表的时候,居多的需求可能就是需要列表拖拽了,而我们选择了ListView,也是因为使用L ...

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

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

  4. Android高级控件(五)——如何打造一个企业级应用对话列表,以QQ,微信为例

    Android高级控件(五)--如何打造一个企业级应用对话列表,以QQ,微信为例 看标题这么高大上,实际上,还是运用我么拿到listview去扩展,我们讲什么呢,就是研究一下QQ,微信的这种对话列表, ...

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

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

  6. Android高级控件(三)—— 使用Google ZXing实现二维码的扫描和生成相关功能体系

    Android高级控件(三)-- 使用Google ZXing实现二维码的扫描和生成相关功能体系 摘要 现在的二维码可谓是烂大街了,到处都是二维码,什么都是二维码,扫一扫似乎已经流行到习以为常了,今天 ...

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

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

  8. Android高级控件(三)——&#160;使用Google ZXing实现二维码的扫描和生成相关功能体系

    Android高级控件(三)-- 使用Google ZXing实现二维码的扫描和生成相关功能体系 摘要 如今的二维码可谓是烂大街了.到处都是二维码.什么都是二维码,扫一扫似乎已经流行到习以为常了,今天 ...

  9. Android高级控件--AdapterView与Adapter

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

随机推荐

  1. Scrapy系列教程(6)------怎样避免被禁

    避免被禁止(ban) 有些网站实现了特定的机制,以一定规则来避免被爬虫爬取. 与这些规则打交道并不easy,须要技巧,有时候也须要些特别的基础. 假设有疑问请考虑联系 商业支持 . 以下是些处理这些网 ...

  2. 使用Android design support library在Eclipse和Android Studio

    背景:为了在低版本号下使用Android 5.0的一些新特新 Eclipse篇: 1.将Android Manager中的Android support library升级到最新,我的为22.2.1' ...

  3. [POJ 2279] Mr. Young's Picture Permutations

    [题目链接] http://poj.org/problem?id=2279 [算法] 杨氏矩阵与勾长公式 [代码] #include <algorithm> #include <bi ...

  4. java.lang.NoClassDefFoundError: javax/servlet/ServletInputStream

    转自:https://blog.csdn.net/y970105/article/details/355401 进入 tomcat根目录/lib/servlet-api.jar复制出来,放到JDK_P ...

  5. 异步编程(二)基于事件的异步编程模式 (EAP)

    一.引言 在上一个专题中为大家介绍了.NET 1.0中提出来的异步编程模式——APM,虽然APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题——不支持对异步操作的取消和没有提供对进 ...

  6. HTML文档 html,html5,css,css3

    HTML 各种标签及简单应用: http://www.w3school.com.cn 1 <p><p> 2 <br/> 3 <hr/>横线 4 < ...

  7. vscode 插件推荐 - 献给所有前端工程师

    VScode现在已经越来越完善.性能远超Atom和webstorm,你有什么理由不用它?在这里,我会给你们推荐很多实用的插件,让你对 vscode 有更深刻的体会,渐渐地你就会知道它有多好用. 走马观 ...

  8. 清北集训Day6T1(生成函数)

    听rqy说可以用生成函数做,感觉比较有意思 我们考虑在DP转移的时候, $5,7,9$这三个数是没有限制的 因此他们出现的次数用01串表示的话就是$1111111111111111......$ $3 ...

  9. Windows 安装 MySQL8

    MySQL8下载地址:https://dev.mysql.com/downloads/mysql/ 解压到安装目录 新建配置文件my.ini [mysqld]# 设置mysql的安装目录basedir ...

  10. JS 限制input框的输入字数,并提示可输入字数

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...