CoordinatorLayout嵌套多个Recyclerview

要做一个功能,使用Design Support Library的滑动折叠。滑动下方纵向的RecyclerView,折叠上方的图片。同时,纵向RecyclerView嵌套一个横向RecyclerView,支持左右滑动数字。


参考官方demo,很容易使用CoordinatorLayout和CollapsingToolbarLayout实现。添加纵向RecyclerView的时候,一切正常,但接着添加横向RecyclerView时,滑动明显出bug,上方的图片无法自动折叠。


非横向RecyclerView的区域可以正常触发折叠,容易确定是横向RecyclerView的事件没有传递到CollapsingToolbarLayout。纵向RecyclerView已经设定了app:layout_behavior,内部的所有view都可以正常触发折叠,横向的RecyclerView理应也可以。


public class RecyclerView extends ViewGroup implements ScrollingView, NestedScrollingChild

查看RecyclerView的implements,NestedScrollingChild引起了我的注意,明显写着“嵌套”嘛。Android新引入NestedScrollView代替ScrollView,应该是为了解决滑动下嵌套的问题。


请教Google大神,最终为横向RecyclerView增加一句setNestedScrollingEnabled(false),问题解决。


具体的代码看CollapsingToolbarLayoutActivity
,一个我用来验证代码的工程,里面乱七八糟的。


在事件分发模型中,手指down、move、up整个滑动过程,一旦有View决定拦截这个事件,那么整个事件过程都交由它来处理,其他View没有机会再处理了。


新的嵌套滑动机制增加支持子View和父View共同处理滑动事件的能力,子View处理事件的时候,能通知父View同时处理。


CoordinatorLayout实现了NestedScrollingParent,纵向RecyclerView是CoordinatorLayout的子View,RecyclerView的滑动能通知到CoordinatorLayout,继而由CoordinatorLayout协调让CollapsingToolbarLayout发生折叠。


上面出bug的原因也能理解了,横向RecyclerView的父View是纵向RecyclerView,而RecyclerView只实现了NestedScrollingChild,无法像CoordinatorLayout一样响应。所以要关闭横向RecyclerView的嵌套滑动功能,让横向RecyclerView如同其他嵌入纵向RecyclerView的view一样,触发折叠。


本文主要是讲解决bug的过程,知其然知其所以然,很有必要了解源码实现。Android工程师必须熟练掌握View的事件体系,下次要归纳总结。


猜你喜欢

转载自blog.csdn.net/ltp_zy/article/details/80007179