请问下像内置mail应用那样的ListView带CheckBox的效果怎么做?
============问题描述============
![](http://images0.cnblogs.com/blog/682843/201410/202111570121773.png)
效果说明:
就像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============
正确的引用地址是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一下就可以了