最近发现自己负责的项目中,有使用 ScrollView 嵌套 RecyclerView 的地方,但是没有做任何针对滑动冲突的处理,于是就想看下为什么没有做这个处理,便进行了如下测试,发现了几个由其的问题。
测试场景:页面内容包括类似 HeaderView 的部分 + RecyclerView列表部分,布局是垂直方向,此处列表之上的布局内容并不是以 header add到RecyclerView上的。
测试结果:
- 在部分手机上,如果列表内容过少,只会造成很小程度的滑动,这种滑动冲突是没法察觉到的,很容易忽略滑动冲突;
- 在部分手机上,列表内容过多时,滑动 RecyclerView 部分,会很卡顿,滑动 仅ScrollView 部分,很顺畅,笔者试过Vivio x5plus 5.0系统会出现这样的情况;
- 在部分手机上,不管列表内容多少,当滑动时,只有 RecyclerView部分滑动,Header顶部布局内容固定,没有一起滑动,Redmi Note4 6.0系统则会出现这种结果。
一般地,对于第三种结果,一看就知道不是我们想要的结果,这种便是滑动冲突,但是不仔细时,均会因前两种结果而忽略了滑动冲突。现在,将针对以上的滑动冲突提供几种不同的解决方法。
方式一:禁止RecyclerView滑动
最直接的方式是将布局管理器中判断可滑动的方法,直接返回false,代码如下:
LinearLayoutManager layoutManager = new LinearLayoutManager(context) {
@Override
public boolean canScrollVertically() {
// 直接禁止垂直滑动
return false;
}
}
源码实现:
/**
* @return true if {
@link #getOrientation()} is {
@link #VERTICAL}
*/
@Override
public boolean canScrollVertically() {