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


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值