给RecyclerView整体设置onClickListener点击无响应该如何解决?
问题原因
- Android事件分发机制中,触摸事件优先传递给最上层的子View,若RecyclerView的子Item设置了可点击、可聚焦属性,或者自身配置了点击/触摸监听,会直接消费点击事件,不会向上透传给RecyclerView本身,因此你设置的RecyclerView全局点击事件不会触发。
- RecyclerView本身默认优先处理滑动、子View交互逻辑,自身的点击事件优先级低于子View,即使手动设置
android:clickable="true"也无法被已经被子View消费的事件触发。
解决方案
场景1:需要点击RecyclerView空白区域触发逻辑
- 方法1:给所有RecyclerView的Item根布局添加以下属性,让子View不消费点击事件,事件向上透传给RecyclerView:
android:clickable="false" android:focusable="false"
修改后原有的RecyclerView.setOnClickListener即可正常触发。
- 方法2:不需要修改Item属性,直接给RecyclerView添加触摸手势监听器识别点击动作,代码示例如下:
binding.itemRecyclerview.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener { private val gestureDetector = GestureDetectorCompat(requireContext(), object : GestureDetector.SimpleOnGestureListener() { override fun onSingleTapUp(e: MotionEvent): Boolean { // 此处替换为你的点击逻辑 NavigateWithItemname(itemname) Log.i("click","click") return true } }) override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean { return gestureDetector.onTouchEvent(e) } override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) { gestureDetector.onTouchEvent(e) } override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {} })
场景2:实际需要点击RecyclerView的子Item条目触发逻辑(最常见的需求场景)
不要给RecyclerView本身设置点击事件,改为在Adapter的onBindViewHolder方法中给itemView设置点击监听,代码示例如下:
override fun onBindViewHolder(holder: MyViewHolder, position: Int) { val currentItem = dataList[position] holder.itemView.setOnClickListener { // 处理Item点击逻辑 NavigateWithItemname(currentItem.itemname) Log.i("click","click item $position") } }
内容的提问来源于stack exchange,提问作者sooyeon
相关产品推荐
相关产品推荐

