在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中单击项目时,如何阻止手势检测器在单击时执行长按?的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止我的模态对话框在按钮单击时关闭?

单击选项卡时如何阻止页面提交?

IE9怎么设置阻止弹出窗口

单击触发 JavaScript 的链接时,如何阻止网页滚动到顶部?

如何在运行时阻止forEach循环不执行两次?

如何防止 UILabel 在 Swift 中阻止对父 UIButton 的触摸?