Listview中嵌套Checkbox的简单解决办法
2016-02-29 17:04
309 查看
最近公司都弥漫着快要解散的气氛。本渣渣也不开心了。想到换公司舍不得啊,我的小同事们!外加面试那种被各种问题轰炸的感觉也很是不爽。但是不开心又能怎样,当然还是学习去。最近项目中做了一个关于批量删除的这样一个操作,以前是会做的,谁知道记性不好忘光了,经过一番折腾还是完美的实现了,相信后面还有无数个和我一样的渣渣会遇到这个问题,那么就让我来分享一下咯。
当然这个checkbox控件是写在item布局中的。我这边的需求是点击编辑按钮才会显示checkbox,点击取消隐藏。所以开始还是隐藏吧。
<CheckBox
android:id="@+id/cb_test_change"
android:layout_width="30dp"
android:layout_height="match_parent"
android:layout_marginLeft="15dp"
android:button="@drawable/selector_check"
android:gravity="center"
android:visibility="gone" />
其次重要的就是在adapter当中了。这里我用了Set集合,好多人都使用的是HashMap<Integer,Boolbean>,然后初始化HashMap都为false,这个方法是可行的,记录位置与对应位置点击的状态。但是使用Set本人认为更加的简单,这里只需要记录被点击了的checkbox的位置即可。使用最好使用静态的Set这样可以在Activity中使用对象得到Set集合。
// 用来控制CheckBox的选中状况
private static Set<Integer> selectSet;
下面这一段代码是在getview()中添加的,可以根据具体需求去相应的添加。
checkBox_edit.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
selectSet.add(position);
}
if (!isChecked) {
if (selectSet.contains(position)) {//这个比较重要,如果点击选中这个位置就会存在Set集合当中,当再次点击它就取消了,所以也要从集合中移除。
selectSet.remove(position);
}
}
}
});
在我解决这个问题的时候还衍生了很多其他的问题,但是需求没有,所以也就没去弄。这里既然是写博客,那么就一起总结一下吧。
关于全选,全部取消和反转选择,这里大家就要使用HashMap集合啦。
在adapter当中初始化一个静态的HashMap<Integer,Boolbean>集合,为它添加set,get方法,并且根据集合的大小为它添加数据,默认false。在getview()方法中做一下操作。
1.设置checkbox点击状态根据position得到集合中对应的值。
2.添加点击事件,将点击状态存入集合当中,
当然实现上述三种功能就是对HashMap集合内数据的操作;
1.全选,设集合值都为true。
2.取消,设置集合内的值都为false。
3.反转就是遍历集合将true设置为false,false设置为true即可。
当然还有人会遇到当添加了checkbox之后listview点击不了的问题,这里自己也是出于学习,大概的说一下吧,事件分发会在下一节详细说明,大神请指正。关于这个问题就和android的事件分发机制就有关系了。
Android为什么要有事件分发呢?因为它是按照层排列,他如何知道你点击的哪一层呢,就需要用到事件分发了.
说到事件分发可能就会想起那三个威武的方法:事件分发(dispatchTouchEvent(MotionEvent ev))、事件拦截(onInterceptTouchEvent(MotionEvent ev))、事件响应(onTouchEvent(MotionEvent ev)),其中ViewGroup响应这三个方法。这里由于checkbox消费了这个点击事件,也就是事件响应返回值为true。所以将它包裹的listview就无法去响应点击事件了,因为点击已经被checkbox消费了。这里如果想要点击listview就去选中checkbox,方法也很简单,如下:
1,设置 checkbox无法响应点击事件
[html] view
plain copy
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
2.根据item的点击情况,给checkbox赋值
[java] view
plain copy
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
ViewHolder holder = (ViewHolder) view.getTag();
holder.mCheckBox.toggle(); //得到checkbox逆其状态设置。
MyShowAdapter.getIsSelected().put(position, holder.mCheckBox.isChecked());
}
});
ok,好像就这么多了,如果大家还有其他关于这方面的问题可以欢迎留言,一起探讨。
当然这个checkbox控件是写在item布局中的。我这边的需求是点击编辑按钮才会显示checkbox,点击取消隐藏。所以开始还是隐藏吧。
<CheckBox
android:id="@+id/cb_test_change"
android:layout_width="30dp"
android:layout_height="match_parent"
android:layout_marginLeft="15dp"
android:button="@drawable/selector_check"
android:gravity="center"
android:visibility="gone" />
其次重要的就是在adapter当中了。这里我用了Set集合,好多人都使用的是HashMap<Integer,Boolbean>,然后初始化HashMap都为false,这个方法是可行的,记录位置与对应位置点击的状态。但是使用Set本人认为更加的简单,这里只需要记录被点击了的checkbox的位置即可。使用最好使用静态的Set这样可以在Activity中使用对象得到Set集合。
// 用来控制CheckBox的选中状况
private static Set<Integer> selectSet;
下面这一段代码是在getview()中添加的,可以根据具体需求去相应的添加。
checkBox_edit.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
selectSet.add(position);
}
if (!isChecked) {
if (selectSet.contains(position)) {//这个比较重要,如果点击选中这个位置就会存在Set集合当中,当再次点击它就取消了,所以也要从集合中移除。
selectSet.remove(position);
}
}
}
});
在我解决这个问题的时候还衍生了很多其他的问题,但是需求没有,所以也就没去弄。这里既然是写博客,那么就一起总结一下吧。
关于全选,全部取消和反转选择,这里大家就要使用HashMap集合啦。
在adapter当中初始化一个静态的HashMap<Integer,Boolbean>集合,为它添加set,get方法,并且根据集合的大小为它添加数据,默认false。在getview()方法中做一下操作。
1.设置checkbox点击状态根据position得到集合中对应的值。
2.添加点击事件,将点击状态存入集合当中,
当然实现上述三种功能就是对HashMap集合内数据的操作;
1.全选,设集合值都为true。
2.取消,设置集合内的值都为false。
3.反转就是遍历集合将true设置为false,false设置为true即可。
当然还有人会遇到当添加了checkbox之后listview点击不了的问题,这里自己也是出于学习,大概的说一下吧,事件分发会在下一节详细说明,大神请指正。关于这个问题就和android的事件分发机制就有关系了。
Android为什么要有事件分发呢?因为它是按照层排列,他如何知道你点击的哪一层呢,就需要用到事件分发了.
说到事件分发可能就会想起那三个威武的方法:事件分发(dispatchTouchEvent(MotionEvent ev))、事件拦截(onInterceptTouchEvent(MotionEvent ev))、事件响应(onTouchEvent(MotionEvent ev)),其中ViewGroup响应这三个方法。这里由于checkbox消费了这个点击事件,也就是事件响应返回值为true。所以将它包裹的listview就无法去响应点击事件了,因为点击已经被checkbox消费了。这里如果想要点击listview就去选中checkbox,方法也很简单,如下:
1,设置 checkbox无法响应点击事件
[html] view
plain copy
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
2.根据item的点击情况,给checkbox赋值
[java] view
plain copy
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
ViewHolder holder = (ViewHolder) view.getTag();
holder.mCheckBox.toggle(); //得到checkbox逆其状态设置。
MyShowAdapter.getIsSelected().put(position, holder.mCheckBox.isChecked());
}
});
ok,好像就这么多了,如果大家还有其他关于这方面的问题可以欢迎留言,一起探讨。
相关文章推荐
- 58.The PART_CODE column in the SPARES table contains the following list of values:
- android 存储目录
- Fragment——创建一个Fragment
- Express 路由
- hdu4081Qin Shi Huang's National Road System【次小生成树】
- linux中的前台任务、后台任务和守护进程
- Android抽象布局——include、merge 、ViewStub
- 简单内存溢出分析
- 【实战Java高并发程序设计 1】Java中的指针:Unsafe类
- 软件工程概论1
- ORB算法分析
- NSNotificationCenter 深入使用
- 软件项目工作流程图
- iphone 拨打电话的 两种方法-备
- Android开发常用命令行
- Android中Application类用法
- Python——正则表达式(1)
- nginx 高并发配置参数
- java7新特性监听文件夹改变
- 目标检测中背景建模方法