10

Was ich im Grunde versuche, ist, die Objekte, die in der Recycler-Ansicht angezeigt werden, an eine bestimmte TextView-ID anklickbar zu machen, weil ich ein Programm mache, das ein Albumcover und seinen Titel daneben in einer Liste anzeigt. Ich muss in der Lage sein, auf jedes der Kästchen in der Recycler-Ansicht zu klicken und ein TextView mit den anderen Informationen (Autor, Veröffentlichungsdatum, Hits usw.) zu öffnen, wenn darauf geklickt wird, und dann eine Zurück-Schaltfläche (wenn möglich), um zur Albumliste zurückzukehren. Ich habe mir das stundenlang angesehen und kann nicht herausfinden, wie man einen OnclickListener dazu bringt, dafür zu arbeiten. Wenn Sie wissen, wie oder irgendwelche Vorschläge haben, seien Sie froh, sie zu hören. Vielen Dank!Wie verwenden Sie einen OnClickListener in einer Recycler-Ansicht?

package com.albumlist.albumlist; 

import android.content.Context; 
import android.content.Intent; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 
    private AlbumData[] itemsData; 

    public MyAdapter(AlbumData[] itemsData){ 
     this.itemsData = itemsData; 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

     private TextView txtViewTitle; 
     private ImageView imgViewIcon; 

     public ViewHolder(View itemLayoutView) { 
      super(itemLayoutView); 
      itemLayoutView.setOnClickListener(this); 
      txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.album_title); 
      imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.album_icon); 
     } 

     @Override 
     public void onClick(View v) { 

     } 
    } 

    @Override 
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { 

     View itemLayoutView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.data_layout, null); 

     ViewHolder viewHolder = new ViewHolder(itemLayoutView); 
     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder viewHolder, int position) { 

     viewHolder.txtViewTitle.setText(itemsData[position].getTitle()); 
     viewHolder.imgViewIcon.setImageResource(itemsData[position].getImageUrl()); 
    } 

    @Override 
    public int getItemCount() { 
     return itemsData.length; 
    } 

} 
+1

Stellen Sie den Klick Zuhörer in Ihrer Ansicht Halter. Definieren Sie eine Listener-Schnittstelle und übergeben Sie diese zuerst an den 'Adapter' und dann an den' ViewHolder' in 'onCreateViewHolder'. Die Verarbeitung von Klicks erfolgt genau so wie in einer "ListView". Selbst vor dem 'RecyclerView' sollten Sie die 'OnItemClickListener'-Callbacks des' ListView' nicht verwenden, weshalb sie im' RecyclerView' nicht mehr vorhanden sind. –

Antwort

4

Das Konzept ist gut mit Xaver Kapeller in den Kommentaren zusammengefasst. Wenn Sie nach einer einfachen Möglichkeit suchen, Ihre RecyclerView Interaktion ähnlich wie die traditionellen Interaktionen von ListView zu verwalten, finden Sie unter BigNerdRanch's recyclerview-multiselect Bibliothek auf GitHub. Sie haben eine Beispiel-App, die Sie erkunden können, die Reihe von OnClickListeners und OnLongClickListeners mit zusätzlichen Fähigkeiten der Multi-Auswahl implementiert.

Hier ist ein Ausschnitt aus wie BigNerdRanch implementiert Zuhörer in einem Fragment über eine Adapter und ViewHolder, die in diesem Fall ist eigentlich eine Erweiterung der eigenen Bibliothek SwappingHolder.

public CrimeHolder(View itemView) { 
     super(itemView, mMultiSelector); 

     mTitleTextView = (TextView) itemView.findViewById(R.id.crime_list_item_titleTextView); 
     mDateTextView = (TextView) itemView.findViewById(R.id.crime_list_item_dateTextView); 
     mSolvedCheckBox = (CheckBox) itemView.findViewById(R.id.crime_list_item_solvedCheckBox); 
     itemView.setOnClickListener(this); 
     itemView.setLongClickable(true); 
     itemView.setOnLongClickListener(this); 
    } 

    public void bindCrime(Crime crime) { 
     mCrime = crime; 
     mTitleTextView.setText(crime.getTitle()); 
     mDateTextView.setText(crime.getDate().toString()); 
     mSolvedCheckBox.setChecked(crime.isSolved()); 
    } 

    @Override 
    public void onClick(View v) { 

     if (mCrime == null) { 
      return; 
     } 
     if (!mMultiSelector.tapSelection(this)) { 
      selectCrime(mCrime); 
     } 

    } 


    @Override 
    public boolean onLongClick(View v) { 

     ((AppCompatActivity) getActivity()).startSupportActionMode(mDeleteMode); 
     mMultiSelector.setSelected(this, true); 
     return true; 
    } 


} 


private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder> { 
    @Override 
    public CrimeHolder onCreateViewHolder(ViewGroup parent, int pos) { 
     View view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.list_item_crime, parent, false); 
     return new CrimeHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(CrimeHolder holder, int pos) { 
     Crime crime = mCrimes.get(pos); 
     holder.bindCrime(crime); 
     Log.d(TAG, "binding crime" + crime + "at position" + pos); 
    } 

    @Override 
    public int getItemCount() { 
     return mCrimes.size(); 
    } 
} 
Verwandte Themen