RecyclerView没有提供像ListView一样的setOnItemClickListener,那么想要让RecyclerView也提供一个setOnItemClickListener方法,那我们就只有自己来实现。
下面代码是参考鸿洋的一篇博客来实现的支持setOnItemClickListener的RecyclerView
import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
public class RecyclerViewExt extends RecyclerView {
public RecyclerViewExt(Context context) {
this(context, null);
}
public RecyclerViewExt(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public RecyclerViewExt(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
private OnItemClickListener mItemClickListener;
public OnItemClickListener getOnItemClickListener() {
return mItemClickListener;
}
public void setOnItemClickListener(OnItemClickListener itemClickListener) {
mItemClickListener = itemClickListener;
removeOnItemTouchListener(mOnRecyclerViewItemClickListener);
addOnItemTouchListener(mOnRecyclerViewItemClickListener);
}
public interface OnItemClickListener {
public void onItemClick(RecyclerView.ViewHolder vh, int position);
public void onItemLongClick(RecyclerView.ViewHolder vh, int position);
}
private OnRecyclerViewItemClickListener mOnRecyclerViewItemClickListener = new OnRecyclerViewItemClickListener(this);
private class OnRecyclerViewItemClickListener implements
RecyclerView.OnItemTouchListener {
private RecyclerView mRecyclerView;
private GestureDetectorCompat mGestureDetectorCompat;
public OnRecyclerViewItemClickListener(RecyclerView recyclerView) {
mRecyclerView = recyclerView;
mGestureDetectorCompat = new GestureDetectorCompat(
recyclerView.getContext(),
new ItemTouchGestureDetectorListener());
}
@Override
public boolean onInterceptTouchEvent(RecyclerView recyclerView,
MotionEvent motionEvent) {
mGestureDetectorCompat.onTouchEvent(motionEvent);
return false;
}
@Override
public void onTouchEvent(RecyclerView recyclerView,
MotionEvent motionEvent) {
mGestureDetectorCompat.onTouchEvent(motionEvent);
}
private class ItemTouchGestureDetectorListener extends
GestureDetector.SimpleOnGestureListener {
@Override
public boolean onSingleTapUp(MotionEvent e) {
if (mItemClickListener == null) {
return false;
}
View clickedChild = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
if (clickedChild != null) {
RecyclerView.ViewHolder vh = mRecyclerView.getChildViewHolder(clickedChild);
if (vh != null) {
mItemClickListener.onItemClick(vh, vh.getAdapterPosition());
}
}
return true;
}
@Override
public void onLongPress(MotionEvent e) {
if (mItemClickListener == null) {
return;
}
View clickedChild = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
if (clickedChild != null) {
RecyclerView.ViewHolder vh = mRecyclerView .getChildViewHolder(clickedChild);
if (vh != null) {
mItemClickListener.onItemLongClick(vh, vh.getAdapterPosition());
}
}
}
}
}
}
mRecyclerView.setOnItemClickListener(new RecyclerViewExt.OnItemClickListener() {
@Override
public void onItemLongClick(ViewHolder vh, int position) {
// Do something
}
@Override
public void onItemClick(ViewHolder vh, int position) {
// Do something
}
});