关闭RecyclerView惯性滚动,以及多个RecyclerView在嵌套滚动中的注意事项

前言:

当前RecyclerView 下拉到顶部 或者 上拉到底部时,虽然滚动列表停止了,但惯性任务并没有结束,一些特殊需求可能受到影响,需要手动停止。

1. RecyclerView源码

调用 rv.stopScroll() 停止;

关闭RecyclerView惯性滚动,以及多个RecyclerView在嵌套滚动中的注意事项_第1张图片

2. RecyclerView嵌套滚动注意事项

简单介绍嵌套执行流程:

CoordinatorLayout约束布局为例,RecyclerView惯性滚动时会执行dispatchNestedFling,就会调用CoordinatorLayout.Behavior中的 onNestedPreFling函数这个不是本文重点,而后会执行onNestedPreScroll,一般嵌套滚动主要业务都写在这个函数,记住这个函数

2.1 单个RecyclerView

它正在惯性滚动时,手指按下Down事件,滚动立刻停止,同时停止执行CoordinatorLayout.Behavior中​​​​​​​onNestedPreScroll,随后onStopNestedScroll嵌套滚动结束。

2.2 多个RecyclerView配合业务

假设 A滚动列表正在惯性滚动,手指触摸到B滚动列表,A滚动列表会立刻停止滚动,

但是!注意了!这只是:

!!暂停滚动!!        !!暂停滚动!!

此时的惯性任务还在执行,如果手指抬起up事件,A滚动列表 速度没有消耗完,会继续执行 A滚动列表dispatchNestedPreScroll,即CoordinatorLayout.BehavioronNestedPreScroll也会执行,引发一系列奇怪的bug。


我的解决方式:

stopScroll立刻停止滚动,再stopNestedScroll停止嵌套滚动,最后startNestedScroll重新开启嵌套滚动,如果有更好的解决方式,欢迎留言学习。

        if (aRv.getScrollState() == RecyclerView.SCROLL_STATE_SETTLING) { // 列表正在滚动
            aRv.stopScroll();
            aRv.stopNestedScroll(ViewCompat.TYPE_NON_TOUCH);
            aRv.startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL, ViewCompat.TYPE_TOUCH);
        }

        if (bRv.getScrollState() == RecyclerView.SCROLL_STATE_SETTLING) { // 列表正在滚动
            bRv.stopScroll();
            bRv.stopNestedScroll(ViewCompat.TYPE_NON_TOUCH);
            bRv.startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL, ViewCompat.TYPE_TOUCH);
        }

关闭RecyclerView惯性滚动,以及多个RecyclerView在嵌套滚动中的注意事项_第2张图片

你可能感兴趣的:(Android,android,嵌套滚动,RecyclerView)