Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parent click event not firing when recyclerview clicked

I have a RecyclerView which is in a CardView that has a couple of TextViews. The CardView has a OnClickListener set and is fired off when clicking on the TextViews, but does not fire when clicking on the RecyclerView.

Here is what the CardView looks like:

<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:card_view="http://schemas.android.com/apk/res-auto"     android:id="@+id/card_view"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:layout_margin="5dp"     card_view:cardCornerRadius="4dp"     card_view:cardElevation="5dp">      <LinearLayout         android:layout_width="match_parent"         android:layout_height="match_parent"         android:orientation="vertical"         android:weightSum="100"         android:minWidth="100dp">          <TextView             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:textAppearance="?android:attr/textAppearanceLarge"             android:id="@+id/text1"             android:textColor="@color/abc_primary_text_material_light"             android:layout_weight="1"             android:layout_gravity="center_horizontal" />          <android.support.v7.widget.RecyclerView             android:id="@+id/recyclerView"             android:layout_width="match_parent"             android:layout_height="0dp"             android:listSelector="@color/highlighted_text_material_light"             android:layout_weight="98" />          <View             android:layout_width="match_parent"             android:layout_height="1dp"             android:background="@android:color/black" />          <RelativeLayout             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:id="@+id/relativeSummary"             android:orientation="horizontal"             android:layout_weight="1">              <TextView                 android:layout_width="wrap_content"                 android:layout_height="wrap_content"                 android:textAppearance="?android:attr/textAppearanceLarge"                 android:id="@+id/text2"                 android:textAlignment="viewEnd"                 android:textColor="@color/abc_secondary_text_material_light"                 android:layout_marginLeft="5dp"                 android:layout_marginRight="5dp"                 android:gravity="start"                 android:singleLine="true"                 android:layout_alignParentLeft="true" />              <TextView                 android:layout_width="wrap_content"                 android:layout_height="wrap_content"                 android:textAppearance="?android:attr/textAppearanceLarge"                 android:id="@+id/text3"                 android:textColor="@color/abc_primary_text_material_light"                 android:layout_marginRight="5dp"                 android:layout_marginLeft="5dp"                 android:gravity="end"                 android:singleLine="true"                 android:layout_alignParentRight="true"                 android:layout_toRightOf="@+id/text2" />          </RelativeLayout>     </LinearLayout> </android.support.v7.widget.CardView> 

I do not need a click listener on this RecyclerView and really only need the parent view's click event to fire when the RecyclerView is clicked (The same goes for the OnLongClick event). I also need the RecyclerView to scroll. Is the RecyclerView some how eating the click event and not passing it up to the parent?

like image 430
Derek Avatar asked May 24 '15 03:05

Derek


2 Answers

There is a better solution. That is, subclass your CardView:

public class InterceptTouchCardView extends CardView {      public InterceptTouchCardView(Context context) {         super(context);     }      public InterceptTouchCardView(Context context, AttributeSet attrs) {         super(context, attrs);     }      public InterceptTouchCardView(Context context, AttributeSet attrs, int defStyleAttr) {         super(context, attrs, defStyleAttr);     }      /**      * Intercept touch event so that inner views cannot receive it.      *       * If a ViewGroup contains a RecyclerView and has an OnTouchListener or something like that,      * touch events will be directly delivered to inner RecyclerView and handled by it. As a result,       * parent ViewGroup won't receive the touch event any longer.      */     @Override     public boolean onInterceptTouchEvent(MotionEvent ev) {         return true;     } } 
like image 149
ywwynm Avatar answered Sep 19 '22 23:09

ywwynm


recyclerView.setLayoutFrozen(true); 

just setLayoutFrozen true after setAdapter for recyclerView

like image 25
Thomas Avatar answered Sep 18 '22 23:09

Thomas