RecyclerView onClick

? CurtJRees @ | Original: StackOverFlow
---

Hat jemand mit RecyclerView einen Weg gefunden, setzen eine onClickListener, um Elemente in der RecyclerView ? Ich dachte, der Einstellung eines Zuhörers zu jedem der Layouts für jedes Element, aber das scheint ein wenig zu viel Aufwand Ich bin sicher, es gibt einen Weg für die RecyclerView, um für die onClick Veranstaltung zu hören, aber ich kann nicht ganz herausfinden.

---

Top 5 Antwort

1Niek Haarman @

Bitte beachten Sie Jakobs http://stackoverflow.com/a/26196831/675383 für eine entkoppelte Lösung, mit https://developer.android.com/reference/android/support/v7/widget/RecyclerView.OnItemTouchListener.html . Bitte sehen Sie von Downvoting diese Antwort, nur weil dieser wird angenommen, während der verlinkten Antwort ist vielleicht besser. Ich kann diese Antwort nicht gelöscht werden. Danke Shon!

Da die API grundlegend geändert haben, würde es mich nicht wundern, wenn Sie ein OnClickListener für jedes Element zu schaffen waren . Es ist nicht so viel eines Streits wenn :

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

Die onClick Methode :

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

Beachten Sie, dass dies immer noch in der Vorschau, so dass API kann sich ändern .

2bolot @

Schauen Sie sich eine ähnliche Frage http://stackoverflow.com/questions/24562744/challenges-in-recyclerview-of-android-l . @ CommonsWare Kommentar Links zu https://gist.github.com/grantland/cd70814fe4ac369e3e92, die den OnClickListener Schnittstelle in der Ansicht Halter implementiert.

Hier ist ein einfaches Beispiel für die 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();
        }
    }

Die Adapter sieht dann so aus :

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

Dies ist, was ich am Ende zu müssen, falls jemand es nützlich findet :

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

    }
}

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

4Jacob Tabak @

Hier ist eine bessere und weniger eng gekoppelten Weg, um eine OnClickListener für eine RecyclerView umzusetzen.

Auszug der Nutzung:

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 Umsetzung :

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 @

Für mich ist dies der beste Weg :

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