前言:
当前RecyclerView 下拉到顶部 或者 上拉到底部时,虽然滚动列表停止了,但惯性任务并没有结束,一些特殊需求可能受到影响,需要手动停止。
1. RecyclerView源码
调用 rv.stopScroll() 停止;
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.Behavior中onNestedPreScroll也会执行,引发一系列奇怪的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);
}