RecyclerView嵌套RecyclerView完美实现京东tab吸顶效果

·  阅读 896
RecyclerView嵌套RecyclerView完美实现京东tab吸顶效果

效果展示

页面结构

方案

继承RecyclerView,
重写dispatchNestedPreScroll&dispatchNestedPreFling,
自行托管事件的消耗
复制代码

关于方案的选择

  • CoordinatorLayout&AppBarLayout&RecyclerView
该方案有两个问题:
1、tab以上的部分不够灵活。相信大家都运行过material design的demo,
tab以上的部分基本可以理解成一个LinearLayout,需要单独绘制每一个item,
需要产品需要调整顺序就麻烦了
2、AppBarLayout会限制app头部的样式。google的设计很好看,不过像电商之类的App,
头部的复杂程度远超想象,也许就遇到一个AppBarLayout不好支持的效果
复制代码
  • RecyclerView嵌套RecyclerView,加上事件分发
事件分发机制,有个天然的缺陷。
一旦parent选择拦截消耗了事件,child将不再收到parent分发的事件了。
想要实现一次事件(down&move*n&up)一开始由parent消耗,然后由child消耗,事件分发机制就做不到了
复制代码
  • RecyclerView嵌套RecyclerView,加上嵌套滚动(NestedScrollChild&NestedScrollParent)
基于嵌套滚动的机制,RecyclerView$onTouchEvent处理事件的流程是:
---------------- scroll ---------------
1、父类是否消耗scroll事件 dispatchNestedPreScroll()
2、自己消耗 scrollByInternal()
3、父类消耗 dispatchNestedScroll()
---------------- fling ----------------
4、父类是否消耗fling事件 dispatchNestedPreFling()
54不消耗,则父类dispatchNestedFling& 自己mViewFlinger.fling()
复制代码

方案呼之欲出了

1、继承RecyclerView
2、重写dispatchNestedPreScroll()&dispatchNestedPreFling(),在询问父类之前,
先尝试把事件分发给内部RecyclerView
复制代码

源码

  • 一切不放源码的分享都是耍流氓
https://github.com/FangMessi/nested_scroll_demo
复制代码

源码

最后

  • 欢迎提出问题,一起沟通讨论
  • 码字不易,您的点赞是我继续分享的动力
分类:
Android
标签:
收藏成功!
已添加到「」, 点击更改