¿Cómo puedo adjuntar un OnClickListener a un CardView? Quiero que cada tarjeta tiene una acción diferente cuando se hace clic.

Tengo un RecyclerView que tiene un adaptador personalizado para mostrar las cartas. Esto es como implementado.

InformationsquelleAutor MikkoP | 2014-11-22

3 Comentarios

  1. 35

    Debe implementar el OnItemClickListener en su ViewHolder clase, y pasar el elemento actual a la ViewHolder instancias en cada onBindViewHolder().

    De este post:

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public View view;
        public Item currentItem;
    
        public ViewHolder(View v) {
            super(v);
            view = v;
            view.setOnClickListener(new View.OnClickListener() {
                @Override public void onClick(View v) {
                    //item clicked
                }
            });
        }
    }
    
    @Override public void onBindViewHolder(ViewHolder viewHolder, int i) {
        viewHolder.currentItem = items.get(i);
    }
    • Gracias por el enlace. He definido la escucha de allí.
    • Eres bienvenido, me alegro de que podría ser de ayuda.
    • Usted puede elaborar su respuesta poco más….¿cómo puedo saber que cardView hacer clic en la fila…..Si yo uso vista,getId() devuelve el mismo id.
    • llame getAdapterPosition() para obtener el índice de la lista.
    • ¿Hay alguna diferencia de lo que hace así?
    • Esto no funciona para mí. Cuando hice clic en las cartas, no pasó nada. Pero cuando hice clic justo FUERA de las cartas, el evento onClick activa. Estoy suponiendo que el CardView estaba absorbiendo el evento click, evitando que el anterior evento OnClick de la cocción. EDIT: Ok, yo tengo que trabajar. El problema era mi CardView vivió un ‘clic’ de la propiedad se establece en true. Una vez que me quita que, el código anterior se inició el manejo de los eventos OnClick correctamente. Gracias!

  2. 3
    1. que acaba de agregar onClick Oyente, el Elemento que desee en onBindViewHolder. donde fácilmente el valor de esa posición. por favor, compruebe el código de abajo.

       @Override
      public void onBindViewHolder(final MyViewHolder holder, final int position) {
      
          holder.title.setText(Html.fromHtml(html2text(results.get(position).getTitle().toString())));
          holder.description.setText(Html.fromHtml(html2text(results.get(position).getSummary().toString())));
          holder.url.setText(Html.fromHtml(html2text(results.get(position).getUrl().toString())));
          holder.url.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                  Intent intent=new Intent(mContext, DetailsActivity.class);
                  intent.putExtra("url",results.get(position).getUrl().toString());
                 mContext. startActivity(intent);
      
              }
          });
  3. 2

    Esta es mi solución para este problema:

    1. Primera añada una referencia a la Vista del objeto de la vista en ViewHolder clase

      public static class TouristViewHolder extends RecyclerView.ViewHolder{
          public ImageView img;
          public TextView name;
          public TextView description;
          public RatingBar rating;
          public View view;               //<----- here
      
          public TouristViewHolder(final View view) {
              super(view);
              this.view = view;            //<----- here
              //... rest of code
         }
      }
    2. Siguiente, en el método onBindViewHolder(final MyViewHolder holder, final int position), puedo agregar una escucha y establecer nuevos Intent.

      @Override
      public void onBindViewHolder(TouristViewHolder touristViewHolder, final int position) {
      
      touristViewHolder.view.setOnClickListener(new View.OnClickListener() {  //<--- here
          @Override
          public void onClick(View v) {
              Log.i("W4K","Click-"+position);
              context.startActivity(new Intent(context,MainActivity.class));  //<--- here
          }
      });

    A mí me funciona bien, espero que ayude a alguien más.

Dejar respuesta

Please enter your comment!
Please enter your name here