Add clickListner for button inside a cardView populated using a recyclerView

45,767

Solution 1

Add click listener for button inside a cardView populated using a recyclerView

Add click event to buttons which is in RecyclerView as:

1. Get Button from xml in same way as doing for TextView in MyViewHolder class:

public static class MyViewHolder extends RecyclerView.ViewHolder{
    TextView textView;
    Button btnButton1;
    MyViewHolder(View view){
        super(view);
        this.textView= (TextView) view.findViewById(R.id.card_text);
        this.btnButton1= (Button) view.findViewById(R.id.button1);
        ... do same for other Button
    }
}

2. Add setOnClickListener method for Button in onBindViewHolder method:

@Override
public void onBindViewHolder(MyViewHolder myViewHolder, int i){
     myViewHolder.textView.setText(list.get(i));
      myViewHolder.btnButton1.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            /// button click event
        }
    });
}

Solution 2

Define your onClick listener on onBindViewHolder method in CustomAdapter.

Solution 3

Let's say you have:

<android.support.v7.widget.CardView
    android:id="@+id/cv"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="4dp"
    android:elevation="4dp"
    app:cardCornerRadius="2dp">

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="16dp">

        <TextView
            android:id="@+id/listText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:padding="8dp"
            android:text="New Text" />

        <ImageButton
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/listText"
            android:layout_alignParentRight="true"
            android:onClick="onClickBotonBorrar"
            android:background="?android:selectableItemBackground"
            android:src="@drawable/ic_action_borrar" />
    </RelativeLayout>

</android.support.v7.widget.CardView>

Note this part: android:onClick="onClickBotonBorrar"

On your Activity add this:

public void onClickBotonBorrar (View v) {
//Do whatever you want when user clicks on your ImageButton
    }

It is recommended not to have the click event inside your adapter but inside your activity.

Note: It's similar for button

Share:
45,767
AnoopDV
Author by

AnoopDV

I am a student who is really passionate about creating magic using coding

Updated on August 23, 2020

Comments

  • AnoopDV
    AnoopDV almost 4 years

    I have a cardView

    card_contents.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <android.support.v7.widget.CardView android:layout_width="match_parent"
        android:layout_height="150dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:id="@+id/card_view">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#ffa3a4a6">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/card_text"
            android:layout_gravity="center"
            android:gravity="center"
            android:text="B.E"
            android:layout_centerInParent="true"
            />
         <Button
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:id="@+id/button1"
             android:layout_toLeftOf="@+id/view"
             android:layout_alignParentLeft="true"
             android:text="2010"
             android:textColor="#000000"
             android:background="@android:color/transparent"
             />
           <View
               android:layout_width="2dp"
               android:layout_height="@dimen/abc_action_button_min_height_material"
               android:layout_centerHorizontal="true"
               android:id="@+id/view"
               android:background="@android:color/black"
               android:layout_alignParentBottom="true"
               />
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/button2"
                android:layout_alignParentBottom="true"
                android:layout_alignParentRight="true"
                android:layout_toRightOf="@+id/view"
                android:background="@android:color/transparent"
                android:textColor="@android:color/black"
                android:text="2014"/>
        </RelativeLayout>
        </android.support.v7.widget.CardView>
       </RelativeLayout>
    

    MainActivity.class

    public class MainActivity extends ActionBarActivity {
    
    RecyclerView recyclerView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
    
    
        List<String> list=new ArrayList<String>();
        list.add("Hello");
        list.add("Hello World");
        list.add("Hello World Beings");
    
        recyclerView=(RecyclerView)findViewById(R.id.recycler_view);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setHasFixedSize(true);
    
        RecyclerView.LayoutManager layoutManager=new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
    
        RecyclerView.Adapter adapter=new MyAdapter(list);
        recyclerView.setAdapter(adapter);
    
    
    
    
    }
    
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
    
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
    
        return super.onOptionsItemSelected(item);
    }
    }
    

    MyAdapter.class

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    List<String> list;
    public MyAdapter(List<String> list){
        this.list=list;
    }
    
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v=LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_contents,viewGroup,false);
        return new MyViewHolder(v);
    }
    
    @Override
    public void onBindViewHolder(MyViewHolder myViewHolder, int i) {
            myViewHolder.textView.setText(list.get(i));
    }
    
    @Override
    public int getItemCount() {
        return list.size();
    }
    
    public static class MyViewHolder extends RecyclerView.ViewHolder{
        TextView textView;
        MyViewHolder(View view){
            super(view);
            this.textView= (TextView) view.findViewById(R.id.card_text);
        }
    }
    }
    

    I actually want to set click listener for the buttons inside the cards and launch new activity depending on which button is pressed and on what card it is pressed. Is there a way to accomplish this? I have looked around but did'nt find any answers for setting click listeners for items inside of a cardView.I am new to android and any help will be appreciated. Thanks in advance

  • AnoopDV
    AnoopDV over 9 years
    Thanks but what if i want to use the same adapter to populate normal recycler views with only text views
  • ρяσѕρєя K
    ρяσѕρєя K over 9 years
    @user3359069: i think normally it's not possible but you can do it by using if-else conditions, show/hide views which is not valid way. as my suggestion create a separate Adapter for other row design by which you will develop independent modules which is very loosely coupled .Thanks
  • Tomas K
    Tomas K almost 9 years
    How do i know in which recyclerview the button is pressed?
  • Marcus Franzen
    Marcus Franzen almost 9 years
    @TomasK you can Store i in a final variable like final Integer position in the onBindViewHolder method and use it then in the onClick method.
  • AndroidNewBee
    AndroidNewBee over 7 years
    @ρяσѕρєяK I have a recycler view with 2 card views having two buttons how do I change text of one card view button without effecting the other.I have also posted a question for the same please help if you can this is the link to the question stackoverflow.com/questions/40299759/…