Listview中嵌套Checkbox的简单解决办法

最近项目中做了一个关于批量删除的这样一个操作,以前是会做的,谁知道记性不好忘光了,经过一番折腾还是完美的实现了,相信后面还有无数个和我一样的渣渣会遇到这个问题,那么就让我来分享一下咯。

当然这个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

  1. android:clickable="false"  
  2.         android:focusable="false"  
  3.         android:focusableInTouchMode="false"   
  4.  

2.根据item的点击情况,给checkbox赋值

 

 

[java] view plain copy

  1. mListView.setOnItemClickListener(new OnItemClickListener() {  
  2.   
  3.             @Override  
  4.             public void onItemClick(AdapterView<?> parent, View view,  
  5.                     int position, long id) {  
  6.                 ViewHolder holder = (ViewHolder) view.getTag();   
  7.                 holder.mCheckBox.toggle();  //得到checkbox逆其状态设置。
  8.                 MyShowAdapter.getIsSelected().put(position, holder.mCheckBox.isChecked());  
  9.             }  
  10.         });  
  11.  

ok,好像就这么多了,如果大家还有其他关于这方面的问题可以欢迎留言,一起探讨。

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值