如何将点击事件传递给 RecyclerView 的项目?

林思拉

我有一个普通的RecyclerView,在它上面有一个透明的View实现GestureListener,它们的大小基本相同RecyclerView

GestureListener会听滚动和一扔手势,并通过该MotionEventRecyclerView它的下面。

我已经RecyclerView能够滚动和投掷。但是,我找不到将 click 事件传递给RecyclerView's项目的方法。

我已经知道这是因为ACTION_DOWNGestureListener. 事实上,GestureListener有一个onSingleTap()方法供您覆盖,每当我执行单击时都会调用此方法。

根据这篇文章,我尝试OnTouchListener为我的 itemView设置一个并监听ACTION_UP事件。但是,onTouch()从不调用方法。

下面是我的做法:
1. 在透明的 GestureListener 中创建一个回调

   @Override
    public boolean onSingleTapUp(MotionEvent e) {
        if (scrollDetector == null) return false;
        scrollDetector.onSingleTap(e);
        return true;
    }
  1. 在activity中配置回调,并传递MotionEventRecyclerView

    @Override
    public void onSingleTap(MotionEvent e) {
        mRecyclerView.onTouchEvent(e);
    }
    
  2. 设置OnTouchListener为适配器中的 itemView:

    itemView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_UP) {
                v.performClick();
                return true;
            }
            return false;
        }
    });
    

使用调试器,我可以看到它mRecyclerView.onTouchEvent(e)被调用了;但是onTouch()itemView 的没有被调用。

所以......我应该如何正确地将 传递MotionEvent给 itemView?

你可能会问—— “为什么要在 RecyclerView 之上放置一个 GestureListener?”
这是因为我需要RecyclerViewRecyclerView滚动更改 的高度但是,如果我使用RecyclerView's执行此操作addOnScrollListener,则 的值dy将在负值和正值之间波动,因为 dy 也受其高度的影响。并且波动也会反映到UI上。
因此,我需要一个滚动检测器,它在滚动时不会改变其高度,只需通过RecyclerView编程调用scrollBy()and将 scroll 和 fling 值传递fling()

林思拉

愚蠢的我。我应该使用dispatchTouchEvent(MotionEvent e)而不是onTouchEvent(MotionEvent e).

然而,这还不够。
简单地dispatchTouchEvent(e)使用 GestureListener 中的 MotionEvent调用是行不通的,因为这e是一个ACTION_UP事件。

要模拟点击,您需要ACTION_DOWNACTION_UP

而且 itemView 不需要设置,OnTouchListener因为你已经模拟过了

代码:

        @Override
        public void onSingleTap(MotionEvent e) {
            long downTime = SystemClock.uptimeMillis();
            long upTime = downTime + 100;
            MotionEvent downEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN,
                    e.getX(), e.getY(), 0);
            mRecyclerView.dispatchTouchEvent(downEvent);
            MotionEvent upEvent = MotionEvent.obtain(upTime, upTime, MotionEvent.ACTION_UP,
                    e.getX(), e.getY(), 0);
            mRecyclerView.dispatchTouchEvent(upEvent);
            downEvent.recycle();
            upEvent.recycle();
        }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何找到 RecyclerView 被点击的项目?

来自分类Dev

如何居中于recyclerview的项目?

来自分类Dev

如何隐藏 RecyclerView 项目

来自分类Dev

如何将点击分别添加到RecyclerView的整个行和特定的行项目中?

来自分类Dev

浓咖啡-如何点击随机的RecyclerView项目?

来自分类Dev

如何使卧式recyclerview项目显示在recyclerview的底部

来自分类Dev

如何将recyclerview添加到项目

来自分类Dev

如何将新项目放置在 recyclerView 的顶部?

来自分类Dev

Recyclerview项目点击涟漪效应

来自分类Dev

将从 RecyclerView 单击的项目位置传递给 Fragment 父

来自分类Dev

单击将RecyclerView项目转换为CardView

来自分类Dev

Android RecyclerView将项目移至视图末尾

来自分类Dev

Android RecyclerView将项目移至视图末尾

来自分类Dev

如何将localstorage变量传递给不同的angularjs项目

来自分类Dev

如何将 Vuex 列表中的项目传递给组件?

来自分类Dev

如何延迟从RecyclerView中删除项目

来自分类Dev

如何有选择地装饰RecyclerView项目

来自分类Dev

如何使用StaggeredGridLayoutManager在RecyclerView中重排项目

来自分类Dev

如何从RecyclerView列表中获取选定的项目?

来自分类Dev

如何使用Espresso计算RecyclerView项目

来自分类Dev

如何在Android中禁用RecyclerView项目?

来自分类Dev

如何保存RecyclerView行项目的状态?

来自分类Dev

显示后,如何检测每个RecyclerView项目

来自分类Dev

滚动时如何调用RecyclerView项目

来自分类Dev

如何隐藏/显示特定的RecyclerView项目?

来自分类Dev

如何通过ID删除recyclerview项目?

来自分类Dev

如何修复Recyclerview返回相同的Android项目

来自分类Dev

如何从使用diffutil的recyclerview中删除项目?

来自分类Dev

如何在RecyclerView项目中检测双击

Related 相关文章

  1. 1

    如何找到 RecyclerView 被点击的项目?

  2. 2

    如何居中于recyclerview的项目?

  3. 3

    如何隐藏 RecyclerView 项目

  4. 4

    如何将点击分别添加到RecyclerView的整个行和特定的行项目中?

  5. 5

    浓咖啡-如何点击随机的RecyclerView项目?

  6. 6

    如何使卧式recyclerview项目显示在recyclerview的底部

  7. 7

    如何将recyclerview添加到项目

  8. 8

    如何将新项目放置在 recyclerView 的顶部?

  9. 9

    Recyclerview项目点击涟漪效应

  10. 10

    将从 RecyclerView 单击的项目位置传递给 Fragment 父

  11. 11

    单击将RecyclerView项目转换为CardView

  12. 12

    Android RecyclerView将项目移至视图末尾

  13. 13

    Android RecyclerView将项目移至视图末尾

  14. 14

    如何将localstorage变量传递给不同的angularjs项目

  15. 15

    如何将 Vuex 列表中的项目传递给组件?

  16. 16

    如何延迟从RecyclerView中删除项目

  17. 17

    如何有选择地装饰RecyclerView项目

  18. 18

    如何使用StaggeredGridLayoutManager在RecyclerView中重排项目

  19. 19

    如何从RecyclerView列表中获取选定的项目?

  20. 20

    如何使用Espresso计算RecyclerView项目

  21. 21

    如何在Android中禁用RecyclerView项目?

  22. 22

    如何保存RecyclerView行项目的状态?

  23. 23

    显示后,如何检测每个RecyclerView项目

  24. 24

    滚动时如何调用RecyclerView项目

  25. 25

    如何隐藏/显示特定的RecyclerView项目?

  26. 26

    如何通过ID删除recyclerview项目?

  27. 27

    如何修复Recyclerview返回相同的Android项目

  28. 28

    如何从使用diffutil的recyclerview中删除项目?

  29. 29

    如何在RecyclerView项目中检测双击

热门标签

归档