Add clickListner for button inside a cardView populated using a recyclerView
L

4

13

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

Leong answered 7/2, 2015 at 6:27 Comment(1)
Also i want to use the same adapter for populating other recycler view with only textviews.Leong
W
38

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
        }
    });
}
Whichever answered 7/2, 2015 at 6:34 Comment(5)
Thanks but what if i want to use the same adapter to populate normal recycler views with only text viewsLeong
@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 .ThanksUnderpinning
How do i know in which recyclerview the button is pressed?Hosea
@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.Ghassan
@ρяσѕρєя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 #40300259Waldemar
D
2

Define your onClick listener on onBindViewHolder method in CustomAdapter.

Denishadenison answered 3/7, 2015 at 17:41 Comment(0)
B
1

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

Bausch answered 18/4, 2017 at 13:22 Comment(0)
C
0

Another approach would be using an Interface

1) Create an interface

public interface ItemClickListener{

   public void startSecondActivity(int index);

   public void startThirdActivity(int index);

}

2) Implement interface in your Activity

public class MainActivity extends AppcompatActivity implements ItemClickListener {

   .........

   public void startSecondActivity(int index){

            Intent i = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(i);

   }

   public void startThirdActivity(int index){

            Intent i = new Intent(MainActivity.this, ThirdActivity.class);
            startActivity(i);
   }


}

3) Use ItemListener in RecyclerViewAdapter

MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{

      private ItemListener listener;

      public MyAdapter(Context context){
           listener = (ItemListener)context;
      }

      Override
      public void onBindViewHolder(MyViewHolder myViewHolder, int position){

         myViewHolder.btnButton1.setOnClickListener(new View.OnClickListener(){

              @Override
              public void onClick(View v) {
                  listener.startSecondActivity(position)
              }
         });

         myViewHolder.btnButton2.setOnClickListener(new View.OnClickListener(){

              @Override
              public void onClick(View v) {
                   listener.startThirdActivity(position)
              }
         });
      }

}
Crossbow answered 22/12, 2018 at 11:39 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.