在recyclerview中单击项目时,如何阻止手势检测器在单击时执行长按?

Posted

技术标签:

【中文标题】在recyclerview中单击项目时,如何阻止手势检测器在单击时执行长按?【英文标题】:How to stop gesture detector from executing long press on a single tap when item is clicked in recyclerview? 【发布时间】:2015-03-30 17:36:53 【问题描述】:

在将此问题标记为重复之前,请注意,我已在 *** 上查看了类似问题的所有解决方案,但它们不起作用。

以下是我实现手势检测器的过程。您会看到,在扩展 GestureDetector.SimpleOnGestureListener 的私有类中,我只创建了长按的代码,但 onLongPress 中包含的代码也会在单击时触发。

类实现 OnItemTouchListsner 见下面的代码

public class MyFragment extends Fragment implements RecyclerView.OnItemTouchListener

我创建了一个私有变量见下面的代码

private GestureDetectorCompat gestureDetector;

我在 onCreateView 中分配了gestureDetector 见下面的代码

gestureDetector = new GestureDetectorCompat(getActivity().getApplicationContext(), new RecyclerViewOnGestureListener());

我为 OnItemTouchListener 实现了所需的方法参见下面的代码

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

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) 

     

我为手势监听器创建了一个私有类见下面的代码

private class RecyclerViewOnGestureListener extends GestureDetector.SimpleOnGestureListener 

            @Override
            public void onLongPress(MotionEvent e) 
                //code in here executes on single tap, but should only execute on long press
                super.onLongPress(e);
            
        

【问题讨论】:

【参考方案1】:

尝试覆盖 RecyclerView#requestDisallowInterceptTouchEvent 并在那里取消它。

【讨论】:

感谢您的帮助。我修好了 :) 这是一个很好的建议,但没有解决问题。看我的回答...【参考方案2】:

导致问题的原因

我使用的是RecyclerItemClickListener (see link to github page),因此我无法使用longpress,因为longpress 中的代码需要在片段内执行。

所以我让我的片段实现OnItemTouchListener 并设置recyclerview.addOnItemTouchListener(this)。我只在我的片段中包含了长按的代码。我还将recyclerview.addOnItemTouchListener 设置为RecyclerItemClickListener

问题原因:为recyclerview设置onItemTouchListener两次。

解决方案:让 RecyclerItemClickListener 成为一个内部类。

【讨论】:

以上是关于在recyclerview中单击项目时,如何阻止手势检测器在单击时执行长按?的主要内容,如果未能解决你的问题,请参考以下文章

如何在recyclerView(没有按钮)中单击项目时播放歌曲?

如何在单击 RecyclerView 项目时从一个片段移动到另一个片段

单击后退按钮时,在 RecyclerView 中获得相同的项目位置

过滤 RecyclerView 项目并单击它后会给出错误的项目

如何解决单击水平 RecyclerView 中的项目的问题?

从片段中获取意图值后,我如何在 recyclerview 项目中实现单击