bug 重现:通过 mListView.setOnItemClickListener 设置 item 点击事件,正常情况下没有问题,但当 item 里面嵌套了抢焦点的控件(比如 Button ,CheckBox 等),那么点击 item 的时候,Button 等抢焦点的控件会抢先反应,就会导致点击 item 时没有反应。
解决办法:想要 item 有自己的焦点,Button 等控件有自己的焦点的话,需要在 item 的根控件里面设置 android:descendantFocusability="blocksDescendants",这个属性值表示子有子的焦点,父有父的焦点。
java 代码
1 2 3 4 5 6
   | mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {     @Override     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {         Log.i(TAG, "onItemClick: ------");     } });
  | 
 
item 布局文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
   | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent"     android:layout_height="wrap_content"     android:descendantFocusability="blocksDescendants"     android:orientation="horizontal">
      <!--标题-->     <TextView         android:id="@+id/tv_title"         android:layout_width="0dp"         android:layout_height="wrap_content"         android:layout_weight="1"         android:singleLine="true"         android:text="标题" />
      <!--删除按钮-->     <Button         android:id="@+id/bt_cancel"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text="删除"/>
  </LinearLayout>
   | 
 
属性 android:descendantFocusability 的值有三种:
1 2 3
   | beforeDescendants:viewgroup会优先其子类控件而获取到焦点 afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点 blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点,也就是各有各的焦点
   |