RecyclerView嵌套RecyclerView完美实现京东tab吸顶效果
时间:2022-07-28
本文章向大家介绍RecyclerView嵌套RecyclerView完美实现京东tab吸顶效果,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
效果展示
动画展示:https://github.com/FangMessi/nested_scroll_demo/blob/main/screenshot/ajqoe-vk8xu.gif
页面结构
方案
继承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()
5、4不消耗,则父类dispatchNestedFling& 自己mViewFlinger.fling()
方案呼之欲出了
1、继承RecyclerView
2、重写dispatchNestedPreScroll()&dispatchNestedPreFling(),在询问父类之前,
先尝试把事件分发给内部RecyclerView
源码
- 一切不放源码的分享都是耍流氓
https://github.com/FangMessi/nested_scroll_demo
最后
- 欢迎提出问题,一起沟通讨论
- 码字不易,您的点赞是我继续分享的动力
- 实战 | Elasticsearch打造知识库检索系统
- Elasticsearch实战 | 必要的时候,还得空间换时间!
- 转--以io.Writer为例看go中的interface{}
- Go支持https协议的简单例子
- Elasticsearch索引增量统计及定时邮件实现
- 机器学习中的特征空间
- 简单易学的机器学习算法——马尔可夫链蒙特卡罗方法MCMC
- 推荐算法——基于图的推荐算法PersonalRank算法
- 推荐算法——非负矩阵分解(NMF)
- 【Go 语言社区】转-golang windows 判断锁屏
- 【Go 语言社区】单点redis 持久化在高并发下存在延迟情况
- 设计模式(2)-策略模式之多用组合少用继承
- Golang获取随机端口和本机ip地址
- 设计模式(3)-装扮你的类(装饰模式)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Saltstack_使用指南07_远程执行-执行模块
- 学习从拥有一支好笔开始
- Saltstack_使用指南08_远程执行-返回程序
- 人生苦短,何不用vim装13
- Saltstack_使用指南09_远程执行-编写执行模块
- 如何安装FreeIPA
- 编译及使用hive-testbench生成Hive基准测试数据
- 树酱的前端知识体系构建(下)
- Babel配置傻傻看不懂?
- Saltstack_使用指南10_配置管理-状态模块
- Saltstack_使用指南11_配置管理-状态之间依赖关系 4.1. 部署架构4.2. Apache和PHP的SLS【正向依赖】4.3. mariadb 的 SLS
- 前端工程化之CICD那点破事
- Saltstack_使用指南12_配置管理-jinja模板 4.1. 部署架构4.2. 本章涉及的 pillar 的信息4.3. 配置文件 httpd.conf 修改
- Saltstack_使用指南13_runner的job和manage与execution的saltutil 5.1. master执行5.2. 查看当前活动的jobs
- Saltstack_使用指南14_无master 3.1. 常规信息3.2. grains设置3.3. pillar设置