10

Co zasadniczo próbuję zrobić, to sprawić, że obiekty wyświetlane w widoku recyklera będą klikalne dla określonego identyfikatora TextView, ponieważ robię program, który pokazuje okładkę albumu i jego tytuł obok niej na liście. Muszę umieć kliknąć każde z pól, które robi widok recyklera, i wyświetlić tekst z innymi informacjami (autor, opublikowana data, hit piosenki, itp.) Po kliknięciu, a następnie przycisku wstecz (jeśli możliwe), aby powrócić do listy albumów. Patrzę na to od wielu godzin i nie mogę wymyślić, jak zrobić dla niego narzędzie OnclickListener. Jeśli wiesz, jak lub masz jakieś sugestie, ciesz się, że je słyszysz. Dziękuję Ci!Jak korzystać z OnClickListener w widoku recyklera?

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

ustawić click słuchacza wewnątrz uchwytu widoku. Zdefiniuj interfejs nasłuchiwania i przeprowadź go najpierw do 'Adapter', a następnie do' ViewHolder' w 'onCreateViewHolder'. Obsługa kliknięć odbywa się dokładnie w taki sam sposób jak w 'ListView'. Nawet przed 'RecyclerView' nie powinieneś używać callbacków' OnItemClickListener' z 'ListView', dlatego' RecyclerView' już ich nie ma. –

Odpowiedz

4

Koncepcja jest dobrze podsumował Xaver Kapeller w komentarzach. Jeśli szukasz prostego sposobu zarządzania interakcją RecyclerView podobnego do tradycyjnych interakcji ListView, sprawdź bibliotekę BigNerdRanch's recyclerview-multiselect na GitHub. Mają przykładową aplikację, którą możesz eksplorować, która implementuje serie OnClickListeners i OnLongClickListeners z dodatkowymi możliwościami selekcji wielokrotnej.

Oto urywek jak BigNerdRanch wprowadza słuchaczy w Fragment poprzek Adapter i ViewHolder, która w tym przypadku jest rzeczywiście rozszerzenie biblioteki własnej 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(); 
    } 
} 
Powiązane problemy