android recyclerview更新item中item 的点击事件该怎么做

118443人阅读
转载请注明出处:http://write.blog.csdn.net/postedit/
在上一篇博客中提到,RecyclerView不再负责Item视图的布局及显示,所以RecyclerView也没有为Item开放OnItemClick等点击事件,这就需要开发者自己实现。博客最下面有Demo程序运行动画。
奉上Demo的。
在调研过程中,发现有同学修改RecyclerView源码来实现Item的点击监听,但认为这不是一个优雅的解决方案,最终决定在RecyclerView.ViewHolder上做文章。
思路是:因为ViewHolder我们可以拿到每个Item的根布局,所以如果我们为根布局设置单独的OnClick监听并将其开放给Adapter,那不就可以在组装RecyclerView时就能够设置ItemClickListener,只不过这个Listener不是设置到RecyclerView上而是设置到Adapter。
我们首先看ViewHolder的代码:
public class MyViewHolder extends ViewHolder implements OnClickListener,OnLongClickListener{
public ImageV
public TextV
private MyItemClickListener mL
private MyItemLongClickListener mLongClickL
public MyViewHolder(View rootView,MyItemClickListener listener,MyItemLongClickListener longClickListener) {
super(rootView);
iv = (ImageView)rootView.findViewById(R.id.item_iv);
tv = (TextView)rootView.findViewById(R.id.item_tv);
this.mListener =
this.mLongClickListener = longClickL
rootView.setOnClickListener(this);
rootView.setOnLongClickListener(this);
* 点击监听
public void onClick(View v) {
if(mListener != null){
mListener.onItemClick(v,getPosition());
* 长按监听
public boolean onLongClick(View arg0) {
if(mLongClickListener != null){
mLongClickListener.onItemLongClick(arg0, getPosition());
}&/span&因为在构造ViewHolder时,rootView将作为一个必传参数传递进来,所以我们只需要拿到rootView并给其绑定点击监听事件即可。
下面要考虑的就是怎样把listener传递进来。Demo中设定了监听点击事件的Interface:MyItemClickListener:
public interface MyItemClickListener {
public void onItemClick(View view,int postion);
}MyItemClickListener模仿ListView的OnItemClickListener,开放了view和position两个参数,这对习惯使用ListView的开发者们使用起来更得心应手。从ViewHolder的代码中可以看到,执行onClick方法时会调用getPosition()将当前Item的位置回调给listener。getPosition()是ViewHolder的内置方法,可直接使用。
上面提到过,listener是设定到Adapter上的,所以Adapter就需要对外开放相关方法:
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent,false);
MyViewHolder vh = new MyViewHolder(itemView,mItemClickListener,mItemLongClickListener);
* 设置Item点击监听
* @param listener
public void setOnItemClickListener(MyItemClickListener listener){
this.mItemClickListener =
public void setOnItemLongClickListener(MyItemLongClickListener listener){
this.mItemLongClickListener =
}上篇博客()提到过,Adapter的onCreateViewHolder是负责实例化每个Item的视图,所以我在实例化视图时就将listener传递给ViewHolder。
最后就是组装RecyclerView时根据需求设定点击监听了:
* 初始化RecylerView
private void initView(){
mRecyclerView = (RecyclerView)findViewById(R.id.recyclerView);
MyLayoutManager manager = new MyLayoutManager(this);
manager.setOrientation(LinearLayout.HORIZONTAL);//默认是LinearLayout.VERTICAL
mRecyclerView.setLayoutManager(manager);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
private void initData(){
this.mData = new ArrayList&MyItemBean&();
for(int i=0;i&20;i++){
MyItemBean bean = new MyItemBean();
bean.tv = &Xmy&+i;
mData.add(bean);
this.mAdapter = new MyAdapter(mData);
this.mRecyclerView.setAdapter(mAdapter);
RecyclerView.ItemDecoration decoration = new MyDecoration(this);
this.mRecyclerView.addItemDecoration(decoration);
this.mAdapter.setOnItemClickListener(this);
this.mAdapter.setOnItemLongClickListener(this);
}Demo为ViewHolder设置了OnClick和OnLongClickListener,在Activity中我们实现了接口方法并在里面打印Toast提示:
public void onItemClick(View view, int postion) {
MyItemBean bean = mData.get(postion);
if(bean != null){
Toast.makeText(this, bean.tv, Toast.LENGTH_SHORT).show();
public void onItemLongClick(View view, int postion) {
MyItemBean bean = mData.get(postion);
if(bean != null){
Toast.makeText(this, &LongClick &+bean.tv, Toast.LENGTH_SHORT).show();
}下面是Demo的运行动画。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:463409次
积分:1842
积分:1842
排名:千里之外
原创:21篇
评论:100条
(2)(3)(5)(10)(1)(2)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'Android RecyclerView点击事件
作者:w4lle
字体:[ ] 类型:转载 时间:
这篇文章主要为大家详细介绍了Android RecyclerView点击事件的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
随着Android L版本的发布,RecyclerView已经逐渐地取代了ListView,用来显示较多的数据集,RecyclerView相比ListView在性能上有了大幅度的提升,可以说RecyclerView是AbsListView的升级版本。RecyclerView自带了ViewHolder使用,与ListView缓存convertView不同的是,RecyclerView缓存的是ViewHolder,操作对象也是ViewHolder。虽然ListView也带有缓存convertView的功能,但是当使用ListView时,显示、缓存、回收、布局等都是耦合在一起的;而RecyclerView对其进行了解耦,操作更灵活,使得开发者可以更好的自定义各种各样的效果,另外RecyclerView假如了局部刷新。关系如下图所示:
二、基本使用
RecyclerView提供了下面几种角色
1.RecyclerView.Adapter&&& 适配器
2.RecyclerView.LayoutManager& 布局器,用于管理布局显示,官方提供以下几种方式
LinearLayoutManager&& 显示垂直或水平滚动的列表项
GridLayoutManager&&&&& 以网格方式显示
StaggeredGridLayoutManager&& 以交错网格显示
同时,开发者也可以自定义LayoutManager,继承RecyclerView.LayoutManager。
3.Recycler.ItemDecoration 每个item附加的子视图,可用来绘制Divider,设置padding等
4.RecyclerView.ItemAnimator 负责添加、删除数据时的动画效果
具体的使用方法见 官方文档
项目中使用
Activity中
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
private void initView() {
recyclerView = (RecyclerView) findViewById(R.id.rv);
// use this setting to improve performance if you know that changes
// in content do not change the layout size of the RecyclerView
recyclerView.setHasFixedSize(true);
// use a linear layout manager
LinearLayoutManager ll = new LinearLayoutManager(this);
recyclerView.setLayoutManager(ll);
initializeData();
recyclerAdapter = new RecyclerAdapter(persons);
recyclerView.setAdapter(recyclerAdapter);
private void initializeData(){
persons = new ArrayList&&();
persons.add(new Person("Emma Wilson", "23 years old", R.mipmap.ic_launcher));
persons.add(new Person("Lavery Maiss", "25 years old", R.mipmap.ic_launcher));
persons.add(new Person("Lillie Watts", "35 years old", R.mipmap.ic_launcher));
自定义Adapter
public class RecyclerAdapter extends RecyclerView.Adapter&RecyclerAdapter.ViewHolder&{
private List&Person&
public RecyclerAdapter(List&Person& list) {
this.list =
//为ViewHolder设置数据
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewH
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
//用于创建ViewHolder
public void onBindViewHolder(ViewHolder holder, int position) {
Person person = list.get(position);
holder.nameTv.setText(person.name);
holder.ageTv.setText(person.age);
holder.imageView.setImageResource(person.photoId);
public int getItemCount() {
return list.size();
// 删除指定的Item
public void removeData(int position)
list.remove(position);
// 通知RecyclerView控件某个Item已经被删除
notifyItemRemoved(position);
// 在指定位置添加一个新的Item
public void addItem(Person person,int positionToAdd)
list.add(person);
// 通知RecyclerView控件插入了某个Item
notifyItemInserted(positionToAdd);
public class ViewHolder extends RecyclerView.ViewHolder {
TextView nameTv;
TextView ageTv;
ImageView imageV
public ViewHolder(View itemView) {
super(itemView);
nameTv = (TextView) itemView.findViewById(R.id.name);
ageTv = (TextView) itemView.findViewById(R.id.age);
imageView = (ImageView) itemView.findViewById(R.id.avater);
item动画如有需要可以自己手动添加,这个不是今天的重点,这里附上两个不错的开源项目 这里 和 这里
RecyclerView的点击事件
官方文档中并没有给我们类似ListView的OnItemClickListener回调方法,由于RecyclerView比ListView更高级,所以它并没有行或者列的概念,子View可以任意布局,每个子View处理自己的onClick事件,也就是说在Adapter中给子view的rootview设置点击回调。
我们今天所要实现的是另外一种方式,类似ListView的OnItemClickListener的方式。通过文档我们知道RecyclerView留给开发者一个RecyclerView.OnItemTouchListener接口,我们要做的就是实现它,实现点击的回调和长按回调。当然了,这种方式只是一个开始,我们还可以拓展为各种复杂的手势操作的回调
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener{
private View childV
private RecyclerView touchV
public RecyclerItemClickListener(Context context, final OnItemClickListener mListener) {
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener(){
public boolean onSingleTapUp(MotionEvent ev) {
if (childView != null && mListener != null) {
mListener.onItemClick(childView, touchView.getChildPosition(childView));
public void onLongPress(MotionEvent ev) {
if (childView != null && mListener != null) {
mListener.onLongClick(childView, touchView.getChildPosition(childView));
GestureDetector mGestureD
public interface OnItemClickListener {
public void onItemClick(View view, int position);
public void onLongClick(View view, int posotion);
public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
mGestureDetector.onTouchEvent(motionEvent);
childView = recyclerView.findChildViewUnder(motionEvent.getX(), motionEvent.getY());
touchView = recyclerV
public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
我们在onInterceptTouchEvent的方法中注册了手势操作,当有特定的手势的时候我们就可以通过SimpleGestureListener回调接口接收到,其中我们实现了 点击和长按,然后回调我们自己定义的接口。使用也很简单
recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this,
new RecyclerItemClickListener.OnItemClickListener() {
public void onItemClick(View view, int position) {
Log.d(TAG, "onItemClick : postion " + position);
public void onLongClick(View view, int posotion) {
Log.d(TAG, "onLongClick position : " + posotion);
对于手势操作我们可以定义更多用于对itemView的操作回调。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Google为什么不为Android中的RecyclerView添加Item的点击监听器? - 知乎138被浏览9602分享邀请回答32 条评论分享收藏感谢收起RecyclerView点击Item回到顶部_Android开发_动态网站制作指南
RecyclerView点击Item回到顶部
来源:人气:486
转载注明出处:http://blog.csdn.net/moushao/article/details/
这两天用两个个RecyclerView实现二级菜单,却不曾想出现了一个bug.
&&&&&& 如果RecyclerView上拉过(屏幕第一条数据并不是List的第一条数据),无论点击父的还是子的item,父RecyclerView会自动刷新并回到顶部.如果子RecyclerView也被上拉了,无论点击父的还是子的item,子RecyclerView都不会刷新回到顶部!如图:
这个Bug搞了我整整三天,真的是三天!!!!国内外的墙也翻了,坑也跳了,官方文档也看了,也拜读了,都没有解决到这个问题.
最后无计可施,发到群里让众基友帮忙解决,幸好大家兴致昂昂都在帮忙解决!!!找到了两种方方式
第一:在Layout文件中设置RecyclerView的宽高为warp_content,如
&android.support.v7.widget.RecyclerView
android:id=&@+id/cities_rec&
android:layout_marginLeft=&2dp&
android:background=&#654321&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&&
&/android.support.v7.widget.RecyclerView&但是这一改动,布局就乱了,不是完全根本之策.第二:在build.gradle(Moudle)中修改SDK版本为最新,如图:
虽然Bug解决了,但疑问并没有解决:点击子RecyclerView的Item,并没有执行父RecyclerView的刷新事件,都是独立分开的,
为什么会出现这种情况?RecyclerView的内部bug?
优质网站模板RecyclerView的Item点击事件实现整理
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Android
RecyclerView的Item点击事件实现整理的相关资料,需要的朋友可以参考下
自从开始使用RecyclerView代替ListView,会发现有很多地方需要学习。前一段时间的学习记录有:
RecyclerView的滚动事件研究 - DevWiki
RecyclerView的ViewHolder和Adapter的封装优化 - DevWiki
RecyclerView问题记录 - DevWiki
实现 RecyclerView的Item的点击事件有三种方式:
在创建 ItemView时添加点击监听
当 ItemView attach RecyclerView时实现
通过RecyclerView已有的方法addOnItemTouchListener()实现
1.在创建ItemView时添加点击监听
&&&&& 思路是:因为ViewHolder我们可以拿到每个Item的根布局,所以如果我们为根布局设置单独的OnClick监听并将其开放给Adapter,那不就可以在组装RecyclerView时就能够设置ItemClickListener,只不过这个Listener不是设置到RecyclerView上而是设置到Adapter。具体实现代码如下:
public class SampleAdapter extends RecyclerView.Adapter&SampleAdapter.SampleViewHolder& {
private List&DataBean& mD
private OnItemClickListener mL // Item点击事件
public DataBean getItem(int position) {
return mDatas == null ? null : mDatas.get(position);
public SampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent,false);
return new SampleViewHolder(itemView);
public void onBindViewHolder(SampleViewHolder holder, int position) {
public int getItemCount() {
return mDatas == null ? 0 : mDatas.size();
class SampleViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
public SampleViewHolder(View itemView) {
super(itemView);
// TODO:初始化View
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
public void onClick(View v) {
if (mListener != null) {
mListener.onItemClick(SampleAdapter.this, v, getLayoutPosition());
public boolean onLongClick(View v) {
if (mListener != null) {
mListener.onItemLongClick(SampleAdapter.this, v, getLayoutPosition());
2.当ItemView attach RecyclerView时实现
&&&&& 该实现方法是在阅读国外的一篇博客时发现的,原文链接如下:Getting your clicks on RecyclerView
实现的代码如下:
public class ItemClickSupport {
private static final int KEY = 0x;
private final RecyclerView mRecyclerV
private OnItemClickListener mOnItemClickL
private OnItemLongClickListener mOnItemLongClickL
private View.OnClickListener mOnClickListener = new View.OnClickListener() {
public void onClick(View v) {
if (mOnItemClickListener != null) {
RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
mOnItemClickListener.onItemClicked(mRecyclerView, v, holder.getAdapterPosition());
private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() {
public boolean onLongClick(View v) {
if (mOnItemLongClickListener != null) {
RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
return mOnItemLongClickListener.onItemLongClicked(mRecyclerView, v, holder.getAdapterPosition());
private RecyclerView.OnChildAttachStateChangeListener mAttachListener = new RecyclerView.OnChildAttachStateChangeListener() {
public void onChildViewAttachedToWindow(View view) {
if (mOnItemClickListener != null) {
view.setOnClickListener(mOnClickListener);
if (mOnItemLongClickListener != null) {
view.setOnLongClickListener(mOnLongClickListener);
public void onChildViewDetachedFromWindow(View view) {
* ItemClickSupport的私有构造方法
private ItemClickSupport(RecyclerView recyclerView) {
mRecyclerView = recyclerV
mRecyclerView.setTag(KEY, this);
// 为RecyclerView设置OnChildAttachStateChangeListener事件监听
mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener);
* 为RecyclerView设置ItemClickSupport
public static ItemClickSupport addTo(RecyclerView view) {
ItemClickSupport support = (ItemClickSupport) view.getTag(KEY);
if (support == null) {
support = new ItemClickSupport(view);
* 为RecyclerView移除ItemClickSupport
public static ItemClickSupport removeFrom(RecyclerView view) {
ItemClickSupport support = (ItemClickSupport) view.getTag(KEY);
if (support != null) {
support.detach(view);
* 为RecyclerView设置点击事件监听
public ItemClickSupport setOnItemClickListener(OnItemClickListener listener) {
mOnItemClickListener =
* 为RecyclerView设置长按事件监听
public ItemClickSupport setOnItemLongClickListener(OnItemLongClickListener listener) {
mOnItemLongClickListener =
* 为RecyclerView移除OnChildAttachStateChangeListener事件监听
private void detach(RecyclerView view) {
view.removeOnChildAttachStateChangeListener(mAttachListener);
view.setTag(KEY, null);
* RecyclerView的点击事件监听接口
public interface OnItemClickListener {
void onItemClicked(RecyclerView recyclerView, View itemView, int position);
* RecyclerView的长按事件监听接口
public interface OnItemLongClickListener {
boolean onItemLongClicked(RecyclerView recyclerView, View itemView, int position);
&&&&& 上面的代码中给RecyclerView设置了OnChildAttachStateChangeListener事件监听,当子View attach RecyclerView时设置事件监听。
private RecyclerView.OnChildAttachStateChangeListener mAttachListener = new RecyclerView.OnChildAttachStateChangeListener() {
public void onChildViewAttachedToWindow(View view) {
if (mOnItemClickListener != null) {
view.setOnClickListener(mOnClickListener);
if (mOnItemLongClickListener != null) {
view.setOnLongClickListener(mOnLongClickListener);
public void onChildViewDetachedFromWindow(View view) {}
&&&&& 使用时只需要调用addTo(RecycleView view)方法得到ItemClickSupport对象,然后调用setOnItemClickListener()方法和setOnItemLongClickListener()方法设置ItemView的点击事件和长按事件监听即可。
3.通过RecyclerView已有的方法addOnItemTouchListener()实现
3.1、查看源码
查看RecyclerView源码可以看到,RecyclerView预留了一个Item的触摸事件方法:
* Add an {@link OnItemTouchListener} to intercept touch events before they are dispatched
* to child views or this view's standard scrolling behavior.
* &p&Client code may use listeners to implement item manipulation behavior. Once a listener
* returns true from
* {@link OnItemTouchListener#onInterceptTouchEvent(RecyclerView, MotionEvent)} its
* {@link OnItemTouchListener#onTouchEvent(RecyclerView, MotionEvent)} method will be called
* for each incoming MotionEvent until the end of the gesture.&/p&
* @param listener Listener to add
* @see SimpleOnItemTouchListener
public void addOnItemTouchListener(OnItemTouchListener listener) {
mOnItemTouchListeners.add(listener);
&&&&& 通过注释我们可知,此方法是在滚动事件之前调用,需要传入一个OnItemTouchListener对象。OnItemTouchListener的代码如下:
public static interface OnItemTouchListener {
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e);
public void onTouchEvent(RecyclerView rv, MotionEvent e);
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept);
此接口还提供了一个实现类,且官方推荐使用该实现类SimpleOnItemTouchListener:
* An implementation of {@link RecyclerView.OnItemTouchListener} that has empty method bodies and
* default return values.
* You may prefer to extend this class if you don't need to override all methods. Another
* benefit of using this class is future compatibility. As the interface may change, we'll
* always provide a default implementation on this class so that your code won't break when
* you update to a new version of the support library.
public static class SimpleOnItemTouchListener implements RecyclerView.OnItemTouchListener {
&span style="font-family:'Microsoft YaHei';"&
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
&&&&& 在触摸接口中,当触摸时会回调一个MotionEvent对象,通过使用GestureDetectorCompat来解析用户的操作。
3.2、了解GestureDetector的工作原理
&&&&& 对于触摸屏,其原生的消息无非按下、抬起、移动这几种,我们只需要简单重载onTouch或者设置触摸侦听器setOnTouchListener即可进行处理。不过,为了提高我们的APP的用户体验,有时候我们需要识别用户的手势,Android给我们提供的手势识别工具GestureDetector就可以帮上大忙了。
&&&&&& GestureDetector的工作原理是,当我们接收到用户触摸消息时,将这个消息交给GestureDetector去加工,我们通过设置侦听器获得GestureDetector处理后的手势。
&&&&& GestureDetector提供了两个侦听器接口,OnGestureListener处理单击类消息,OnDoubleTapListener处理双击类消息。
OnGestureListener的接口有这几个:
// 单击,触摸屏按下时立刻触发
abstract boolean onDown(MotionEvent e);
// 抬起,手指离开触摸屏时触发(长按、滚动、滑动时,不会触发这个手势)
abstract boolean onSingleTapUp(MotionEvent e);
// 短按,触摸屏按下后片刻后抬起,会触发这个手势,如果迅速抬起则不会
abstract void onShowPress(MotionEvent e);
// 长按,触摸屏按下后既不抬起也不移动,过一段时间后触发
abstract void onLongPress(MotionEvent e);
// 滚动,触摸屏按下后移动
abstract boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY);
// 滑动,触摸屏按下后快速移动并抬起,会先触发滚动手势,跟着触发一个滑动手势
abstract boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY);
OnDoubleTapListener的接口有这几个:
// 双击,手指在触摸屏上迅速点击第二下时触发
abstract boolean onDoubleTap(MotionEvent e);
// 双击的按下跟抬起各触发一次
abstract boolean onDoubleTapEvent(MotionEvent e);
// 单击确认,即很快的按下并抬起,但并不连续点击第二下
abstract boolean onSingleTapConfirmed(MotionEvent e);
有时候我们并不需要处理上面所有手势,方便起见,Android提供了另外一个类SimpleOnGestureListener实现了如上接口,我们只需要继承SimpleOnGestureListener然后重载需要的手势即可。
3.3、实现点击事件监听
&&&&& 了解了GestureDetector的工作原理之后,便开始实现RecycleView的Item的点击事件。首先写一个SimpleRecycleViewItemClickListener类继承SimpleOnItemTouchListener,构造时传入Item点击回调OnItemClickListener,并覆写父类的boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e)方法,具体代码如下:
* RecyclerView的Item点击事件监听
* @author liyunlong
public class SimpleRecycleViewItemClickListener extends RecyclerView.SimpleOnItemTouchListener {
private OnItemClickListener mL
private GestureDetectorCompat mGestureD
public SimpleRecycleViewItemClickListener(OnItemClickListener listener) {
this.mListener =
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
if (mGestureDetector == null) {
initGestureDetector(rv);
if (mGestureDetector.onTouchEvent(e)) { // 把事件交给GestureDetector处理
* 初始化GestureDetector
private void initGestureDetector(final RecyclerView recyclerView) {
mGestureDetector = new GestureDetectorCompat(recyclerView.getContext(), new GestureDetector.SimpleOnGestureListener() { // 这里选择SimpleOnGestureListener实现类,可以根据需要选择重写的方法
* 单击事件
public boolean onSingleTapUp(MotionEvent e) {
View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null) {
mListener.onItemClick(childView, recyclerView.getChildLayoutPosition(childView));
* 长按事件
public void onLongPress(MotionEvent e) {
View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null) {
mListener.onItemLongClick(childView, recyclerView.getChildLayoutPosition(childView));
* 双击事件
public boolean onDoubleTapEvent(MotionEvent e) {
int action = e.getAction();
if (action == MotionEvent.ACTION_UP) {
View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null) {
mListener.onItemDoubleClick(childView, recyclerView.getChildLayoutPosition(childView));
* RecyclerView的Item点击事件监听接口
* @author liyunlong
public interface OnItemClickListener {
* 当ItemView的单击事件触发时调用
void onItemClick(View view, int position);
* 当ItemView的长按事件触发时调用
void onItemLongClick(View view, int position);
* 当ItemView的双击事件触发时调用
void onItemDoubleClick(View view, int position);
* RecyclerView的Item点击事件监听实现
* @author liyunlong
public class SimpleOnItemClickListener implements OnItemClickListener {
public void onItemClick(View view, int position) {
public void onItemLongClick(View view, int position) {
public void onItemDoubleClick(View view, int position) {
&&&&& 在GestureDetectorCompat的手势回调中我们覆写:
boolean onSingleTapUp(MotionEvent e):单击事件回调
void onLongPress(MotionEvent e):长按事件回调
boolean onDoubleTapEvent(MotionEvent e):双击事件回调
&&&&& 如果我们只需要监听单击事件,而不需要监听长按事件和双击事件,构造SimpleRecycleViewItemClickListener时只需要传入SimpleOnItemClickListener即可,如果需要处理其它的手势监听,也可以覆写对应的手势回调方法。
4.三种方法对比
以上三种方式分别是:
在创建ItemView时添加点击监听
当ItemView attach RecyclerView时实现
通过RecyclerView已有的方法addOnItemTouchListener()实现
从以上三种方式的实现过程可知:
三种均可实现ItemView的点击事件和长按事件的监听。
第一种和第二种方式可以很方便对ItemView中的子View进行监听。
第三种方式可以很方便获取用户点击的坐标。
第二种方式和第三种方式可以写在单独的类中,相对于第一种写在Adapter的方式可使代码更独立整洁。
&&&&& 如果你只想监听ItemView的点击事件或长按事件,三种方式均可。
&&&&& 如果你想监听ItemView中每个子View的点击事件,采用第一种或者第二种比较方便。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 recyclerview更新item 的文章

 

随机推荐