SwipeRefreshLayout+CoordinatorLayout+AppBarLayout+RecyclerView多层嵌套滑动异常问题

1,818 阅读1分钟

image.png

1.最外层是一个Activity 它的布局是外层包裹SwipeRefreshLayout 内部ui层级结构 最上层是TabIndicator 下面一层是ViewPager2 2.内部fragment CoordinatorLayout+AppBarLayout+RecyclerView多层嵌套

当我们内部fragment有协调布局处理滑动事件 外部Activity有SwipeRefreshLayout也需要处理滑动事件,这样就会导致系统滑动冲突

解决方案设想 当协调布局向上滑 当滑动到顶部时,我们把滑动事件交给SwipeRefreshLayout 这样当滑动到顶部, SwipeRefreshLayout就可以出发下拉刷新操作 当向下滑动时,我们就把滑动事件交给协调布局CoordinatorLayout 这样就能解决他们的冲突了 所以得监听协调布局的AppBarLayout

AppBarLayout是CoordinatorLayout的直接子类,AppBarLayout的大部分功能只能在CoordinatorLayout中产生作用,因此AppBarLayout是CoordinatorLayout的子类时,才能完全的展示它的强大功能。
AppBarLayout.LayoutParams.setScrollFlags(int)布局xml属性:app:layout_scrollFlags提供AppBarLayout子视图的滚动行为。
AppBarLayout需要添加OnOffsetChangedListener控制SwipeRefreshLayout
private var mOnOffsetChangedListener: AppBarLayout.OnOffsetChangedListener? =
        AppBarLayoutChangedListener(false) { type, change ->
            val refresh = getAttachActivity()?.findViewById<SwipeRefreshLayout>(R.id.refresh)
            when (type) {
                "EXPANDED" -> {
                    refresh?.isEnabled = true
                }
                else -> {
                    refresh?.isEnabled = false
                }

            }
        }
mOnOffsetChangedListener?.let {
    mBinding.appBarLayout?.addOnOffsetChangedListener(it)
}

image.png