java - 由于容器本身的点击监听器,无法处理 Recycler View 中的项目点击

标签 java android xml android-recyclerview

我有一个 RecyclerView Activity ,列表中的每个项目如下所示。星星应该是可点击的,当用户点击它时,它应该会变成暗星。如果用户单击列表项,它会进入一个新 Activity ,其中会提供与所选列表项相对应的更多详细信息。 :

enter image description here

这是列表项的 XML。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/cont_item_root"
android:layout_width="match_parent"
android:layout_height="85dp"
android:background="@drawable/background_state_drawable"
android:clickable="true"
>

<ImageView
    android:id="@+id/im_item_icon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="16dp"
    android:src="@mipmap/ic_tonality_black_36dp"
    android:layout_centerVertical="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

<TextView
    android:id="@+id/lbl_item_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/im_item_icon"
    android:layout_marginLeft="72dp"
    android:layout_marginRight="48dp"
    android:ellipsize="end"
    android:fontFamily="sans-serif"
    android:singleLine="true"
    android:text="Sois comme l'eau mon ami"
    android:textColor="@android:color/black"
    android:textSize="16sp" />

<TextView
    android:id="@+id/lbl_item_sub_title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/lbl_item_text"
    android:layout_marginLeft="72dp"
    android:layout_marginRight="48dp"
    android:ellipsize="end"
    android:fontFamily="sans-serif"
    android:singleLine="true"
    android:text="Mononc' J"
    android:textSize="14sp" />

<ImageView
    android:id="@+id/im_item_icon_secondary"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:padding="16dp"
    android:src="@mipmap/ic_star_border_black_24dp"
    android:background="@drawable/background_state_drawable"
    />

</RelativeLayout>

适配器中的嵌套类为我处理点击事件。

class DerpHolder extends RecyclerView.ViewHolder implements View.OnClickListener
    {
        private TextView title;
        private TextView subTitle;
        private ImageView thumbnail;
        private ImageView secondaryIcon;
        private View container;

        public DerpHolder(View itemView) {
            super(itemView);

            title = (TextView)itemView.findViewById(R.id.lbl_item_text);
            subTitle = (TextView)itemView.findViewById(R.id.lbl_item_sub_title);
            thumbnail = (ImageView)itemView.findViewById(R.id.im_item_icon);
            secondaryIcon = (ImageView)itemView.findViewById(R.id.im_item_icon_secondary);
            container = (View)itemView.findViewById(R.id.cont_item_root);
            container.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            Log.w("RecyclerView","Item with id : " + v.getId() + " touched");
            if(v.getId() == R.id.cont_item_root)
            {
                Log.w("RecyclerView","list item clicked");
                itemClickCallback.onItemClick(getAdapterPosition());
            }
            else
            {
                Log.w("RecyclerView","star clicked");
                itemClickCallback.onSecondaryIconClick(getAdapterPosition()); //not able to come here
            }
        }
    }

我能够进入if的第一部分,即我能够接收到listItem点击的点击事件。但是,当用户单击星标时,它也被视为整个列表项都被单击,因为星标位于容器内。

如何单独接收星号点击,不把星号点击当成列表项点击?

编辑

在列表项的 RelativeLayout 中添加行 android:descendantFocusability="blocksDescendants" 解决了这个问题。但是谁能解释一下它是如何修复的。顾名思义,它应该会阻止后代并吃掉点击事件。然而,行为是相反的。

最佳答案

既然你只想得到星星的点击,你应该只为星星设置OnClickListener:

public DerpHolder(View itemView) {
        super(itemView);

        title = (TextView)itemView.findViewById(R.id.lbl_item_text);
        subTitle = (TextView)itemView.findViewById(R.id.lbl_item_sub_title);
        thumbnail = (ImageView)itemView.findViewById(R.id.im_item_icon);
        secondaryIcon = (ImageView)itemView.findViewById(R.id.im_item_icon_secondary);
        secondaryIcon.setOnClickListener(this);
    }

关于java - 由于容器本身的点击监听器,无法处理 Recycler View 中的项目点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43575790/

相关文章:

xml - 使用 UPDATEXML 更新 Oracle 中的 XML

jquery - 为什么 JQuery 无法解析某些 xml 节点?

Android XML UI 继承

java - 保护来自客户端应用程序的服务器端输出

Android:如何检查设备上的闪光灯是否可用?

java - Android 项目在 ListView 上滑动

java - 无法从服务调用主 Activity

java - 如何转义 MessageFormat 模式字符串中的 { 字符?

java - 在Java中生成唯一且短文件名的最佳方法是什么

java - 当从 cli 运行时,简化在 eclipse 中创建的 java 程序的类路径输入?