RecyclerView onClick

Czy ktoś używający RecyclerView znalazł sposób na ustawienie onClickListener dla elementów w RecyclerView? Pomyślałem o ustawieniu listenera na każdy z układów dla każdego elementu, ale to wydaje się trochę zbyt kłopotliwe. Jestem pewien, że istnieje sposób na to, aby RecyclerView nasłuchiwał zdarzenia onClick, ale nie mogę tego do końca rozgryźć.

Rozwiązanie

Ponieważ API's radykalnie się zmieniło, nie zdziwiłbym się, gdybyś musiał stworzyć OnClickListener dla każdego elementu. Nie jest to jednak aż tak bardzo kłopotliwe. W swojej implementacji RecyclerView.Adapter, powinieneś mieć:

private final OnClickListener mOnClickListener = new MyOnClickListener();

@Override
public MyViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
    View view = LayoutInflater.from(mContext).inflate(R.layout.myview, parent, false);
    view.setOnClickListener(mOnClickListener);
    return new MyViewHolder(view);
}

Metoda onClick:

@Override
public void onClick(final View view) {
    int itemPosition = mRecyclerView.getChildLayoutPosition(view);
    String item = mList.get(itemPosition);
    Toast.makeText(mContext, item, Toast.LENGTH_LONG).show();
}
Komentarze (28)

Sprawdź podobny [pytanie][1] @CommonsWare's komentarz łączy się z [to][2], który implementuje interfejs OnClickListener w viewHolder.

Oto'prosty przyk&#322ad ViewHolder:


    TextView textView;//declare global with in adapter class

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

      private ViewHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
            textView = (TextView)view.findViewById(android.R.id.text1);

      }

      @Override
      public void onClick(View view) {
            Toast.makeText(view.getContext(), "position = " + getLayoutPosition(), Toast.LENGTH_SHORT).show();

         //go through each item if you have few items within recycler view
        if(getLayoutPosition()==0){
           //Do whatever you want here

        }else if(getLayoutPosition()==1){ 
           //Do whatever you want here         

        }else if(getLayoutPosition()==2){

        }else if(getLayoutPosition()==3){

        }else if(getLayoutPosition()==4){

        }else if(getLayoutPosition()==5){

        }

        //or you can use For loop if you have long list of items. Use its length or size of the list as 
        for(int i = 0; i
Komentarze (7)

To jest to, czego potrzebowałem, na wypadek, gdyby ktoś uznał to za przydatne:

public static class ViewHolder extends RecyclerView.ViewHolder {

    public ViewHolder(View item) {

        super(item);
        item.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("RecyclerView", "onClick:" + getAdapterPosition());
            }
        });

    }
}

Źródło: http://blog.csdn.net/jwzhangjie/article/details/36868515

Komentarze (4)