首页/新闻资讯/正文详情

HarmonyOS掌上记账APP开发实践第22篇:Scroll + List 虚拟列表 — 长列表性能优化全攻略

发布时间:2026/9/27 8:52:05 来源:云帆数科 栏目:资讯中心
HarmonyOS掌上记账APP开发实践第22篇:Scroll + List 虚拟列表 — 长列表性能优化全攻略
Scroll List 虚拟列表 — 长列表性能优化全攻略一、引言在记账应用中账单列表是最核心的数据展示场景可能包含数百甚至上千条交易记录。如果一次性渲染所有列表项将导致严重的内存占用和帧率下降。鸿蒙系统提供了 Scroll List 组合方案结合 ForEach / LazyForEach 实现虚拟列表渲染只渲染可视区域内的列表项大幅提升长列表性能。MoneyTrack 在资产详情页和首页账单流中广泛运用了这套方案。二、核心知识点2.1 Scroll 容器Scroll 是可滚动容器组件常用属性如下scrollable控制滚动方向取值ScrollDirection.Vertical垂直或ScrollDirection.Horizontal水平默认垂直scrollBar滚动条显示模式可选BarState.Auto自动显隐、BarState.Always常驻、BarState.Off隐藏edgeEffect边缘效果EdgeEffect.Spring弹性回弹、EdgeEffect.Fade淡出渐变、EdgeEffect.None无效果enableScrollInteraction布尔值控制是否允许用户手势滚动设为false可禁用滚动交互Scroll 可以包裹任意内容但不具备虚拟化能力适合内容长度可控如几十个组件的场景。当内容数据量较大时应优先使用 List。2.2 List ForEach / LazyForEachList 是专门为列表场景优化的组件支持虚拟列表机制。ForEach 与 LazyForEach 的对比如下对比维度ForEachLazyForEach渲染策略全量参与布局计算渲染可视项按需创建/销毁组件实例内存占用中等几十条可接受极低适合几百上千条适用场景数据量 ≤ 50 条数据量 50 条以上key 要求必须提供稳定唯一 key必须提供稳定唯一 key数据变更全量刷新按索引增量更新LazyForEach 需要实现 IDataSource 接口classTransactionDataSourceimplementsIDataSource{privatedataArray:TransactionItem[][];totalCount():number{returnthis.dataArray.length;}getData(index:number):TransactionItem{returnthis.dataArray[index];}registerDataChangeListener(listener:DataChangeListener):void{}unregisterDataChangeListener(listener:DataChangeListener):void{}}// 使用 LazyForEachList({space:8,scroller:this.listScroller}){LazyForEach(this.dataSource,(item:TransactionItem){ListItem(){TransactionCard({transaction:item})}},(item:TransactionItem)item.id)}2.3 List 辅助属性除了基础滚动List 还提供以下实用属性stickyHeader设置分组粘性标题取值StickyStyle.Header吸顶或StickyStyle.None不吸顶。在按日期分组的账单列表中非常实用用户滚动时始终能看到当前日期分组divider列表项分割线配置颜色和左右边距例如.divider({ strokeWidth: 1px, color: #E8E8E8, startMargin: 16, endMargin: 16 })cachedCount设置列表项缓存数量在可视区域外额外预创建 N 个组件提升快速滚动时的体验建议设为 1~3List({space:8,scroller:this.listScroller}){ForEach(this.viewModel.transactions,(tx:TransactionItem){ListItem(){TransactionCard({transaction:tx})}},(tx:TransactionItem)tx.id)}.edgeEffect(EdgeEffect.Spring).divider({strokeWidth:1px,color:#E8E8E8}).stickyHeader(StickyStyle.Header).cachedCount(2)三、虚拟列表渲染原理是否数据源 DataSource虚拟列表引擎判断是否在可视区域创建/复用 ListItem 组件不创建 / 销毁回收渲染到屏幕用户滚动触发新位置虚拟列表的核心思想是只渲染用户看得到的部分。当用户快速滚动时滑出屏幕的列表项被回收新进入区域的列表项被创建或复用从而将 DOM 节点数量控制在可视高度对应的范围内。四、性能监控验证虚拟列表是否生效使用 DevEco Studio 的 Profiler 工具可以监控列表性能查看组件树节点数打开 DevTools Elements 面板滚动列表时观察节点数是否保持稳定。若节点数随滚动持续增长说明虚拟化未生效分析内存占用Profiler Memory观察滚动过程中内存是否平稳。若内存持续上涨可能存在列表项未被正确回收帧率检测Profiler Frame确保滚动帧率稳定在 60fps。若出现掉帧可适当增大cachedCount减少快速滚动时的白屏五、最佳实践ListItem 组件化将列表项封装为独立组件如TransactionCard避免列表项内部状态变化触发整个列表刷新稳定 key 值务必为 ForEach/LazyForEach 提供唯一且稳定的 key 函数避免使用索引作为 key否则会导致渲染异常合理配置缓存大小cachedCount并非越大越好过大会增加内存占用建议设为 1~3兼顾快速滚动体验与内存效率选择正确的渲染方式数据量超过 50 条时优先使用 LazyForEach对于频繁增删操作的列表LazyForEach 的增量更新优势更明显六、总结Scroll List ForEach/LazyForEach 构成了鸿蒙长列表性能优化的核心方案。Scroll 作为通用滚动容器适合内容可控的场景List 结合虚拟列表机制专门针对大量列表数据优化。ForEach 适用于中等数据量LazyForEach 更适合大数据量场景其 IDataSource 接口提供了灵活的数据管理能力。在实际开发中配合 stickyHeader、divider 等辅助属性和 cachedCount 缓存优化可以构建出流畅、高性能的长列表页面。七、参考文档列表组件性能优化指南List 组件 API 参考LazyForEach 使用说明

相关推荐

在职考公时间碎,粉笔督学类功能实际能帮什么
在职考公时间碎,粉笔督学类功能实际能帮什么

在职考公的核心痛点是时间碎片化而非时间不足,粉笔公考APP通过短课模式、碎片刷题、智能推题、弹性学习计划和周末模考等功能,专门针对碎片化学习场景进行了深度优化,让在职考生能够高效利用通勤、午休等零散时间完成有效学习。 一、重新认识… · 2026/9/18 3:19:09

粉笔学习计划怎么用,才能像有人盯着你学一样
粉笔学习计划怎么用,才能像有人盯着你学一样

粉笔公考的学习计划功能,其核心价值在于把模糊的"备考"变成可执行的每日任务,让考生每天打开APP就知道该做什么、做多少、做到什么程度。只要按照正确的方法使用,粉笔学习计划能够产生类似"有人盯着你学"的引导效果&… · 2026/9/21 10:46:22

2026考试季语音工具哪个好?零基础新手避坑攻略看完直接上手
2026考试季语音工具哪个好?零基础新手避坑攻略看完直接上手

2026考试季,针对需要备考入职转正考核、整理培训语音、快速掌握产品技能的零基础职场新人,语音工具选择要匹配核心需求:如果仅需要转写短音频,普通手机自带工具就能满足;如果需要从培训录音里提炼考点、完成巩固复习&a… · 2026/9/21 3:47:19

9.26 大语言模型研究简报:把 Agent 开发做成“数据—训练—Harness”闭环
9.26 大语言模型研究简报:把 Agent 开发做成“数据—训练—Harness”闭环

Qwen-Planner-Agent:把 Agent 开发做成“数据—训练—Harness”闭环 公开时间(北京时间):2026 年 9 月 24 日 22:38 机构:Alibaba Token Hub / MAI Team 状态:论文预印本 技术报告 核心进展 阿里 MAI 团队… · 2026/9/27 8:52:00

【题解-Acwing】1072. 树的最长路径
【题解-Acwing】1072. 树的最长路径

题目:1072. 树的最长路径 题目描述 给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值。 现在请你找到树中的一条最长路径。 换句话说,要找到一条路径,使得路径两… · 2026/9/27 8:52:00

XMind 用久了会遇到的 5 类问题,和我的进阶用法
XMind 用久了会遇到的 5 类问题,和我的进阶用法

写在前面 XMind 是我用得最久的效率工具之一,从读书笔记到项目拆解,几乎每天都在用。用得越久,越发现新手期根本意识不到的一些问题——不是软件坏了,是没摸清它的脾气。这篇把常见问题和几个进阶用法一起写出来,帮你… · 2026/9/27 8:51:54

MongoDB 高可用集群部署
MongoDB 高可用集群部署

MongoDB 高可用集群部署 一、方案概述 1.1 目标 在 K8s 高可用集群上,部署一套 MongoDB 高可用集群,具备: 高可用:3 数据节点副本集,容忍 1 个节点故障自动故障转移:主节点故障时,从节点自动… · 2026/9/27 8:51:48

2027 AI校园碳迹伙伴:构建数字化校园碳普惠生态的完整产品方案
2027 AI校园碳迹伙伴:构建数字化校园碳普惠生态的完整产品方案

引言 在“双碳”目标与绿色校园建设的双重驱动下,如何将抽象的“减碳”理念转化为师生可感知、可参与、可激励的具体行动,成为高校数字化建设的重要课题。本文将为你完整拆解一款名为 “AI校园碳迹伙伴” 的数字化校园碳普惠平台产品方案。 该平台旨在通… · 2026/9/27 8:51:35

数据科学家在机器学习中的工作时间统计
数据科学家在机器学习中的工作时间统计

以下统计数据大致描述了数据科学家在一个机器学习项目中,不同工作环节所占的时间比例:工作内容时间占比清理和组织数据60%收集、整理或构建数据集19%在数据中发掘模式9%其他工作5%优化模型4%重塑训练数据集3%合计100%这组数据反映出一个重要事实&#xf… · 2026/9/27 8:51:35

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码