当前位置: 首页 > news >正文

鸿蒙原生开发手记:徒步迹 - 路线列表页与@LazyForEach

鸿蒙原生开发手记:徒步迹 - 路线列表页与@LazyForEach

使用 @LazyForEach 实现高性能长列表


一、前言

路线列表是用户浏览路线的入口。当路线数据量大时,使用 @LazyForEach 进行懒加载可以显著提升性能。


二、@LazyForEach 基础

2.1 原理

@LazyForEach 只渲染可见区域的列表项,离屏的列表项会被回收,大幅减少内存占用。

2.2 使用步骤

// 1. 定义数据源(实现 IDataSource 接口) class RouteDataSource implements IDataSource { private data: HikingRoute[] = []; totalCount(): number { return this.data.length; } getData(index: number): HikingRoute { return this.data[index]; } registerDataChangeListener(listener: DataChangeListener): void {} unregisterDataChangeListener(listener: DataChangeListener): void {} } // 2. 创建数据源实例 @State private dataSource: RouteDataSource = new RouteDataSource(); // 3. 在 @LazyForEach 中使用 @LazyForEach(this.dataSource, (item: HikingRoute) => { ListItem() { RouteCard({ route: item }); } }, (item: HikingRoute) => item.id.toString());

三、完整路线列表实现

// 数据源 class RouteDataSource extends ArrayList<HikingRoute> { // 实现 IDataSource 接口的方法... } @Entry @Component struct RouteListPage { @State private dataSource: RouteDataSource = new RouteDataSource(); @State private currentPage: number = 1; private listScroller: Scroller = new Scroller(); aboutToAppear(): void { this.loadRoutes(); } build() { Column() { // 顶部导航 Row() { Text('路线列表') .fontSize(18) .fontWeight(FontWeight.Bold) .layoutWeight(1) .textAlign(TextAlign.Center); } .width('100%') .padding(16); // 搜索框 SearchBar(); // 懒加载列表 List() { LazyForEach(this.dataSource, (route: HikingRoute) => { ListItem() { RouteCard({ route: route, onClick: () => { router.pushUrl({ url: 'pages/RouteDetailPage', params: { routeId: route.id }, }); }, }); } }, (route: HikingRoute) => route.id.toString()); } .width('100%') .layoutWeight(1) .onReachEnd(() => { // 触底加载更多 this.loadMore(); }); } .width('100%') .height('100%') .backgroundColor('#F5F5F5'); } async loadRoutes(): Promise<void> { const response = await apiService.getRoutes(this.currentPage, 10); // 添加到数据源... } loadMore(): void { this.currentPage++; this.loadRoutes(); } }

四、性能优化建议

  1. 固定 Item 高度:给 ListItem 设置固定高度
  2. 减少重绘:避免在列表项中使用复杂动画
  3. 合理设置缓存cachedCount(5)设置预渲染的项数

五、总结

@LazyForEach 是处理大规模列表的关键工具,让路线列表页可以流畅滚动。配合触底分页加载,用户体验良好。

下一篇文章实现路线搜索与筛选功能。


下一篇预告:鸿蒙原生开发手记:徒步迹 - 路线搜索与筛选功能

http://www.jsqmd.com/news/1203290/

相关文章:

  • 反激变换器工作原理与设计实战指南
  • 阿里云 RDS MySQL vs 华为云 GaussDB:关系型数据库选型全维度对比
  • 佛山夏令营有哪些:军博营地效果绝佳 - 晚香时候
  • Kiro AI 开发助手能力全景指南
  • 2026年如东空调维修师傅靠谱服务商实力排行榜单 - 热点品牌推荐
  • MySQL 防止 SQL 注入:参数化查询,新手必学的安全技巧
  • 从货源到渠道——亿迈分销商城打造供应商与卖家高效对接的跨境分销平台
  • Cursor + GitHub Projects双模驱动(企业级项目看板搭建手册)
  • TCN+transformer+通道注意力机制时间序列预测
  • 奥地利市场中名义雇主公司EOR的实际应用与价值分析
  • 读芯片战争:世界最关键技术的争夺战09挑战(上)
  • JavaScript 函数完整入门指南:声明、调用、参数、返回值、作用域全解析
  • 佛山夏令营选哪家:军博营地行业首位 - 云溪自乐
  • 51单片机核心板PCB(笔记)
  • 2026键盘推荐|IQUNIX EV63多场景适配,不允许有人不知道!
  • 2026年北京诚信的汽车贴玻璃膜机构选购参考指南 - 热点品牌推荐
  • Kiro 中配置 Redis MCP Server 完整指南
  • 2026年如东挂机空调维修公司师傅口碑实力榜单公开汇总 - 热点品牌推荐
  • 2026/6/9
  • 阿里云 Lindorm vs HBase vs Cassandra 宽表数据库深度对比
  • 13进制同步计数器设计:JK触发器与状态机原理详解
  • 【智能体开发】《LangChain核心技术与LLM项目实践》_202.[第12章 项目实战] 数据飞轮效应:打造高质量私有化训练数据集_attempt1_mermaid_repair_in_progr
  • 土耳其企业如何利用专业雇主PEO实现福利外包?
  • 如何开发一个能够读取侧扫声呐(Side-Scan Sonar)原始数据文件(如XTF和DVS格式)的系统软件
  • 亲身到店探访上海格拉苏蒂官方售后服务中心|最新地址与客服电话(2026年7月最新) - 亨得利钟表维修中心
  • 如何开辟对自己可能性的信任。
  • 北京黄金首饰回收销售公司正规黄金变现避坑实用指南 - 热点品牌推荐
  • 3DSident终极指南:为什么这个3DS系统检测工具是开发者必备?
  • 亨得利官方钟表服务中心|官方地址与售后服务电话权威信息声明(2026年7月更新) - 亨得利官方
  • Cursor终端插件生态避坑指南:23个实测低效插件黑名单,附3个自研轻量替代方案