支持setOnItemClickListener的RecyclerView

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


发布了29 篇原创文章 · 获赞 15 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/han_han_1/article/details/51732872
今日推荐