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>& ...
随机推荐
- libevent学习五(Helper functions and types for Libevent)
基础类型 #ifdef WIN32 #define evutil_socket_t intptr_t #else #define evutil_socket_t int #endif ev_ssi ...
- 你的APK安全吗?来WeTest免费测!
腾讯安全联合实验室就曾在<2018上半年互联网黑产研究报告>指出,移动端黑产规模宏大,恶意推广日均影响用户超过千万. 尤其在网络强相关的APP流行年代,当APP应用客户端上传与获取信息,大 ...
- sqlserver 循环赋值变量
sql server 是可以用 @变量 +=值的: 第一:必须在循环里面, 第二: 必须在循环外面初始化变量的值 如: @变量=''; 这样才能循环给值
- mysql索引 b+树
1.B+树基本概念 B+树的语言定义比较复杂,简单的说是为磁盘存取设计的平衡二叉树 网上经典图,黄色p1 p2 p3代表指针,蓝色的代表磁盘,里面包含数据项,第一层17,35,p1就代表小于17的,p ...
- 「题目代码」P1060~P1065(Java)
P1060 谭浩强C语言(第三版)习题7.5 注意行末空格. import java.util.*; import java.io.*; import java.math.*; import java ...
- unity实现框选效果
思路: 在uinity中既可以将屏幕坐标转换为世界坐标,也可以将世界坐标转换为屏幕坐标.这样的话我们就可以通过判断物体在世界坐标转换为平幕坐标是否在鼠标框选的矩形区域坐标内,来判断物体是否在框选范围. ...
- Http的请求和响应
请求有客户端发起:可分为4个部分,请求方法(Requestmethod).请求的网址(Request URL).请求头(Request Headers).请求体(Request Body) 1.请求方 ...
- vscode开发智能合约
开发工具 EOS 开发终极神器-vscode (你绝对找不到的干货) lome · 2018年04月19日 · 最后由 18636292520 回复于 2018年09月15日 · 15672 次阅读 ...
- 单源最短路——SPFA算法(Bellman-Ford算法队列优化)
spfa的算法思想(动态逼近法): 设立一个先进先出的队列q用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路 ...
- ASP.NET 最全的POST提交数据和接收数据 —— (1) 用url传参方式
//1.对象提交,字典方式 //接口方:public ActionResult GetArry(Car model) public void PostResponse() { HttpWebReque ...