web-dev-qa-db-fra.com

onclicklistener sur l'élément spécifique de recyclerview dans Android

Je vais poser une question très basique, mais je suis coincé dedans pendant longtemps.

 

après l'affichage de la carte, il y a un recycleview qui a 2 images dans chaque ligne. Maintenant, je veux créer l'auditeur de clic sur les images plutôt que le recycleview. 

la mise en page correspondante (layout_main.xml) de cette activité (MainActivity.Java) ne contient que recyclerview. les éléments de chaque ligne sont dans une autre disposition (layout_images.xml). Je reçois les images de layout_images.xml et les gonfle dans la classe d'adaptateur (Adapter.Java).

maintenant, comment mettre action auditeur sur les images uniquement.

deuxièmement, je veux obtenir l'image sur laquelle j'ai cliqué. comment obtenir cela. comme quand on clique sur une vue on crée une méthode

public void onClick(View view){
    // some code here
}

où view est l'objet sur lequel nous avons cliqué. dans mon cas, comment obtenir l'image sur laquelle j'ai cliqué. en utilisant le transtypage, il se peut qu'il lève une exception lorsque l'utilisateur ne clique pas sur l'image.

6
Sarvesh

Plusieurs événements onClick dans un recyclerView:

    public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener{

            public ImageView iconImageView;
            public TextView iconTextView;

            public MyViewHolder(final View itemView) {
                super(itemView);

                iconImageView = (ImageView) itemView.findViewById(R.id.myRecyclerImageView);
                iconTextView = (TextView) itemView.findViewById(R.id.myRecyclerTextView);
    // set click event
                itemView.setOnClickListener(this);
                iconTextView.setOnClickListener(this);
// set long click event
                iconImageView.setOnLongClickListener(this);
            }

            // onClick Listener for view
            @Override
            public void onClick(View v) {

                if (v.getId() == iconTextView.getId()){
                    Toast.makeText(v.getContext(), "ITEM PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(v.getContext(), "ROW PRESSED = " + String.valueOf(getAdapterPosition()), Toast.LENGTH_SHORT).show();
                }
            }


            //onLongClickListener for view
            @Override
            public boolean onLongClick(View v) {

                final AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
                builder.setTitle ("Hello Dialog")
                        .setMessage ("LONG CLICK DIALOG WINDOW FOR ICON " + String.valueOf(getAdapterPosition()))
                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                            }
                        });

                builder.create().show();
                return true;
            }
        }

Pour obtenir sur quel élément vous avez cliqué, vous faites correspondre l'identifiant de la vue, à savoir v.getId () == yourViewItem.getId ()

5
Rohitashv jain

vous devez définir onclicklistener sur imageviews dans la méthode onBindViewHolder, reportez-vous aux LDC suivants pour référence (le code doit être dans la méthode onBindViewHolder)

  holder.imageView1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               //put your code for first imageview here
            }
  holder.imageView2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               //put your code for second imageView here
            }
3
inkedTechie

implémentez le View.OnClickListener dans votre classe ViewHolder et implémentez la méthode onClick. Définissez ensuite l’auditeur de clic de votre ImageView sur cet écouteur de clic. Ajoutez la fonctionnalité requise dans la méthode onClick. Si vous souhaitez implémenter la fonctionnalité de clic dans une autre classe, créez simplement une interface et déclarez une méthode de clic dans celle-ci. Vous pouvez implémenter cette méthode dans l'activité/le fragment qui contient ce RecycleView. Ensuite, à partir de la méthode onClick de vos détenteurs de vue, vous pouvez appeler la méthode d'interface. 

1
Bhushan

In Recycle View Holder , Écrivez votre code d'auditeur onclick à l'intérieur. 

    @Override
    public void onBindViewHolder(CardHolder holder, final int position) {
       holder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              //TODO
            }
        }
   }
1
Madhukar Hebbar

Vous pouvez vérifier avec tag ou il d'élément comme ceci:

public void onClick(View view){
if(view.getId() == image1.getId())
{

}else if(view.getId() == image2.getId())
{}

}
0
nilkash

Tout d’abord, définissez onclickListener sur chaque vue sur laquelle vous souhaitez cliquer. Bon endroit pour le faire dans viewHolderConstructor. par exemple

  public class GalleryManyViewHolder extends RecyclerView.ViewHolder {

    @BindView(R.id.im_img) RoundedCornersImageView imImg;
    @BindView(R.id.tv_title) MyTextView tvTitle;
    @BindView(R.id.tv_label) MyTextView tvLabel;
    @BindView(R.id.tv_date) MyTextView tvDate;
    @BindView(R.id.im_gallery_one) RoundedCornersImageView imGalleryOne;
    @BindView(R.id.im_gallery_two) RoundedCornersImageView imGalleryTwo;
    @BindView(R.id.im_gallery_three) RoundedCornersImageView imGalleryThree;
    @BindView(R.id.im_gallery_four) RoundedCornersImageView imGalleryFour;
    @BindView(R.id.tv_more) MyTextView tvMore;
    @BindView(R.id.root) RelativeLayout root;

    public GalleryManyViewHolder(View view) {
      super(view);
      ButterKnife.bind(this, view);
      view.setOnClickListener(onClickListener);
      imGalleryOne.setOnClickListener(onClickListener);
      imGalleryTwo.setOnClickListener(onClickListener);
      imGalleryThree.setOnClickListener(onClickListener);
      imGalleryFour.setOnClickListener(onClickListener);
      view.setTag(this);

    }

En général, vous n'avez pas besoin de créer quoi que ce soit de spécifique avec cette vue, comme la définition de balises (Certaines bibliothèques utiles comme Glied, qui définit ses propres balises sur images, ne fonctionneront pas correctement si vous définissez votre propre balise. Dans clickListener, positionnez l'adaptateur sur la être capable de récupérer les données correspondantes

View.OnClickListener onClickListener = new View.OnClickListener() {
    @Override public void onClick(View v) {
      View view = v;
      View parent = (View) v.getParent();
      while (!(parent instanceof RecyclerView)){
        view=parent;
        parent = (View) parent.getParent();
      }
      int position = recyclerView.getChildAdapterPosition(view);
}

comme décrit ici Puis, en vérifiant les vues, identifiez ce que vous voulez faire.

switch (v.getId()) {
            case R.id.im_gallery_one: {
              p = 0;
            }
            break;
            case R.id.im_gallery_two: {
              p = 1;
            }
            break;
            case R.id.im_gallery_three: {
              p = 2;
            }
            break;
            case R.id.im_gallery_four: {
              p = 3;
            }
            break;
          }
0
Yarh