ListView的item单击事件与item布局中控件单击事件的冲突问题

原则:先获取焦点,再执行触摸onTouch事件,再执行单击事件. 当你按下按钮不放,移动到按钮外再松手,这样是不会执行按钮的单击事件的,因为按下和松开的坐标不同

当点击ListView的时候,如果此时的item中有能自动获取焦点的控件(比如按钮,单选框...等等),那么这些控件就会把点击item的焦点抢到,也就无法实现item的单击事件了.但是抢到焦点你又没点击到按钮上,那按钮的单击事件也不会响应,这也就有点占着茅坑不拉屎的感觉了

比如在listView上放一个Button:
我们可以触发Button的点击事件,但是item的点击事件并不会被触发,也就是说,Button控件抢夺了item的焦点事件,
使得item不能触发相应的点击事件,那么,如果我们既想触发Button的点击事件,又想触发item的点击事件,我们应该怎么做呢?
这里有二种解决方案
* 方法1:将button的属性设为: android:focusable="false" 当然你也可以在代码中设置
* 方法2:设置item的布局的根属性:android:descendantFocusability="blocksDescendant"

我们可以发现,其实这两种方法都是为了让Button等控件不能获取焦点,从而使得item可以响应点击事件。
第二种方法使用起来相对方便,因为它是将item布局中的其他所有控件都设置为不能自动获取焦点。

* 由于button是可以自动获取焦点的,所以在点击item的时候,button会把item的单击事件给抢走,
* 但是如果是在item上加一个textView的单击事件,就不会跟item的单击事件有冲突,因为textView不能自动获取焦点

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:descendantFocusability="blocksDescendants"    //方法二的使用,在item布局中加上这个属性
    android:layout_height="match_parent">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btItem"
        android:text="点我"/>
</LinearLayout>
android:descendantFocusability属性共有三个取值,分别为
 beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup 只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup 会覆盖子类控件而直接获得焦点(也就是当点击item的时候,不让子控件抢到焦点,除非是点到了子控件上才让子控件获取)


2.当RecyclerView的item中有edittext时,RecyclerView会自动滚,被编辑框获取了焦点,解决办法:在RecyclerView布局中加上:
android:descendantFocusability="beforeDescendants"

 



posted @ 2016-09-22 10:50  ts-android  阅读(9226)  评论(0编辑  收藏  举报