ViewPager2与SwipeRefreshLayout滑动冲突问题的解决

2,422 阅读1分钟

我们是在ViewPager2中的Fragment使用了SwipeRefreshLayout。当向下滑动时只要稍微偏左或右都会触发ViewPager2的移动,造成SwipeRefreshLayout卡在页面上不消失。

  • 解决方案一:重写SwipeRefreshLayout

我们首先准备修改ViewPager2,可是它没法继承。那么目光只好投向SwipeRefreshLayout。

class MySwipeRefreshLayout : SwipeRefreshLayout {
    constructor(context: Context, attes: AttributeSet) : super(context, attes) {}
    constructor(context: Context) : super(context)

    private var startX = 0
    private var beginScrolll = false //是否开始滑动
    private var startY: Int = 0
    override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
        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 = Math.abs(endX - startX)
                val disY: Int = Math.abs(endY - startY)
                if (disX > disY) {
                    if (!beginScrolll)
                        parent.requestDisallowInterceptTouchEvent(false)
                } else {
                    beginScrolll = true
                    parent.requestDisallowInterceptTouchEvent(true)
                }
            }
            MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
                parent.requestDisallowInterceptTouchEvent(false)
                beginScrolll=false
            }
        }
        return super.dispatchTouchEvent(ev)
    }
}
  • 解决方案二:使用SmartRefreshLayout替代SwipeRefreshLayout即可。

参考原文地址