我的每个列表项都有一个Star(样式复选框),用于使项目最喜欢,并且可以单击项目本身(整行)以打开项目。
它有效,但问题是稍微点击星星会导致主ListItem的点击事件触发,我试图通过填充/边距修复此问题但是点击该填充区域导致点击主列表项目导致当用户错过了几个像素点击星形时要打开的项目。
什么是忽略列表项目点击的最佳方式,左边是一个小的边距,完全在明星的上方和下方以及右边?
(如何忽略下图中红色区域的点击?)
答案 0 :(得分:0)
到目前为止,我认为填充是最好的解决方案。为您喜爱的按钮提供足够的填充。但是如果你说你已经这样做了,那么另一种选择是不使用ListView onItemClickListener并对行项使用单独的onClickListener。例如,您可以通过为子项提供权重来修改ListView项目行布局(一个用于打开项目详细信息的视图,另一个用于您喜欢的按钮),并将两个onClickListener应用于两者。
答案 1 :(得分:0)
在需要添加操作的每个视图上添加标记然后使用view.gettag()并打开标记
答案 2 :(得分:0)
经过大量调查后,解决这个问题的最简单方法是:
将其添加到列表项布局的根元素:
android:descendantFocusability="blocksDescendants"
将此添加到" Star" /复选框的父级,在我的情况下,复选框位于LinearLayout内部,其中包含一些填充,因此我将其添加到我的LinearLayout:
android:clickable="true"
这会导致"点击"我的CheckBox周围的LinearLayout被它吞噬,并且不会进入ListItem响应的ListItem OnClick事件。
我的ListItem布局的整个代码如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:addStatesFromChildren="false"
android:descendantFocusability="blocksDescendants"
android:id="@+id/listitem" >
<LinearLayout
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center_vertical">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:text="Item 1"
/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:clickable="true"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="right">
<Space
android:layout_width="15dp"
android:layout_height="match_parent"/>
<CheckBox
android:id="@+id/favouriteCheckBox"
android:button="@drawable/checkbox_selector"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:gravity="center"
android:layout_gravity="fill"
android:visibility="visible" />
<Space
android:layout_width="15dp"
android:layout_height="match_parent"/>
</LinearLayout>
</LinearLayout>