支持setOnItemClickListener的RecyclerView

来源:互联网 发布:rimworld mac下载 编辑:程序博客网 时间:2024/05/17 02:14

      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 implementsRecyclerView.OnItemTouchListener {private RecyclerView mRecyclerView;private GestureDetectorCompat mGestureDetectorCompat;public OnRecyclerViewItemClickListener(RecyclerView recyclerView) {mRecyclerView = recyclerView;mGestureDetectorCompat = new GestureDetectorCompat(recyclerView.getContext(),new ItemTouchGestureDetectorListener());}@Overridepublic boolean onInterceptTouchEvent(RecyclerView recyclerView,MotionEvent motionEvent) {mGestureDetectorCompat.onTouchEvent(motionEvent);return false;}@Overridepublic void onTouchEvent(RecyclerView recyclerView,MotionEvent motionEvent) {mGestureDetectorCompat.onTouchEvent(motionEvent);}private class ItemTouchGestureDetectorListener extendsGestureDetector.SimpleOnGestureListener {@Overridepublic 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;}@Overridepublic 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() {@Overridepublic void onItemLongClick(ViewHolder vh, int position) {// Do something}@Overridepublic void onItemClick(ViewHolder vh, int position) {// Do something}});


0 0
原创粉丝点击