RecyclerView onClick

? CurtJRees @ | Original: StackOverFlow
---

Qualcuno con RecyclerView ha trovato un modo per impostare un onClickListener per gli elementi in RecyclerView ? Ho pensato di fissare un ascoltatore a ciascuno dei layout per ogni articolo, ma che sembra un po 'troppo fastidio Sono sicuro che c'è un modo per la RecyclerView per ascoltare l'evento onClick, ma io non riesco a capirlo .

---

Top 5 Risposta

1Niek Haarman @

Si prega di consultare http://stackoverflow.com/a/26196831/675383 di Giacobbe per una soluzione più disaccoppiato, utilizzando https://developer.android.com/reference/android/support/v7/widget/RecyclerView.OnItemTouchListener.html . Si prega di astenersi da downvoting questa risposta solo perché questa è accettata, mentre la risposta collegata è forse meglio . Non riesco a cancellare questa risposta . Grazie !

Poiché le API sono radicalmente cambiati, non mi sorprenderebbe se si dovesse creare un OnClickListener per ogni voce . E non è che molto di una seccatura però:

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);
}

Il onClick metodo :

@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();
}

Si noti che questo è ancora in anteprima, così API possono cambiare .

2bolot @

Scopri una domanda simile http://stackoverflow.com/questions/24562744/challenges-in-recyclerview-of-android-l . @ Commento collegamenti di CommonsWare a https://gist.github.com/grantland/cd70814fe4ac369e3e92, che implementa l'interfaccia OnClickListener nel supporto vista .

Ecco un semplice esempio di 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();
        }
    }

Il Adapter, allora si presenta così :

    @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 @

Questo è quello che ho finito per dover, in caso qualcuno lo trova utile :

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 @

Ecco un modo migliore e meno strettamente accoppiato ad implementare un OnClickListener per un RecyclerView .

Snippet di utilizzo :

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

Implementazione RecyclerItemClickListener :

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 @

Per me, questo è il modo migliore :

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
    }
  ...
}