为什么 CoordinatorLayout 支持 NestedScrollView 嵌套滑动不支持 ScrollView;
为什么 CoordinatorLayout 支持 RecyclerView 嵌套滑动不支持 ListView;
这一篇博文我们要知道 CoordinatorLayout 为什么不支持,还要让它支持 ListView 的嵌套滑动。

熟悉 Material Design 设计风格的同学肯定对 CoordinatorLayout 不陌生,CoordinatorLayout 常常和 AppBarLayout、CollapsingToolbarLayout 一起组合使用,并和 RecyclerView 或 NestedScrollView 一起联动使用,各种组合的效果很是炫酷,如果你再自定义个 layout_behavior 更是屌的不要不要的。

但是为什么呢?

Android 5.0 Lollipop(棒棒糖) 发布以后,增加了这节我们关注的两个接口和两个帮助类

NestedScrollingParent  
NestedScrollingChild  
NestedScrollingParentHelper  
NestedScrollingChildHelper  

CoordinatorLayout 之所以可以和 RecyclerView、NestedScrollView 联动,是因为它实现了 NestedScrollingParent 接口,看一下它的继承关系

public class CoordinatorLayout extends ViewGroup implements NestedScrollingParent {
    ...
}

如果子类可以实现 NestedScrollingChild,这样通过 NestedScrollingChildHelper 可以通知父类接收滑动事件继而实现联动,我们再看一下 RecyclerView 和 NestedScrollView 的继承关系

public class RecyclerView extends ViewGroup implements ScrollingView, NestedScrollingChild {
    ...
}

public class NestedScrollView extends FrameLayout implements NestedScrollingParent, NestedScrollingChild, ScrollingView {
    ...
}

看到这我们就知道了,为什么 CoordinatorLayout 不支持和 ListView、ScrollView 嵌套联动,因为这俩小子没开这个卦呀

public class ListView extends AbsListView {
    ...
}

public class ScrollView extends FrameLayout {
    ...
}

NestedListView 源码如下


改完之后我们看下效果,和包裹 RecyclerView 的效果一样

GitHub地址