在自定义视图中调用 onTouchEvent() 时防止 RecycleView 滚动

Posted

技术标签:

【中文标题】在自定义视图中调用 onTouchEvent() 时防止 RecycleView 滚动【英文标题】:Prevent RecycleView from scrolling when onTouchEvent() is called in custom view 【发布时间】:2022-01-14 05:24:50 【问题描述】:

onTouchEvent(e: MotionEvent) 在作为回收视图项的一部分的自定义视图中调用时,如何防止 RecycleView 滚动?

【问题讨论】:

【参考方案1】:

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

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

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
    

【讨论】:

以上是关于在自定义视图中调用 onTouchEvent() 时防止 RecycleView 滚动的主要内容,如果未能解决你的问题,请参考以下文章

Swift:在自定义视图中未调用 UIButton 触摸事件

呈现的 ModalView 显示在自定义视图中,从中调用它

需要在自定义 UITextField 中调用 shouldChangeCharactersInRange 并调用视图控制器函数通知更新

在自定义视图中调用 super() 时,确保传递与组件的构造函数相同的 props

在自定义容器视图控制器中调用 endEditing 会隐藏键盘但不会更改键盘响应器

在自定义模式解除转换后,第一个视图控制器的生命周期方法不会被调用