bug场景:
项目中有一个页面有点类似于淘宝首页,中间有比较多的重复item,为了减少布局嵌套,引入了vlayout框架来处理,在开发新需求的时候,因为业务场景的原因必须内嵌了一个ViewPager,而ViewPager中的一个局部又得是RecyclerView,此时发现内部的RecyclerView无法滑动,事件都被外部的RecyclerView拦截了。
bug分析:
注:为了更简要的说明,我们将外部的RecyclerView叫做RvParent,内部的RecyclerView叫做RvSon。
技术要点:
要想解决这个问题,必须有Android的触摸事件原理的基础,对于Android的事件分发网上已经有很多成熟的文章了,我这里就不再赘述了,如不清楚,请自行查阅。
技术难点:
- 1.当Touch事件处于MOVE时,如何将RvSon的MOVE传递给RvParent,以及如果将RvParent的MOVE传递给RvSon,并且体验良好。
- 2.RecyclerView的mScrollState处理不当会导致特殊场景下有bug。
拆分问题:
我们将问题拆分为俩点:
1.手指的落点在RvSon区域内:
a.当手指向上滑动时:
1>如果RvSon可以向上滚动,则滚动RvSon,当手指滚动RvSon时,如果RvSon已经滚动到最底部,此时手指还向上滑动,那么交给RvParent处理。
2>如果RvSon不可向上滚动,则滚动RvParent,当用户向上滚动RvParent时,如果用户突然向下滚动,此时判断RvSon是否可以向下滚动,如果可以:交给RvSon处理,如果不可,则还由RvParent处理。
b.当手指向下滑动时:原理同上。2.手指的落点子SonRv区域外:滚动事件由ParentRv全权处理。
代码如下:
1 | HanldeEvent如下: |
