由于容器本身上的单击侦听器,无法处理单击Recycler视图中的项目

时间:2017-04-23 19:53:04

标签: java android xml android-recyclerview

我有一个使用RecyclerView的活动,列表中的每个项目如下所示。该星应该是可点击的,当用户点击它时,它应该被改为暗星。如果使用单击列表项,则会输入新活动,其中提供与所选列表项对应的更多详细信息。 :

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>

Adapter中的嵌套类为我处理点击事件。

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点击的click事件。但是,当用户点击星号时,它也被视为单击整个列表项,因为星星位于容器内。

如何单独收到星号点击,以便点击星号不会被视为点击列表项目?

修改

在列表项的android:descendantFocusability="blocksDescendants"中添加行RelativeLayout解决了问题。但任何人都可以解释它如何解决它。按名称,它应该阻止后代并吃掉点击事件。但是,行为正好相反。

4 个答案:

答案 0 :(得分:0)

反转if / else语句并为星形图像添加单击侦听器。它应该工作,因为如果没有点击星号,你想要触发recyclelerview项的监听器

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);
            secondaryIcon.setOnClickListener(this);
        }

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

希望这有帮助

答案 1 :(得分:0)

由于您只想点击星号,因此您应该为星星设置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);
    }

答案 2 :(得分:0)

您忘记将onClick听众添加到secondaryIcon

试试这个:

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);
        secondaryIcon.setOnClickListener(this);    
    }

    @Override
    public void onClick(View v) {
        if(v.getId() == secondaryIcon.getId())
        {
            Log.w("RecyclerView","star clicked");
            itemClickCallback.onSecondaryIconClick(getAdapterPosition()); 
        }
        else
        {
            Log.w("RecyclerView","list item clicked");
            itemClickCallback.onItemClick(getAdapterPosition());
        }
    }
}

希望这会有所帮助〜

答案 3 :(得分:0)

您还可以在回收器适配器类中为特定视图的行声明onclick项目。

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element

        holder.linRootMain.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Do your stuff here.
            }
        });

        holder.imgStart.setOnClickListner(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Do your stuff here.
            }
        });
}

我希望这会对你有所帮助。