RecyclerView onClick

? CurtJRees @ | Original: StackOverFlow
---

Tem alguém usando RecyclerView encontrou uma maneira de definir um onClickListener para artigos no RecyclerView ? Pensei em definir um ouvinte para cada um dos layouts para cada item, mas que parece um pouco demasiado incómodo Tenho certeza de que há um caminho para o RecyclerView para ouvir o evento onClick, mas eu não consigo descobrir.

---

Top 5 Responder

1Niek Haarman @

Por favor, veja http://stackoverflow.com/a/26196831/675383 de Jacob para uma solução mais dissociadas, usando https://developer.android.com/reference/android/support/v7/widget/RecyclerView.OnItemTouchListener.html . Por favor, abster-se de downvoting esta resposta só porque este é aceito enquanto a resposta é ligada possivelmente melhor . Eu não posso apagar esta resposta . Obrigado!

Como os APIs mudaram radicalmente, Não me surpreenderia se você fosse criar um OnClickListener para cada item. Não é que muito de um aborrecimento, porém:

private final OnClickListener mOnClickListener = new MyOnClickListener();

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

O método onClick :

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

Note-se que este ainda está em pré-visualização, de modo API pode mudar.

2bolot @

Confira uma pergunta semelhante http://stackoverflow.com/questions/24562744/challenges-in-recyclerview-of-android-l . @ Comentário ligações de CommonsWare para https://gist.github.com/grantland/cd70814fe4ac369e3e92, que implementa o OnClickListener Interface no porta- view.

Aqui está um exemplo simples do ViewHolder :

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public TextView mTextView;

        private ViewHolder(View itemView, TextView textView) {
            super(itemView);
            itemView.setOnClickListener(this);
            mTextView = textView;
        }

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

O Adapter, então se parece com isso :

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
        TextView textView = (TextView) view.findViewById(android.R.id.text1);
        return new ViewHolder(view, textView);
    }
3Fifer Sheep @

Isto é o que eu acabei precisando, no caso de alguém acha útil :

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:" + getPosition());
            }
        });

    }
}

Fonte : http://blog.csdn.net/jwzhangjie/article/details/36868515

4Jacob Tabak @

Aqui está uma maneira melhor e menos fortemente acoplados para implementar um OnClickListener para uma RecyclerView .

Trechos de uso:

RecyclerView recyclerView = findViewById(R.id.recycler);
recyclerView.addOnItemTouchListener(
    new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() {
      @Override public void onItemClick(View view, int position) {
        // do whatever
      }
    })
);

RecyclerItemClickListener implementação :

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;


public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
  private OnItemClickListener mListener;

  public interface OnItemClickListener {
    public void onItemClick(View view, int position);
  }

  GestureDetector mGestureDetector;

  public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
    mListener = listener;
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
      @Override public boolean onSingleTapUp(MotionEvent e) {
        return true;
      }
    });
  }

  @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
    View childView = view.findChildViewUnder(e.getX(), e.getY());
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
      mListener.onItemClick(childView, view.getChildPosition(childView));
      return true;
    }
    return false;
  }

  @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }
}
5astinx @

Para mim, esta é a melhor maneira :

class YourRecyclerAdapter extends RecyclerView.Adapter<ContactViewHolder> implements View.OnClickListener { 
  ...
  @Override
  public void onClick(View view) {
        int itemPosition = vRecycle.getChildPosition(view);
        //And use itemPosition to get the item from your collection. This way you dont restrain the ViewHolder with a OnClick callback
    }
  ...
}