J'ai une carte
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);
}
}
}
En fait, je veux définir un écouteur de clic pour les boutons à l'intérieur des cartes et lancer une nouvelle activité en fonction du bouton sur lequel vous appuyez et de la carte sur laquelle vous appuyez. Y a-t-il un moyen d'accomplir cela? J'ai regardé autour de moi, mais je n'ai trouvé aucune réponse pour configurer les écouteurs de clic pour les éléments à l'intérieur d'un cardView. Merci d'avance
Ajouter un écouteur de clic pour un bouton à l'intérieur d'une cardView remplie à l'aide d'un recycleurVoir
Ajoutez un événement de clic aux boutons qui se trouvent dans RecyclerView
en tant que:
1. Obtenir le bouton du fichier XML de la même manière que pour TextView
dans la classe MyViewHolder
:
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. Ajouter la méthode setOnClickListener
pour le bouton dans la méthode onBindViewHolder
:
@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
}
});
}
Définissez votre onClicklistener dans la méthode onBindViewHolder dans Custom Adapter.
Disons que vous avez:
<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>
Notez cette partie: Android: onClick="onClickBotonBorrar"
Sur votre activité, ajoutez ceci:
public void onClickBotonBorrar (View v) {
//Do whatever you want when user clicks on your ImageButton
}
Il est recommandé de ne pas insérer l'événement click dans votre adaptateur, mais dans votre activité.
Note: C'est similaire pour le bouton
Une autre approche consisterait à utiliser une interface
1) Créer une interface
public interface ItemClickListener{
public void startSecondActivity(position)(int index);
public void startThirdActivity(position)(int index);
}
2) Implémenter une interface dans votre activité
public class MainActivity extends AppcompatActivity implements ItemClickListener {
.........
public void startSecondActivity(position)(int index){
Intent i = new Intent(MainActivity.this, SecondActivity.class);
startActivity(i);
}
public void startThirdActivity(position)(int index){
Intent i = new Intent(MainActivity.this, ThirdActivity.class);
startActivity(i);
}
}
3) Utiliser ItemListener dans 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)
}
});
}
}