Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make a RecyclerView not clickable and pass onClick event to parent view?

Is it possible to make a RecyclerView not clickable? I want this because my RecyclerView just shows some small icons, within a clickable CardView. So if someone taps the icons, it should just click (and animate) the parent CardView instead.

I have tried the following:

  1. recyclerView.setClickable(false);
  2. recyclerView.setFocusable(false);
  3. Extend RecyclerView and make onTouchEvent(MotionEvent) return false.
  4. Use method 3 above and use itemView.setClickable(false); in the RecyclerView Adapter. This works, the click is sent to the parent. However, now the RecyclerView is not scrollable anymore.
  5. Set clickable="false", focusable="false", focusableInTouchMode="false" in inflated list item XML. (See comment @Ibrahim)
  6. Call recyclerView#setLayoutFrozen(true) and itemView.setClickable(false);. This works, but has the same issue as #4.

Any ideas how to disable and pass through the click events of the RecyclerView to the parent view? Note that the RecyclerView still needs to be scrollable (horizontal).


EDIT:
User @c.dunlap suggested to set OnClick listeners to the icons, and just "redirect" the click to the parent's click action. This would work, but there won't be a click animation on the parent view. And if someone clicks outside an itemView - but still inside the RecyclerView (e.g. ItemDecoration padding) - the click is not detected. So unfortunately this is not a solution.

like image 837
Thomas Vos Avatar asked Jul 24 '17 20:07

Thomas Vos


People also ask

How Pass Click event from parent to child in android?

Declare your TextView not clickable / focusable by using android:clickable="false" and android:focusable="false" or v. setClickable(false) and v. setFocusable(false) . The click events should be dispatched to the TextView 's parent now.

What is ViewHolder in RecyclerView?

A ViewHolder describes an item view and metadata about its place within the RecyclerView. RecyclerView. Adapter implementations should subclass ViewHolder and add fields for caching potentially expensive View. findViewById(int) results.


2 Answers

You should extend the parent View and intercept the click, so the recyclerview doesn't receive it.

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

Credits to: Solution

like image 63
nsL Avatar answered Sep 25 '22 18:09

nsL


My preferred way of handling things like this is to attach a listener from your adapter that will be called when each icon in your recycler view is clicked. Then your activity can respond in the appropriate way. For instance:

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();
    }

}

Then in your activity, you can simply create an instance of MyAdapterListener and set it as the listener for your Recycler View's adapter. Then when iconClicked() function is triggered, execute the code that would be executed on parent click.

like image 45
c.dunlap Avatar answered Sep 24 '22 18:09

c.dunlap