web-dev-qa-db-fra.com

Ajouter clickListner pour le bouton dans une carte visualisée à l'aide d'une recyclerView

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 

12
AnoopDV

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
        }
    });
}
36
ρяσѕρєя K

Définissez votre onClicklistener dans la méthode onBindViewHolder dans Custom Adapter.

2
Pradeet Swamy

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)
              }
         });
      }

}
0
Rohit Singh