自定义可勾选的ListView

来源:互联网 发布:淘宝的标志图片 编辑:程序博客网 时间:2024/06/06 14:44

在listview到item里面包含checkbox,是否遇到了选中一写条目,然后往下拖动再拖回来,选择到条目消失?

是否觉得用android.R.layout.simple_list_item_checked来作为list item的layout很方便且没有上面到问题,但是觉得那个layout无法自定义(checkbox在右边,我想放在左边)?

答案是可以的。

      针对第一个问题,网上说把checkbox到状态更新到adpter的data set里面,但是完全没有必要自己去做! listview已经为我们维护了条目的选中与否的状态(特别是在推出了action bar之后,不熟悉这个场景的可以跑一下4.0下的ApiDemo里的List15.java)。这个类就是SparseBooleanArray。

      “ListView就会把被选中的item项或者取消选中的item项的potion和bool值存进一个叫SparseBooleanArray的集合中,这里要注意一下,当你选中某一项的时候,他会存入,当你取消这一项的时候他会去修改这一项的bool值,将true改为false,但是并没有从这个集合中取消掉,这样通过listView的getCheckedPositions方法得到的集合中,就会包含已经取消的那一项了,这个方法并不会只返回value为true的元素”(摘自http://cnitcastsdut.blog.163.com/blog/static/1460180932010101774829201)

      所以通过for (int i = 0; i < sparseBooleanArray.size(); ++i)遍历,当sparseBooleanArray.valueAt(i)==true即遇到了选中的条目时,我们可以把sparseBooleanArray.keyAt(i)的值(即选中条目的position)保存起来。用于删除条目等操作。

      listview条目的选中状态还要用打勾与否的图片来显示,checkbox就正好可以用来干这事,不用自己贴图。当然摆放位置可以自己定。注意设置checkbox的android:clickable="false",并且将父layout节点设置android:descendantFocusability="blocksDescendants"属性,这样checkbox就被‘废’成indicator了。

      重要的是你的自定义View要实现Checkable接口的setChecked(boolean checked)方法(这个方法会被listview反复调用)。在里面做mCheckBox.setChecked(checked)。还有ListView的setItemChecked(int position, boolean value)就相当于实现让人去点击选中和点击取消选中。

示例代码下载

0 0