GestureDetector未响应RecyclerView项双击与单击确认事件问题
问题核心原因
你的代码问题出在触摸事件消费逻辑不正确:
onTouchListener没有正确持有后续事件:默认状态下SimpleOnGestureListener的父类实现对单击、双击相关事件返回false,会导致触摸事件向上传递给RecyclerView的滚动拦截逻辑,后续的ACTION_UP等事件不会再回传到你的GestureDetector,只有onShowPress、onLongPress这类在ACTION_DOWN阶段就能触发的回调会被执行。- 你之前修改返回值的操作没有覆盖全链路,需要同时调整GestureDetector内部回调和onTouchListener的返回逻辑。
修复后完整代码
val gDetector = GestureDetector(root.context, object : GestureDetector.SimpleOnGestureListener() { override fun onDoubleTap(e: MotionEvent?): Boolean { Log.i(TAG,"Double tapped") // 消费双击事件,返回true return true } override fun onSingleTapConfirmed(e: MotionEvent?): Boolean { Log.i(TAG,"single tap confirmed") // 消费单击事件,返回true return true } override fun onLongPress(e: MotionEvent?) { Log.i(TAG,"Long press") // 不需要长按逻辑可直接删除该重写方法 super.onLongPress(e) } }).apply { // 不需要长按检测可以直接关闭,避免误触发 setIsLongpressEnabled(false) } root.setOnTouchListener { _, event -> // 事件优先交给GestureDetector处理,返回true表示事件被消费,不再向上传递 gDetector.onTouchEvent(event) }
其他问题说明
- 你之前实现
GestureDetector.onDoubleTapListener报错,是因为SimpleOnGestureListener本身已经默认实现了该接口,不需要额外重复实现,直接重写对应的onDoubleTap、onSingleTapConfirmed方法即可。 - 如果你的Item内部包含可点击的子控件,需要给子控件设置
android:clickable="false",避免子控件提前消费触摸事件,导致根布局的onTouchListener收不到完整的事件流。
内容的提问来源于stack exchange,提问作者Willt42
相关产品推荐
相关产品推荐

