美文网首页
分享一段ViewPager2中RecyclerView滑动的问题

分享一段ViewPager2中RecyclerView滑动的问题

作者: SerBad | 来源:发表于2021-01-28 10:17 被阅读0次

    ViewPager2中插入RecyclerView,滑动过于敏感,下面记录一种方法,其实就是重新处理事件分发。

    import android.content.Context
    import android.util.AttributeSet
    import android.view.MotionEvent
    import androidx.recyclerview.widget.RecyclerView
    import kotlin.math.abs
    
    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 disallowIntercept = false
    
        private var startX = 0
        private var startY = 0
        var isDispatch: Boolean = true
        override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
            if (isDispatch) {
                when (ev.action) {
                    MotionEvent.ACTION_DOWN -> {
                        startX = ev.x.toInt()
                        startY = ev.y.toInt()
                        parent.requestDisallowInterceptTouchEvent(true)
                    }
                    MotionEvent.ACTION_MOVE -> {
                        val endX = ev.x.toInt()
                        val endY = ev.y.toInt()
                        val disX = abs(endX - startX)
                        val disY = abs(endY - startY)
                        if (disX > disY) {
                            //为了解决RecyclerView嵌套RecyclerView时横向滑动的问题
                            if (disallowIntercept) {
                                parent.requestDisallowInterceptTouchEvent(disallowIntercept)
                            } else {
                                parent.requestDisallowInterceptTouchEvent(canScrollHorizontally(startX - endX))
                            }
                        } else {
                            parent.requestDisallowInterceptTouchEvent(true)
                        }
                    }
                    MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> parent.requestDisallowInterceptTouchEvent(
                        false
                    )
                }
            }
    
            return super.dispatchTouchEvent(ev)
        }
    
        override fun requestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
            this.disallowIntercept = disallowIntercept
            super.requestDisallowInterceptTouchEvent(disallowIntercept)
    
        }
    }
    

    相关文章

      网友评论

          本文标题:分享一段ViewPager2中RecyclerView滑动的问题

          本文链接:https://www.haomeiwen.com/subject/cydttltx.html