首页 > 代码库 > 请问下像内置mail应用那样的ListView带CheckBox的效果怎么做?

请问下像内置mail应用那样的ListView带CheckBox的效果怎么做?

============问题描述============




效果说明:
就像android系统内置的mail应用那样的列表

1.如图所示,每一个Item都是左边一个CheckBox,右边是内容。
2.如果单击左边CheckBox区域的话呢,会选中该项的CheckBox,不会打开内容。
3.如果单击右边的文本内容区域的话,会打开一个新的Activity,展示邮件正文内容。
4.通过多选后,可以一次批量对列表项进行删除操作。

这个效果,我想了下,没有想到好的头绪。
我自己定义了一个Item.xml,设置好checkBox和textView,自己继承了BaseAdapter创建了对应的Adapter适配器。

问题有以下:
1.设置CheckBox的focusable为false了,不然ListView监听不到OnItemClick事件。
2.可以监听到ListView的OnItemClick事件的,单击打开新的内容Activity自然可以。
3.问题在于,我怎么能监听到CheckBox的选中/取消选中的事件,并且监听到这个选中事件后,需要把CheckBox在列表中所在的位置记录下来,保存到一个索引列表中去,记录下来每个项的选中状态。
4.如果在ListView的OnItemClick事件中,对CheckBox项进行选中状态修改固然可以,但是单击右侧内容区域时,会打开新的Activity了。如何控制根据单击区域来设定是CheckBox响应,还是打开新Activity?

============解决方案1============


其实你的问题归根到底,就是一个--由于CheckBox的存在,影响了ListView对点击事件的响应,那么你可以考虑在ListVIew的布局文件中加入android:descendantFocusability="",这样就可以避免子控件的影响了,用法你可以自己百度一下

============解决方案2============


引用 6 楼 ITbailei 的回复:
Quote: 引用 5 楼 txfast 的回复:

Quote: 引用 4 楼 ITbailei 的回复:

(1)这个涉及到事件分发机制的原理,因为CheckBox的onThoch事件会屏蔽掉父布局的单击事件,所以你可以屏蔽掉对应的事件,你可以google一下,有很多解决方案。
(2)你都说可以了自然就不是问题了。
(3)CheckBox属于ListView的item中的一项,只要得到对应item列表的数据,这都不是问题。
(4)第一个问题解决了,这当然不是问题。

综上,你其实只是问了一个问题。


1.是CheckBox的onClick事件屏蔽了容器控件的事件,设置checkbox的focusable=false就可以解决。
2.其实我想问的是,勾选CheckBox时,如何监听到CheckBox的Checked事件,并且同时获取到ListView的Postion位置参数?

实际操作时,我勾选CheckBox并不会触发ListView的OnItemClick事件的。
一样的,只要你妥善处理好这2者事件的相互影响,就不会出现相互屏蔽的事情,可以参考博客http://cache.baiducontent.com/c?m=9d78d513d9921bf801bdc9341a16a671692797124ac0d165218fd20e84652b051c31a6ac26520774d8d20c6716df4f4b9df42235775d2feddd8eca5ddcc88f357bcf6f6e2d5bc71859c419d89b18789437902da8f243a0adf045c2f38dcedf5357cf570f7a87f69c5a774e8c30ae&p=8b2a9702938c1db41fbd9b7e0d1388&newp=996ac64ad4934eaf58e8cf27584e88231610db2151ddd116&user=baidu&fm=sc&query=chekbox+%BA%CDListView%B9%B2%B4%E6&qid=971ce8bb0003e68f&p1=2
正确的引用地址是http://blog.csdn.net/gyflyx/article/details/6567701

============解决方案3============


看了 楼上的 回答真是五花八门 什么都有啊。。。
其实哪里有那么 复杂 你在getview 里面 find 到你的checkBox 然后给他设置他本身的onCheckChangeListener的监听,在adapter里面写个接口,然后在checkBox的监听里面把状态回调,在activity里面实现你的自定义接口,拿到回调的监听返回的状态(观察者模式)。 你本身的listview有自带的onItemClickListener,你在给listview设这个自带的item监听,就可以达到你要的效果了
还有,至于你说的记录状态的问题,跟这些都无关,你给每个position对应的数据(Bean)加个属性(其实就是加个成员变量,比如isCheck),当你getView里面的CheckBox监听触发的时候,将数据对应的isCheck这个属性设置为CheckBox的当前状态就可以了。 你getView里面的find到的CheckBox的状态都根据对应的数据的isCheck这个状态来设置不就好了嘛。然后当你要删除一个或多个选中的 Item其实就相当于在activity里面对触发删除的事件进行监听,并查看数据中那些数据时选中的,将这些数据从数据集合中删除,notify一下就可以了

请问下像内置mail应用那样的ListView带CheckBox的效果怎么做?