在自定义视图中调用 onTouch Event() 时防止 RecyclerView 滚动

Prevent RecycleView from scrolling when onTouchEvent() is called in custom view

在属于回收视图项的自定义视图中调用 onTouchEvent(e: MotionEvent) 时,如何防止 RecyclerView 滚动?

遗憾的是,没有快速的解决方案。

在您的自定义视图中注册触摸侦听器。

customView.setOnTouchListener { v, event ->
            when (event.action) {
                MotionEvent.ACTION_DOWN -> {
                    callback?.onStartTrackingTouch()
                }
                MotionEvent.ACTION_UP -> {
                    callback?.onStopTrackingTouch()
                }
                else -> {}
            }
            super.onTouchEvent(event)
        }

在适配器中注册回调:

callback = object : CustomView.Callback {
                
                override fun onStartTrackingTouch() {
                    enableRecycleViewScroll(false)                   
                }

                override fun onStopTrackingTouch() {
                    enableRecycleViewScroll(true)
                }
            }

在适配器内部创建函数(您可以在 onAttachedToRecyclerView() 函数中引用 RecycleView):

private fun enableRecycleViewScroll(enable: Boolean) {
        recyclerView?.apply {
            val layoutManager = layoutManager as CustomLayoutManager
            layoutManager.enableScroll = enable
        }
    }

并创建自定义布局管理器:

    open class CustomLayoutManager(
    context: Context?, spanCount: Int, orientation: Int, reverseLayout: Boolean
) : LinearLayoutManager(context, spanCount, orientation, reverseLayout) {

    var enableScroll = true

    override fun canScrollVertically(): Boolean {
        return enableScroll
    }
}