资讯专栏INFORMATION COLUMN

RecyclerView item点击你真的会么

malakashi / 458人阅读

摘要:查阅发现确实没有实现该事件,最后经过苦思冥想,还是模仿的点击事件,在中为每个添加的事件,制定一个接口,在主函数中调用。但是这样真的好吗我们想想一旦的数量暴增这可会影响性能啊。当然其中我们还要借助根据触摸手势来判断是否为点击事件。


现在RecyclerView都使用的相对频繁了,在开始使用RecyclerView的时候,大家都应该都遇到过RecyclerView居然没有帮我们实现Item点击事件,顿时感觉不知所措了。查阅API发现确实没有实现该事件,最后经过苦思冥想,还是模仿ListView的点击事件,在onCreateViewHolder中为每个Item添加ViewsetOnClickListener事件,制定一个接口,在主函数中调用。瞬间解决了,一下感觉so easy。但是这样真的好吗?我们想想一旦Item的数量暴增这可会影响性能啊。所以我们应该想出别的方法来代替它,下面我就介绍另外一种高大上的方法来教你如何真正的为RecyclerViewItem添加点击事件。

原理

虽然RecyclerView没有帮我们实现相应的点击监听事件,但我们查询它的API会发现它有一个方法帮我们实现了,就是addOnItemTouchListener触摸实事件,我们可以借助该监听来根据我们的触摸反应帮我们实现相同的点击事件效果。当然其中我们还要借助GestureDetectorCompat根据触摸手势来判断是否为点击事件。

addOnItemTouchListener

RecyclerView添加addOnItemTouchListener

recyclerView.addOnItemTouchListener(new OnItemTouchListener(recyclerView) {
            @Override
            public void onItemClick(RecyclerView.ViewHolder vh) {
            //item 操作
            }
        });

这里我们要自定义去实现RecyclerView.OnItemTouchListener接口

实现OnItemTouchListener

在实现该接口时我们会发现有三个方法

onTouchEvent

onInterceptTouchEvent

onRequestDisallowInterceptTouchEvent

第一个是处理触摸事件的,第二个是拦截触摸事件的,第三个是处理触摸冲突的。第三个这里我们用不到,不用管,至于前两个我们只要向下面我们用到的GestureDetectorCompat传递MotionEvent为了获取触摸的坐标,最后再定义个abstract回调

public abstract class OnItemTouchListener implements RecyclerView.OnItemTouchListener {

    private GestureDetectorCompat mGestureDetectorCompat;
    private RecyclerView mRecyclerView;

    public OnItemTouchListener(RecyclerView recyclerView) {
        mRecyclerView = recyclerView;
        mGestureDetectorCompat = new GestureDetectorCompat(mRecyclerView.getContext(),
                new MyGestureListener());
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
        mGestureDetectorCompat.onTouchEvent(e);
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        mGestureDetectorCompat.onTouchEvent(e);
        return false;
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }

    public abstract void onItemClick(RecyclerView.ViewHolder vh);
GestureDetectorCompat

上面我们实例化了GestureDetectorCompat类其中第二个参数是手势监听OnGestureListener,但我们不需要使用它,我们可以实现它的一个简单的封装类SimpleOnGestureListener它里面实现的都的空操作,所以我们可以自己实现特定的方法来执行我们的操作。

SimpleOnGestureListener

这里我们只要实现其中的两个方法

onSingleTapUp

onLongPress

其中第一个是简单的点击屏幕时执行,第二个是长按屏幕时执行。所以根据这两个方法,我们就可以从前面OnItemTouchListener传过来的MotionEvent获取点击的位置,根据位置使用RecyclerViewfindChildViewUnder获取到点击的ItemView,再通过RecyclerViewgetChildViewHolder获取ItemViewViewHolder最后再调用OnItemClick方法。

private class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            View childe = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
            if (childe != null) {
                RecyclerView.ViewHolder VH = mRecyclerView.getChildViewHolder(childe);
                onItemClick(VH);
            }
            return true;
        }

        @Override
        public void onLongPress(MotionEvent e) {
            View childe = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
            if (childe != null) {
                RecyclerView.ViewHolder VH = mRecyclerView.getChildViewHolder(childe);
                onItemClick(VH);
            }
        }
    }

好了整个的实现过程就是这些,看了以后是不是感觉更高大上了呢。如果对RecyclerView还不是很熟悉的可以先看我前面的这篇文章RecyclerView深入浅出

欢迎访问blog:https://idisfkj.github.io/

关注

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/12811.html

相关文章

  • RecyclerView的拖动、滑动删除

    摘要:前言前些时候提到了下的点击事件的处理,今天再来说说的拖动滑动删除。至于对个别的屏蔽删除效果可以重写方法该方法与前面的拖动的屏蔽方法使用方式是一样的,它也是默认返回,不对进行屏蔽滑动删除。主要就是方法,定义好拖动与滑动标识。 前言 前些时候提到了下RecyclerView的点击事件的处理,今天再来说说RecyclerView的拖动、滑动删除。看完了以后你会发现RecyclerView是...

    caikeal 评论0 收藏0
  • 安卓开发笔记(十):升级ListView为RecylerView的使用

    摘要:的优点并不会完全替代这点从没有被标记为可以看出,两者的使用场景不一样。基本使用引用在文件中引入该类。会根据情况,将原来的放入或,从而在复用时提升效率。概述 RecyclerView是什么 从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活。RecyclerView的官方定义如下: A flexi...

    番茄西红柿 评论0 收藏0
  • #土豆记事#教开发Android App之 —— 真的开始写App了

    摘要:基础界面我们要开发的界面如下有一个一个列表右下角一个按钮可以用系统自带的实现以上为。列表子视图和数据之间的交互使用了适配器模式,在中把你的数据渲染到上,然后应用给父视图。这样就满足了一个记事本的基础需求增加与修改。 基础界面 我们要开发的App界面如下showImg(https://segmentfault.com/img/bVmzuq); 有一个title 一个列表 ...

    Anonymous1 评论0 收藏0
  • RecylerView的用法解析

    摘要:当然了,既然谷歌给我们提供了这个专门添加分隔线的方法,那它肯定会允许我们自定义分隔线的样式,不然把这个方法抽取出来也没有任何意义。其他的方法也是同样的道理。 列表是android中很常用的一个功能,以前我们的习惯做法是使用ListView,在adapter里面通过ViewHolder可以实现item的重用,以节省资源,提高加载效率,但是当列表页数据庞大,需要分页,上拉加载更多时,就会遇...

    sugarmo 评论0 收藏0
  • ViewPager的使用

    摘要:写到这里我忽然忘记我们把笔记详情页给忘了,没有它我们该拿什么去显示笔记的详情呢,好吧,赶快去新建一个命名为上面的方法和之前的所使用的技巧是一样的。从中启动传参的方法是,自然的,我们就有了这个常量。 一 前言 上次我们用RecyclerView做了一个简单的显示笔记的小程序,今天我们用ViewPager来扩展它的功能:当我们点击笔记列表的其中某条笔记时,它可以跳到另外一个页面完整的显示这...

    netScorpion 评论0 收藏0

发表评论

0条评论

malakashi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<