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"