Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OnClickListener for CardView?

How do I attach an OnClickListener to a CardView? I want every single card to have a different action when clicked.

I have a RecyclerView that has a custom adapter for displaying the cards. This is how it's implemented.

like image 455
MikkoP Avatar asked Nov 22 '14 19:11

MikkoP


People also ask

How do I use OnClickListener?

In Android, the OnClickListener() interface has an onClick(View v) method that is called when the view (component) is clicked. The code for a component's functionality is written inside this method, and the listener is set using the setOnClickListener() method.

What is difference between CardView and RecyclerView?

The RecyclerView is a more advanced and more flexible version of the ListView. This new component is a big step because the ListView is one of the most used UI widgets. The CardView widget, on the other hand, is a new component that does not “upgrade” an existing component.

What is new view OnClickListener ()?

View.OnClickListener is an interface, you don't call it, but creates a new instance of it ( new View.OnClickListener() is a call to the constructor) The instance you create is of anonymous class that implements View.OnClickListener , in the brackets right under new View.OnClickListener()


2 Answers

You should implement the OnItemClickListener in your ViewHolder class, and pass the current item to the ViewHolder instances on every onBindViewHolder().

From this post:

public static class ViewHolder extends RecyclerView.ViewHolder {     public View view;     public Item currentItem;      public ViewHolder(View v) {         super(v);         view = v;         view.setOnClickListener(new View.OnClickListener() {             @Override public void onClick(View v) {                 // item clicked             }         });     } }  @Override public void onBindViewHolder(ViewHolder viewHolder, int i) {     viewHolder.currentItem = items.get(i); } 
like image 144
Andras K Avatar answered Sep 22 '22 00:09

Andras K


This is my solution for this problem:

  1. First add reference to View view object in ViewHolder class

    public static class TouristViewHolder extends RecyclerView.ViewHolder{     public ImageView img;     public TextView name;     public TextView description;     public RatingBar rating;     public View view;               // <----- here      public TouristViewHolder(final View view) {         super(view);         this.view = view;            // <----- here         // ... rest of code    } } 
  2. Next, in method onBindViewHolder(final MyViewHolder holder, final int position), I add a listener and set new Intent.

    @Override public void onBindViewHolder(TouristViewHolder touristViewHolder, final int position) {  touristViewHolder.view.setOnClickListener(new View.OnClickListener() {  // <--- here     @Override     public void onClick(View v) {         Log.i("W4K","Click-"+position);         context.startActivity(new Intent(context,MainActivity.class));  // <--- here     } }); 

It works for me fine, hope it will help someone else.

like image 21
Marek Bodziony Avatar answered Sep 19 '22 00:09

Marek Bodziony