在自定义视图中调用 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
}
}
在属于回收视图项的自定义视图中调用 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
}
}