Android自定义ListView单击事件失效的解决方法
Android自定义ListView单击事件失效的解决方法 Android中实现自定义ListView是一种常见的需求,但是有时我们发现单击事件失效了,无法响应onItemClick方法。这是因为ListView中的每一项item都包含了一些子控件,这些子控件会默认获取焦点,从而导致点击事件失效。 解决这个问题的关键是使用android:descendantFocusability="blocksDescendants"属性,该属性定义了ViewGroup和其子控件之间的关系。该属性有三种值:beforeDescendants、afterDescendants和blocksDescendants。 * beforeDescendants:ViewGroup会优先其子类控件而获取到焦点。 * afterDescendants:ViewGroup只有当其子类控件不需要获取焦点时才获取焦点。 * blocksDescendants:ViewGroup会覆盖子类控件而直接获得焦点。 在我们的例子中,我们使用blocksDescendants属性来覆盖子控件的焦点,从而使ListView的单击事件生效。 在实现自定义ListView时,我们需要继承ArrayAdapter,并在Adapter中定义每一项item的布局和内容。在布局文件中,我们需要添加android:descendantFocusability="blocksDescendants"属性,以便让ListView的单击事件生效。 下面是一个示例布局文件: ```xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:descendantFocusability="blocksDescendants"> <!-- item布局 --> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="5dp"> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@drawable/message_oc" /> <TextView android:id="@+id/textTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="title" android:textSize="25dp" android:layout_marginLeft="15dp"/> <TextView android:id="@+id/textDate" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:text="date" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/textMessage" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="textMultiLine" android:text="message" android:textSize="20dp"/> </LinearLayout> </LinearLayout> ``` 在这个示例中,我们在根目录的LinearLayout中添加了android:descendantFocusability="blocksDescendants"属性,以便让ListView的单击事件生效。 使用android:descendantFocusability="blocksDescendants"属性可以解决Android自定义ListView单击事件失效的问题,但需要注意的是,这个属性只能在ListView的item布局中生效,而不能在ListView的根目录中生效。
- 粉丝: 3
- 资源: 968
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助