今天的第二篇博客了,每一篇都只为了记录我所做项目中遇到的一些问题。
现在我所做的项目是这样的:我做了一个读取手机通讯记录的界面,使用了ListView控件,在ListView的item中添加了一个按钮。代码编写完成后,经过模拟器运行,发现ListView的setOnItemClickListener()方法失效。
首先我怀疑是我在增加功能时不小心删去或修改了使点击事件正常的代码,但是经过检查,发现代码正确无误。
经过查找资料,搜寻百度、博客等前辈的经验,发现了疑点。
修改之前的代码是这样的:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout/>
修改后的同一段代码是这样的:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
<span style="color:#FF0000;">android:descendantFocusability="blocksDescendants" </span>>
<RelativeLayout/>
为什么会出现ListView的item点击事件的失效呢?
我在这里浅显的理解为:如果ListView的item中包含了button等同样需要点击事件监听的控件时,系统在默认情况下使item中的事件监听的控件获取焦点,使ListView失去焦点,导致无法响应setOnItemClickListener()方法。
那么添加的这个属性是什么意思呢?
descendantFocusability属性是当一个view获取焦点时,定义viewGroup和其子控件之间的关系。该属性的值有三种:beforeDescendants:viewGroup会优先其子控件而获取到焦点。
afterDescendants:viewGroup只有当子类控件不需要获取焦点时才获取焦点。
blocksDescendants:viewGroup会覆盖子类控件而直接获取焦点。
根据我要实现的效果,我要忽略子类控件即当前item中的button直接获取item焦点,因此我选用了第三个属性值。
在解决上述问题时参考了下面的文章,读者可以点击直接查看:
http://blog.csdn.net/caiwenfeng_for_23/article/details/37760197