在使用 ViewPager2 TabLayout Fragment RecyclerView 的时候发现这样一个问题:
竖直滑动RecyclerView的时候如果不小心发生了水平滑动,RecyclerView就滑动不了了,只能滑动ViewPager2,这种体验不是很好。
Record_2021-08-03-11-42-55_d11621d41b37c1cee374f534be417c31.2021-08-03 11_47_33.gif
以下是我的解决方案,亲测有效
class RecyclerViewAtViewPager2 : RecyclerView {
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
)
private var startX = 0f
private var startY = 0f
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
when (ev.action) {
MotionEvent.ACTION_DOWN -> {
startX = ev.x
startY = ev.y
}
MotionEvent.ACTION_MOVE -> {
val endX = ev.x
val endY = ev.y
val disX = Math.abs(endX - startX)
val disY = Math.abs(endY - startY)
"start x = $startX , start y = $startY , end x = $endX , end y = $endY , dis x = $disX , dis y = $disY".log()
startX = endX
startY = endY
if (disY > disX) {
//发生了竖向滑动
getViewPager2(parent)?.isUserInputEnabled = false
}
}
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
getViewPager2(parent)?.isUserInputEnabled = true
}
}
return super.dispatchTouchEvent(ev)
}
private fun getViewPager2(viewParent: ViewParent): ViewPager2? {
return when {
viewParent is ViewPager2 -> {
viewParent
}
viewParent.parent != null -> {
getViewPager2(viewParent.parent)
}
else -> {
null
}
}
}
}
使用RecyclerViewAtViewPager2替代RecyclerView
网友评论