15

Wie kann ich eine OnClickListener an eine CardView anhängen? Ich möchte, dass jede einzelne Karte eine andere Aktion hat, wenn sie angeklickt wird.OnClickListener für CardView?

Ich habe eine RecyclerView, die einen benutzerdefinierten Adapter für die Anzeige der Karten hat. So ist es implemented.

Antwort

31

Sie sollten die OnItemClickListener in Ihrer ViewHolder Klasse implementieren und den aktuellen Artikel an die ViewHolder Instanzen auf jeder onBindViewHolder() übergeben.

Von this 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); 
} 
+0

Danke für den Link. Ich habe den Hörer dort definiert. – MikkoP

+0

Gern geschehen, froh, dass ich helfen konnte. –

+0

Können Sie Ihre Antwort etwas mehr erarbeiten .... wie ich wissen kann, welche cardView-Zeile angeklickt wird ..... Wenn ich die Ansicht verwende, gibt getId() dieselbe ID zurück. – Crawler

3
  1. Sie fügen Sie einfach onClick Listener, das Element, das Sie in onBindViewHolder wollen. wo man leicht auf den Wert dieser Position zugreifen kann. Bitte überprüfen Sie den folgenden Code.

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

Dies ist meine Lösung für dieses Problem:

  1. Erste Referenz hinzufügen View Objekt ansehen in ViewHolder Klasse

    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. nächste in Verfahren onBindViewHolder(final MyViewHolder holder, final int position), I Fügen Sie einen Listener hinzu und setzen Sie 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 
        } 
    }); 
    

Es gut für mich funktioniert, hoffen, dass es jemand anderes helfen.