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:
recyclerView.setClickable(false);
recyclerView.setFocusable(false);
RecyclerView
and make onTouchEvent(MotionEvent)
return false
.itemView.setClickable(false);
in the RecyclerView
Adapter. This works, the click is sent to the parent. However, now the RecyclerView
is not scrollable anymore.clickable="false"
, focusable="false"
, focusableInTouchMode="false"
in inflated list item XML. (See comment @Ibrahim)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.
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.
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.
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With