您的位置:首页 > 其它

支持setOnItemClickListener的RecyclerView

2016-06-22 11:21 555 查看
      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

}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息