Android ListView 中加入CheckBox/RadioButton 选择状态保持、全选、反选实现
最近在一个项目中,需要在ListView的item中加入CheckBox,但是遇到的一个问题是上下滑动的时候如果有选择了的CheckBox,就会出现选择项错误的问题,下面将个人的解决方法总结如下;
先说思路:
在ListView的Adapter中,用一个Map保存每一项item的选择状态,在getView方法中,设置Map中保存的某一项的选择状态就实现了状态的保存;
每一项的视图child.xml
<CheckBox
android:id="@+id/item_cb"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/item_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello" />
Adapter.java
public class CAdapter extends BaseAdapter {
private List<String> list;
private LayoutInflater inflater;
Map<Integer, Boolean> map;
private OnSelectedItemChanged listener;
private Holder holder = null;
public CAdapter(Context context, List<String> list,
OnSelectedItemChanged listener) {
super();
inflater = LayoutInflater.from(context);
this.list = list;
map = new HashMap<Integer, Boolean>();
for (int i = 0; i < list.size(); i++) {
map.put(i, false);
}
this.listener = listener;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
String item = list.get(position);
if (view == null) {
holder = new Holder();
view = inflater.inflate(R.layout.child, null);
TextView tv = (TextView) view.findViewById(R.id.item_tv);
CheckBox cb = (CheckBox) view.findViewById(R.id.item_cb);
holder.tv = tv;
holder.cb = cb;
view.setTag(holder);
} else {
holder = (Holder) view.getTag();
holder.tv.setText(item);
holder.cb.setChecked(map.get(position));
}
holder.tv.setText(list.get(position));
final CheckBox cb = holder.cb;
cb.setChecked(map.get(position));// 设置选择状态
cb.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
map.put(position, cb.isChecked());
listener.selectedItemChange(getSelectedCount(map));
}
});
return view;
}
/**
* 获取选择的项的数目
*
* @param map
* @return
*/
public int getSelectedCount(Map<Integer, Boolean> map) {
int i = 0;
for (Entry<Integer, Boolean> entry : map.entrySet()) {
if (entry.getValue()) {
i++;
}
}
return i;
}
class Holder {
TextView tv;
CheckBox cb;
}
/**
* 向Activity暴露选择了多少项
*
* @author cj
*
*/
public interface OnSelectedItemChanged {
public void selectedItemChange(int count);
}
public void selectAll() { // 全选
for (int i = 0; i < list.size(); i++) {
map.put(i, true);
}
notifyDataSetChanged();
}
public void disSelectAll() { // 全不选
for (int i = 0; i < list.size(); i++) {
map.put(i, false);
}
notifyDataSetChanged();
}
public void switchSelect() { // 反选
for (int i = 0; i < list.size(); i++) {
boolean select = map.get(i);
map.put(i, !select);
}
notifyDataSetChanged();
}
}
MainActivity.java
public class MainActivity extends Activity {
private ListView lv;
private CAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
setAdapter();
}
private void setAdapter() {
List<String> list = new ArrayList<String>();
for (int i = 0; i < 50; i++) {
list.add("item - " + i);
}
adapter = new CAdapter(getApplicationContext(), list,
new OnSelectedItemChanged() {// Adapter接口暴露出来的选择项状态改变时选择的项的数目
@Override
public void selectedItemChange(int count) {
Log.e("SelectedCount - ", count + "");
}
});
lv.setAdapter(adapter);
}
// 全选
public void selectAll(View v) {
adapter.selectAll();
}
// 全不选
public void disSelectAll(View v) {
adapter.disSelectAll();
}
// 反选
public void switchSelect(View v) {
adapter.switchSelect();
}
}
选择之后反选的效果(右边是点击反选之后的效果):

在上面用到一个比较好的思想就是用类的内部接口向外部调用类暴露本类的一些状态改变时,外部类可能想要获取的数据信息;
延伸思考:上面保存的状态是CheckBox,当需要使用RadioButton的时候,使用方法也是类似的;
但是RadioButton可能会有另一种需求{选择某一项的时候其它项就不选择,也即只选择一项},此种情况其实参考上面全选,反选的实现,实现起来也是比较简单,暂时没时间去写出来测试;
Android ListView 中加入CheckBox/RadioButton 选择状态保持、全选、反选实现的更多相关文章
- Android listview中使用checkbox
最近比较忙碌,我也不知道忙的什么东西,打算写的博客写了一半,还没写完,今天先扯一扯项目中遇到的一个问题,一方面防止以后遇到这个问题忘记如何解决,另一方面希望可以提供给遇到同样问题的朋友一个思路.下面开 ...
- Android ListView 中的checkbox
Q:ListView + CheckBox 当上下滚动的时候有事会自动选中或取消 A:这个与ListView的缓存机制有关.当你屏幕滚动后,ListView中的item选项视图先检查缓存中是否有视图, ...
- android listview中item通过viewpager实现《IT蓝豹》
android listview中item通过viewpager实现 android listview中item通过viewpager实现,每一个item都支持viewpager实现图片切换功能.本项 ...
- js做全选,用一个checkbox复选框做多个checkbox复选框的全选按钮,有一个复选框未被选择时,全选按钮的checked就为false
用一个checkbox复选框做多个checkbox复选框的全选按钮,有一个复选框未被选择时,全选按钮的checked就为false,当所有checkbox都被选中时,全选按钮也被选中. 详解: 有两种 ...
- 关于Winform下DataGridView中实现checkbox全选反选、同步列表项的处理
近期接手一个winform 项目,虽然之前有.net 的经验,但是对一些控件的用法还不是很熟悉. 这段时间将会记录一些在工作中遇到的坎坷以及对应的解决办法,写出来与大家分享并希望大神提出更好解决方法来 ...
- jquery checkbox 复选框多次点击判断选中状态,以及全选/取消的代码示例
2015年12月21日 10:52:51 星期一 目标, 点击当前的checbox, 判断点击后当前checkbox是否是选中状态. html: <input type="checkb ...
- Android开发 ---基本UI组件5:监听下拉选项,动态绑定下拉选项、全选/反选,取多选按钮的值,长按事件,长按删除,适配器的使用,提示查询数据,activity控制多按钮
效果图: 效果描述: 1.当点击 1 按钮后,进入选择城市的页面,会监听到你选中的城市名称:动态为Spinner绑定数据 2.当点击 2 按钮后,进入自动查询数据页面,只要输入首字母,就会动态查找以该 ...
- 在GridView中实现全选反选的例子
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GridView控件.asp ...
- JQuery 全选 反选 获取Table 中指定td的元素值
//全选 function initTableCheckbox() { var $thr = $('table thead tr'); var $checkAllTh = $('<th>& ...
随机推荐
- CentOS下安装Tomcat环境
一.安装JAVA环境 1.安装JAVA mkdir -p /usr/local/java 下载jdk1.7.0_67.tar.gz包,并解压到 tar xf jdk1.7.0_67.tar.gz -C ...
- Putty远程连接Ubuntu14.04
步骤一.在ubuntu系统中安装ssh,可使用如下的命令进行安装: sudo apt-get install openssh-server 步骤二.为了保险起见,安装完成后重启一下ssh服务,命令如下 ...
- ansible基础配置使用(一)
test test test
- hdu2149Public Sale(巴什博弈)
Public Sale Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- Python 更换国内pip源
pip国内的一些镜像: 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/sim ...
- 【SpringCloud】 第九篇: 服务链路追踪(Spring Cloud Sleuth)
前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选. ...
- 第一模块·开发基础-第1章 Python基础语法
Python开发工具课前预习 01 Python全栈开发课程介绍1 02 Python全栈开发课程介绍2 03 Python全栈开发课程介绍3 04 编程语言介绍(一) 05 编程语言介绍(二)机器语 ...
- Python学习-猜数字游戏
菩萨蛮·黄鹤楼 茫茫九派流中国,沉沉一线穿南北.烟雨莽苍苍,龟蛇锁大江. 黄鹤知何去,剩有游人处.把酒酹滔滔,心潮逐浪高! --coding:UTF-8-- import random secret ...
- Struts2(九.利用layer组件实现图片显示功能)
1.layer前端组件介绍 layer是一款口碑极佳的web弹层组件,她具备全方位的解决方案,致力于服务各个水平段的开发人员,您的页面会轻松地拥有丰富而友好的操作体验. http://sentsin. ...
- redis 在java中的使用
1.首先下载jar包放到你的工程中 2.练习 package com.jianyuan.redisTest; import java.util.Iterator;import java.util.Li ...