RecyclerView OnClick

? CurtJRees @ | Original: StackOverFlow
---

Кто-нибудь с помощью RecyclerView нашел способ, чтобы установитьonClickListener к элементамRecyclerView ? Я думал, что настройки слушателя к каждой из макетов для каждого элемента, но это кажется немного слишком много хлопот Я уверен, что естьспособ дляRecyclerView для прослушивания onClick события, но я не могу достаточно выяснить это.

---

Top 5 ответ

1Niek Haarman @

Пожалуйста, см http://stackoverflow.com/a/26196831/675383 Иакова для более несвязанной решения, используя https://developer.android.com/reference/android/support/v7/widget/RecyclerView.OnItemTouchListener.html, Пожалуйста, воздержитесь от downvoting этот ответ только потому, что это один принята в то время каксвязаны ответ, возможно, лучше. Я не могу удалить этот ответ. Спасибо!

Как API, радикально изменилась, Это не удивило бы меня, если бы вы создавалиOnClickListener для каждого элемента. Это не то, что много хлопот, хотя:

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

Метод 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();
}

Обратите внимание, что это по-прежнему в режиме предварительного просмотра, так что API может измениться .

2bolot @

Проверьте подобный вопрос http://stackoverflow.com/questions/24562744/challenges-in-recyclerview-of-android-l . @ Комментарий ссылки CommonsWare, чтобы https://gist.github.com/grantland/cd70814fe4ac369e3e92, который реализует «____» интерфейс в держателе просмотра.

Вотпростой примерOnClickListener :

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(); } } , А затем выглядит следующим образом:

Adapter
3Fifer Sheep @

Это то, что я в конечном итоге необходимости, в случае кто-то находит это полезным :

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

Источник: http://blog.csdn.net/jwzhangjie/article/details/36868515

4Jacob Tabak @

Вотлучше и менее тесно связаны способ реализовать OnClickListener для RecyclerView .

Фрагмент использования:

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

    }
}

Реализация RecyclerItemClickListener :

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

Для меня этолучший способ :

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