17

Jak można uzyskać pozycję elementu, który został kliknięty w wierszu RecyclerView, a następnie wykonać zamiar do działania w metodzie onClick? Oto mój adapter:RecyclerView: uzyskaj pozycję i przejdź do aktywności

public class SergejAdapter extends RecyclerView.Adapter<SergejAdapter.MyViewHolder>{ 

    private LayoutInflater inflater; 
    List<Information> data= Collections.emptyList(); 

    public SergejAdapter(Context context, List<Information> data){ 
     inflater = LayoutInflater.from(context); 
     this.data=data; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = inflater.inflate(R.layout.navigation_drawer_custom_row,parent,false); 
     MyViewHolder holder= new MyViewHolder(view); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     Information current=data.get(position); 
     holder.title.setText(current.title); 
    } 

    @Override 
    public int getItemCount() { 
     return data.size(); 
    } 
    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     TextView title; 
     ImageView icon; 

     public MyViewHolder(View itemView){ 
      super(itemView); 
      title= (TextView) itemView.findViewById(R.id.listText); 
      icon = (ImageView) itemView.findViewById(R.id.listIcon); 
      icon.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      Context context = itemView.getContext(); 
      Intent intent = new Intent(context, Ernaehrung.class); 
      context.startActivity(intent); 

     } 
    } 

Tu właśnie mają onClick gdy jeden z obrazów został kliknięty, ale każdy obraz ma taki sam zamiar.

+0

Sprawdź ten post out: http://stackoverflow.com/questions/26830505/create-a-listview-with-selectable-rows-change-background-color -of-listview-rows. Zawiera niektóre z tych rzeczy do niego –

+3

getPosition() jest przestarzałe. Musisz użyć metody getLayoutPosition() lub getAdapterPosition(). Dla odniesienia https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html –

Odpowiedz

58

Możesz uzyskać pozycję z ViewHolder za pomocą metody getAdapterPosition(). Podobnie jak w kodzie poniżej:

public class SergejAdapter extends RecyclerView.Adapter<SergejAdapter.MyViewHolder>{ 

    ... 

    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 


     @Override 
     public void onClick(View v) { 
      // here you use position 
      int position = getAdapterPosition(); 
      ... 

     } 
    } 
} 
+0

Dziękuję za szybką odpowiedź! Zrobiłem to z obudową przełącznika, działa dobrze. – sergejdeveloper

+0

Należy wziąć pod uwagę, że ręczne ustawienie pozycji jest zbędne lub bardziej szczegółowa niepotrzebna praca. – reVerse

+2

To jest złe. Przede wszystkim ViewHolder ma już pozycję, więc nie musisz go dodawać. Po drugie, pozycja onBind może nie odpowiadać pozycji podczas onClick (jeśli elementy zostały przeniesione). Zamiast tego użyj 'ViewHolder # getPosition', aby uzyskać aktualną pozycję. – yigit

1

w swoim onClick(View v) można po prostu zadzwonić getLayoutPosition() który zwróci pozycję, w której kliknięcie stało. Sprawdź numer official docs, aby uzyskać więcej informacji.

Tak Twój kod będzie coś takiego:

@Override 
public void onClick(View v) { 
    switch(getLayoutPosition()){ 
     //TODO 
    } 
} 

Korzystnie należy użyć interfejsu do obsługi kliknięcia.

+0

'getPosition()' jest przestarzałe. Zamiast tego należy użyć 'getAdapterPosition()'. –

+1

@joaquin Zamiast 'getPosition()' mamy teraz 'getLayoutPosition()' i 'getAdapterPosition()'. Jeśli chcesz uzyskać ten sam efekt, powinieneś nazwać 'getLayoutPosition()', ponieważ mapuje ona na ten sam kod metodyczny. 'getAdapterPosition()' robi coś innego. – reVerse

+0

dzięki za dane. Myślałem, że getAdapterPosition() miał taki sam efekt. –

1

lub można po prostu dodać:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder > { 

... 
    class MyViewHolder extends RecyclerView.ViewHolder { 

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

      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Log.d(TAG, "Element " + getAdapterPosition() + " clicked."); 
       } 
      }); 
     } 


    }