如何使 RecyclerView 不可点击,并将 onClick 事件传递给父视图?

是否可以使一个不可点击?我想要这个,因为我只是在可点击的范围内显示一些小图标。因此,如果有人点击图标,它应该只需单击(并激活)父级。RecyclerViewRecyclerViewCardViewCardView

我尝试了以下方法:

  1. recyclerView.setClickable(false);
  2. recyclerView.setFocusable(false);
  3. 扩展并进行返回。RecyclerViewonTouchEvent(MotionEvent)false
  4. 使用上述方法 3 并在适配器中使用。这有效,点击被发送到父级。但是,现在不再可滚动。itemView.setClickable(false);RecyclerViewRecyclerView
  5. 在膨胀的列表项 XML 中设置 、 。(请参阅评论@Ibrahimclickable="false"focusable="false"focusableInTouchMode="false")
  6. 调用和 .这有效,但与#4具有相同的问题。recyclerView#setLayoutFrozen(true)itemView.setClickable(false);

任何想法如何禁用和传递到父视图的点击事件?请注意,仍需要可滚动(水平)。RecyclerViewRecyclerView


编辑:
用户@c.dunlap建议将OnClick侦听器设置为图标,只需将单击“重定向”到父级的单击操作即可。这可以正常工作,但父视图上不会有单击动画。如果有人在 itemView 外部单击 - 但仍然在项目内(例如 ItemDecoration 填充) - 则不会检测到单击。所以不幸的是,这不是一个解决方案。RecyclerView


答案 1

您应该扩展父视图并拦截单击,以便回收程序视图不会收到它。

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return true;
}

学分: 解决方案


答案 2

我处理此类事情的首选方法是从适配器附加一个侦听器,当单击回收器视图中的每个图标时,将调用该侦听器。然后,您的活动可以以适当的方式做出响应。例如:

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private MyAdapterListener mListener;

    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
         holder.itemView.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 mListener.iconClicked();
             }
         });
    }

    public void setListener(MyAdapterListener listener) {
        mListener = listener;
    }

    public interface MyAdapterListener {
        void iconClicked();
    }

}

然后,在您的活动中,您只需创建一个 MyAdapterListener 实例,并将其设置为 Recycler View 适配器的侦听器。然后,当触发函数时,执行将在父级单击时执行的代码。iconClicked()


推荐