如何使RecyclerView无法点击并将onClick事件传递给父视图?

时间:2017-07-24 20:10:07

标签: java android android-layout android-recyclerview

是否可以使RecyclerView无法点击?我想这样做是因为我的RecyclerView只是在可点击 CardView中显示了一些小图标。因此,如果有人点击图标,则只需点击(并动画)父CardView

我尝试了以下内容:

  1. recyclerView.setClickable(false);
  2. recyclerView.setFocusable(false);
  3. 扩展RecyclerView并让onTouchEvent(MotionEvent)返回false
  4. 使用上面的方法3并在itemView.setClickable(false);适配器中使用RecyclerView。这样做,点击发送给父母。但是,现在RecyclerView不再可滚动了。
  5. 在充气列表项XML中设置clickable="false"focusable="false"focusableInTouchMode="false"。 (见评论 @Ibrahim
  6. 致电recyclerView#setLayoutFrozen(true)itemView.setClickable(false);。这有效,但与#4有相同的问题。
  7. 有关如何禁用RecyclerView的点击事件并将其传递到父视图的任何想法?请注意,RecyclerView仍然需要可滚动(水平)。


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

3 个答案:

答案 0 :(得分:5)

您应该扩展父视图并拦截点击,以便recyclelerview不会收到它。

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

致记:Solution

答案 1 :(得分:3)

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

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()函数时,执行将在父单击时执行的代码。

答案 2 :(得分:-1)

我有同样的问题,在我尝试了更多的东西后,我在recyclerview上再使用了一个布局。

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v7.widget.RecyclerView
        android:layoutwidth="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>

之后你可以看到并消除了“LinearLayout”。 这100%工作。