支持setOnItemClickListener的RecyclerView
2016-06-22 11:21
555 查看
RecyclerView没有提供像ListView一样的setOnItemClickListener,那么想要让RecyclerView也提供一个setOnItemClickListener方法,那我们就只有自己来实现。
下面代码是参考鸿洋的一篇博客来实现的支持setOnItemClickListener的RecyclerView
如何使用?
下面代码是参考鸿洋的一篇博客来实现的支持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 } });
相关文章推荐
- 可以添加头部和尾部View并且支持setOnItemClickListener和滑到底部自动加载更多的RecyclerView
- 在linux摸索的过程
- 新书——《“互联网+”时代的IT战略、架构与治理 传统企业信息化转型的顶层设计》
- MongoDB日期转换问题
- fluxion isc-dhcp-server无法安装----解决方法
- 网信办将专项整治跟帖评论
- 关于Google浏览器添加QQ电脑管家广告过滤插件出现2345主页拦截问题
- Timer的性能优势
- 浅谈尾递归
- 前端技术:jQuery
- 增加listview的item点击水纹效果
- codeforce A. Alyona and Numbers
- 百度2017暑期实习生编程题-单词接龙
- .NET基于Redis缓存实现单点登录SSO的解决方案
- 15.3节练习
- 区别和详解:jQuery extend()和jQuery.fn.extend()
- 图的几种表示方法
- Arduino学习日记-使用GY-30光照传感器
- 流媒体介绍
- 论代码审查的重要性