
同步多个RecyclerView构建电子表格Android-Extensions RecyclerViewMultiScroller深度实战【免费下载链接】Android-ExtensionsAn Android library with modules to quickly bootstrap an Android application.项目地址: https://gitcode.com/gh_mirrors/an/Android-ExtensionsAndroid-Extensions 的 RecyclerViewMultiScroller 可以一行调用同步多个 RecyclerView 的滚动让你快速构建带固定表头和侧边栏的电子表格界面。本文将带你搞懂它的核心机制并用示例 App 中的电子表格实战带你上手。 为什么需要同步滚动多个 RecyclerView用 RecyclerView 做电子表格是很经典的思路每一行是一个水平方向的 RecyclerView行与行再放进一个垂直方向的列表。这样每行可以独立复用、无限横向扩展。但问题随之而来用户滑动任何一行时其他所有行必须像素级同步移动否则表格瞬间散架固定表头、固定首列侧边栏还需要额外的 RecyclerView参与同步手动写onScrollListener互相转发滚动极易出现回环回调、惯性冲突、错位等问题。RecyclerViewMultiScroller正是为这个场景设计的把多个 RecyclerView 交给它滚动同步、位置对齐、手势冲突全部自动处理。源码位于 RecyclerViewMultiScroller.kt核心类注释就一句话同步滚动多个 RecyclerView非常适合构建表格。 核心三件套MultiScroller CellSizer整个 multiscroll 包只有 4 个文件结构非常轻量组件作用源码RecyclerViewMultiScroller注册并同步多个 RecyclerView 的滚动RecyclerViewMultiScroller.ktCellSizer接口提供第 N 列/行单元格的尺寸用于新加入者的位置对齐CellSizer.ktStaticCellSizer列宽/行高固定已知时使用通过sizeLookup函数给尺寸StaticCellSizer.ktDynamicCellSizer单元格大小不一时使用自动测量每列最大单元格并把所有列表对齐DynamicCellSizer.ktCellSizer为什么重要想象一下用户已经滑到了第 50 列此时一个新 RecyclerView 才被创建并加入同步组——它该怎么定位MultiScroller会累计总偏移量displacement新成员加入时根据sizeAt(position)逐列累加直接scrollToPositionWithOffset跳到正确位置见 sync 方法。没有 CellSizer这一步根本做不到。⚙️ 同步机制5 件它替你自动做的事转发滚动任意被监听的 RecyclerView 产生dx/dy滚动其余所有同步者立即scrollBy(dx, dy)onScrollListener。防回环只记录正在主动滚动的那个active实例忽略其他列表反馈回来的滚动事件避免 A 推 B、B 又推 A 的死循环。惯性冲突处理当你对某个列表甩出惯性滚动fling后又去触摸其他同步列表时会主动stopScroll()并拦截触摸手感干净不抢戏。新成员自动对齐如上文所述加入的 RecyclerView 会自动跳到当前偏移位置无需手动scrollToPosition。偏移量广播通过addDisplacementListener可以拿到实时总偏移适合驱动固定表头投影这类 UI 效果——示例 App 正是用它让侧边栏在有内容滑出时浮起阴影。 深度实战示例 App 的电子表格Android-Extensions示例 App 内置了一个完整的电子表格 Demo数据来自 spreadsheet_data.csv支持点击表头排序布局只有两层viewgroup_table.xml ├── main_rows ← 垂直 RecyclerView主体每一行是一个水平 RecyclerView └── sticky_rows ← 垂直 RecyclerView固定首列侧边栏布局文件viewgroup_table.xml关键在 TableBindings.kt它创建了两个方向不同的 MultiScrollerverticalScrollerVERTICALStaticCellSizer行高固定把main_rows和sticky_rows绑在一起——纵向滚动时主体与侧边栏严格同步horizontalScrollerHORIZONTAL 可选的Dynamic/StaticCellSizer把表格中每一行的水平 RecyclerView全部add进来——横向滚动时所有行、表头、侧边栏列首格列列对齐。每个行 ViewHolder 绑定时都会把自己内部的水平 RecyclerView 加入horizontalScrollerTableBindings.kt#L182-L195配合共享的RecycledViewPool行被回收复用也不影响同步状态。此外horizontalScroller的 displacement 监听器驱动了侧边栏的stickyElevator()弹簧动画横向滑出内容时侧边栏浮起带阴影回到顶部则淡出TableBindings.kt#L248-L276这正是同步偏移量最直观的 UI 收益。⚖️ 如何选择 StaticCellSizer 还是 DynamicCellSizer维度StaticCellSizerDynamicCellSizer列宽来源你通过sizeLookup函数给定运行时测量每列最大单元格单元格尺寸各列固定允许每格任意大小、自动对齐性能更省无需逐帧测量略高开销预绘制监听 measure适用场景表单、排名表等规整表格富文本、头像多行文本等异构列示例 App 提供了两个 Tab 让你直观对比这两种模式SpreadsheetFragment.kt#L91-L100Static cells用三档固定列宽Dynamic cells让内容撑开列宽并自动对齐所有行。建议能用 Static 就用 Static拿到免费性能。✅ 三步接入清单引入模块在 Gradle 中添加implementation com.tunjid.androidx:recyclerview:x.x.x版本见 libraryVersion.properties。创建 ScrollerRecyclerViewMultiScroller(orientation, cellSizer)方向取RecyclerView.HORIZONTAL或VERTICAL。注册列表对每个需要参与同步的 RecyclerView 调用scroller.add(rv)不需要时remove(rv)页面销毁时clear()防止泄漏。 实战提示适配 LinearLayoutManager源码注释明确说明它围绕LinearLayoutManager优化其他 LayoutManager 只能对齐到整位、无法精确到像素偏移垂直 水平双 Scroller是构建冻结行列表格的标准姿势别指望一个 Scroller 管两个方向配合 ViewPager2时行内水平 RecyclerView 可能需要allowSameDirectionScrollingInViewPager2()释放嵌套滚动示例中即用到了想扩展自定义尺寸策略只需实现 CellSizer 接口的sizeAt / include / exclude / clear四个方法即可。掌握RecyclerViewMultiScrollerCellSizer这套组合后多列表同步就从一团乱麻变成三个文件、几十行代码的事——这正是 Android-Extensions 这个库的设计哲学用最小的 API 面补上 AndroidX 没给你拼好的那块拼图。【免费下载链接】Android-ExtensionsAn Android library with modules to quickly bootstrap an Android application.项目地址: https://gitcode.com/gh_mirrors/an/Android-Extensions创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考