Add clickListner for button inside a cardView populated using a recyclerView
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
AnoopDV
I am a student who is really passionate about creating magic using coding
Updated on August 23, 2020Comments
-
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 over 9 yearsThanks but what if i want to use the same adapter to populate normal recycler views with only text views
-
ρяσѕρєя 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 almost 9 yearsHow do i know in which recyclerview the button is pressed?
-
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 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/…