在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 项目并单击它后会给出错误的项目