您的位置:首页 > 其它

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,好像就这么多了,如果大家还有其他关于这方面的问题可以欢迎留言,一起探讨。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: