解决滑动折叠RecyclerView嵌套RecyclerView的问题

target

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

bug

参考官方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的事件体系,下次要归纳总结。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容