OpenHarmony 网格、列表进阶与懒加载实战开发
承接前两篇 ArkUI 组件内容本文聚焦Grid 网格布局、List 列表高阶用法、组件懒加载、瀑布流等高频实用能力结合完整案例讲解特性、适配方案与性能优化适合页面布局进阶开发。一、概述在应用开发中图文宫格、商品陈列、相册、分类菜单等场景传统 Row/Column 布局已无法满足需求。Grid网格组件专门实现多列排布而List除基础列表外还支持分组、下拉刷新、上拉加载配合懒加载可以大幅优化长列表、多图页面的内存占用与渲染速度是大型应用必备技术。二、Grid 网格布局组件Grid 用于实现行列规则排列的宫格布局广泛应用于功能菜单、相册、商品列表、图标导航。搭配GridItem作为列表项使用。2.1 基础网格固定列数核心参数columnsTemplate定义列数与列宽rowsTemplate定义行数columnGap/rowGap设置行列间距。Entry Component struct GridBasicDemo { // 模拟宫格数据 gridData: string[] [首页, 分类, 购物车, 我的, 消息, 设置] build() { Column({ space: 20 }) { Text(基础4列网格布局).fontSize(20).fontWeight(FontWeight.Bold) Grid() { ForEach(this.gridData, (item: string) { GridItem() { Column() { // 模拟图标区域 Rect().width(50).height(50).fill(#007DFF).borderRadius(8) Text(item).fontSize(16).margin({ top: 8 }) } .width(100%) .alignItems(HorizontalAlign.Center) } }) } .columnsTemplate(1fr 1fr 1fr 1fr) // 均分4列 .columnGap(15) .rowGap(20) .width(100%) } .padding(20) } }2.2 不等宽网格布局通过不同比例fr单位实现非均等分网格适配复杂导航布局。Entry Component struct GridUnequalDemo { build() { Column({ space: 20 }) { Text(不等宽网格布局).fontSize(20).fontWeight(FontWeight.Bold) Grid() { GridItem() { Text(模块1).width(100%).height(80).textAlign(TextAlign.Center).backgroundColor(#87CEEB) } GridItem() { Text(模块2).width(100%).height(80).textAlign(TextAlign.Center).backgroundColor(#98FB98) } GridItem() { Text(模块3).width(100%).height(80).textAlign(TextAlign.Center).backgroundColor(#FFD700) } } .columnsTemplate(2fr 1fr 1fr) // 第一列宽度是后两列总和 .columnGap(10) .width(100%) } .padding(20) } }2.3 网格跨行列合并通过rowSpan、colSpan实现单元格跨行、跨列制作不规则宫格。Entry Component struct GridSpanDemo { build() { Grid() { // 跨2行 GridItem({ rowSpan: 2 }) { Text(跨行2行) .width(100%) .height(100%) .textAlign(TextAlign.Center) .backgroundColor(#FFA07A) } GridItem() { Text(普通项1).width(100%).height(80).textAlign(TextAlign.Center).backgroundColor(#DDA0DD) } GridItem() { Text(普通项2).width(100%).height(80).textAlign(TextAlign.Center).backgroundColor(#DDA0DD) } // 跨2列 GridItem({ colSpan: 2 }) { Text(跨列2列) .width(100%) .height(80) .textAlign(TextAlign.Center) .backgroundColor(#9370DB) } } .columnsTemplate(1fr 1fr 1fr) .rowGap(8) .columnGap(8) .width(100%) .padding(20) } }三、List 列表高阶用法在前文基础上拓展分组列表、下拉刷新、上拉加载三大实用功能是资讯、聊天、商品列表的核心能力。3.1 分组列表 ListItemGroup用于实现带标题的分组列表如通讯录、分类设置、多级菜单。Entry Component struct ListGroupDemo { build() { List({ space: 5 }) { // 第一组 ListItemGroup({ header: Text(常用功能).fontSize(18).fontWeight(FontWeight.Bold).padding(10) }) { ListItem() { Text(账号管理).width(100%).height(45).padding({ left: 15 }) } ListItem() { Text(安全中心).width(100%).height(45).padding({ left: 15 }) } } // 第二组 ListItemGroup({ header: Text(系统设置).fontSize(18).fontWeight(FontWeight.Bold).padding(10) }) { ListItem() { Text(消息通知).width(100%).height(45).padding({ left: 15 }) } ListItem() { Text(隐私权限).width(100%).height(45).padding({ left: 15 }) } } } .width(100%) .height(100%) } }3.2 下拉刷新 上拉加载更多结合onRefresh、onReachEnd实现列表动态刷新与分页加载模拟网络请求场景Entry Component struct ListLoadDemo { State listData: number[] [1, 2, 3, 4, 5] State isRefreshing: boolean false // 下拉刷新 onRefresh() { this.isRefreshing true setTimeout(() { this.listData [1, 2, 3, 4, 5] this.isRefreshing false }, 1500) } // 上拉加载 loadMore() { let len this.listData.length for (let i len 1; i len 5; i) { this.listData.push(i) } } build() { List({ space: 8 }) { ForEach(this.listData, (item: number) { ListItem() { Text(列表条目 ${item}) .width(100%) .height(50) .textAlign(TextAlign.Start) .padding({ left: 20 }) .backgroundColor(#F8F8F8) } }) } .width(100%) .height(100%) .refresh({ refreshing: this.isRefreshing }) .onRefresh(() this.onRefresh()) .onReachEnd(() this.loadMore()) } }四、组件懒加载LazyForEach普通ForEach会一次性渲染所有列表项数据量大时易卡顿、占用内存高。LazyForEach实现可视区域懒加载仅渲染屏幕内条目是长列表性能优化核心方案。4.1 懒加载基础使用需要自定义数据类实现ICollectionData接口适配懒加载数据源规则。// 实现懒加载数据源 class BasicDataSource implements ICollectionData { private dataArr: string[] constructor(arr: string[]) { this.dataArr arr } // 获取总数量 getTotalCount(): number { return this.dataArr.length } // 获取单条数据 getData(index: number): string { return this.dataArr[index] } // 数据变更通知 setDataChangeListener(listener: DataChangeListener): void {} } Entry Component struct LazyForEachDemo { // 模拟100条数据 private dataSource: BasicDataSource new BasicDataSource( Array.from({ length: 100 }, (_, idx) 懒加载条目 ${idx 1}) ) build() { List() { LazyForEach(this.dataSource, (item: string) { ListItem() { Text(item) .width(100%) .height(50) .padding({ left: 20 }) .backgroundColor(#F5F5F5) .margin({ bottom: 5 }) } }) } .width(100%) .height(100%) } }4.2 Grid 结合懒加载大量图片 / 宫格页面搭配LazyForEach大幅提升页面流畅度。Entry Component struct GridLazyDemo { private dataSource: BasicDataSource new BasicDataSource( Array.from({ length: 60 }, (_, idx) 宫格 ${idx 1}) ) build() { Grid() { LazyForEach(this.dataSource, (item: string) { GridItem() { Column() { Rect().width(60).height(60).fill(#4682B4).borderRadius(6) Text(item).fontSize(14).margin({ top: 6 }) } .width(100%) .alignItems(HorizontalAlign.Center) .padding(10) } }) } .columnsTemplate(1fr 1fr 1fr) .columnGap(12) .rowGap(15) .width(100%) .padding(15) } }五、综合实战相册页面Grid 懒加载整合网格布局与懒加载实现典型相册界面可直接用于项目开发。class ImageDataSource implements ICollectionData { private imgList: string[] constructor(list: string[]) { this.imgList list } getTotalCount(): number { return this.imgList.length } getData(index: number): string { return this.imgList[index] } setDataChangeListener(listener: DataChangeListener): void {} } Entry Component struct PhotoAlbum { // 模拟相册数据 albumData: ImageDataSource new ImageDataSource( Array.from({ length: 80 }, (_, i) 图片 ${i 1}) ) build() { Column() { Text(我的相册) .fontSize(24) .fontWeight(FontWeight.Bold) .padding(15) Grid() { LazyForEach(this.albumData, (name: string) { GridItem() { Stack() { Rect().width(100%).height(120).fill(#B0C4DE) Text(name).fontColor(Color.White).fontSize(14) } .width(100%) .borderRadius(6) } }) } .columnsTemplate(1fr 1fr 1fr) .columnGap(8) .rowGap(8) .layoutWeight(1) } .width(100%) .height(100%) .backgroundColor(#FFFFFF) } }六、开发总结与性能优化6.1 布局组件选用规则单列滚动列表、聊天页、资讯页优先使用List多列图标、相册、商品宫格优先使用Grid分组展示内容使用ListItemGroup快速实现分组标题。6.2 懒加载使用规范数据量超过 30 条建议使用LazyForEach替代普通ForEach图片类页面必须开启懒加载避免一次性加载大量图片造成 OOM懒加载数据源必须实现ICollectionData接口保证数据驱动正常。6.3 通用优化技巧列表 / 网格项样式尽量简化减少嵌套组件层级图片统一设置固定宽高避免动态宽高引发布局抖动下拉刷新、上拉加载增加加载状态提示提升交互体验。七、拓展方向实现瀑布流布局打造图文资讯流页面结合路由跳转实现点击列表 / 宫格项跳转到详情页学习列表侧滑删除、多选操作等高级交互。

相关新闻

OpenHarmony 进阶 UI 组件、自定义组件实战与交互开发

OpenHarmony 进阶 UI 组件、自定义组件实战与交互开发

一、引言在上一篇文章中,我们学习了 OpenHarmony ArkUI 基础组件与基础布局,能够完成常规页面搭建。在实际项目开发中,还会用到选择器、弹窗、进度条、开关等进阶交互组件;同时页面中大量重复的 UI 模块,需要通过自定义…

2026/10/18 3:35:52 阅读更多 →
B端拓客中法人号码核验的精准解决方案

B端拓客中法人号码核验的精准解决方案

1. B端拓客中的法人号码核验痛点企业服务领域(B端)的销售团队都面临一个经典难题:如何从海量企业信息中筛选出有效的法人联系方式?这个问题看似简单,实际操作中却存在诸多陷阱。我服务过三家不同规模的ToB企业&#xf…

2026/10/18 3:35:54 阅读更多 →
Codex接入第三方大模型:协议适配与三种实战方案详解

Codex接入第三方大模型:协议适配与三种实战方案详解

如果你最近在尝试将 Codex 这个备受关注的 AI 编程助手接入 DeepSeek、GLM 或 Kimi 这类第三方大模型,并且发现事情远没有“填个 API Key 就能用”那么简单,那么这篇文章就是为你准备的。 一个普遍的误解是:既然 Codex 支持自定义模型端点,那么接入任何第三方 API 都应该像…

2026/10/18 3:37:28 阅读更多 →

最新新闻

DeepThink V1.1.0 开源发布:用 TaoToken 统一 Key 打造个人 AI 操作系统,全自主托管跑通超复杂长程任务

DeepThink V1.1.0 开源发布:用 TaoToken 统一 Key 打造个人 AI 操作系统,全自主托管跑通超复杂长程任务

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:28:02 阅读更多 →
优秀的大模型API网关系统Veloera:Docker部署与TaoToken统一Key接入实践

优秀的大模型API网关系统Veloera:Docker部署与TaoToken统一Key接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:28:02 阅读更多 →
Java批量重命名命令行工具:正则匹配与安全校验实战

Java批量重命名命令行工具:正则匹配与安全校验实战

简介:针对Java文件批量重命名的源码包,面向日常开发中需要整理大量文件的Java程序员,提供一套简单直接的解决方案;整个资源为一个压缩包,体积仅1KB,内含1个Java源文件,代码结构紧凑,…

2026/10/19 0:28:02 阅读更多 →
Java 重造 Agent 框架:从 ReAct 到工具调用的工程实践

Java 重造 Agent 框架:从 ReAct 到工具调用的工程实践

1. 为什么我要用 Java 重造一个 Agent 框架市面上讲 AI Agent 的文章,十篇里有八篇是 Python 写的,剩下两篇是 TypeScript。Java 程序员想找个能直接读源码、能塞进现有 Spring 项目里的 Agent 框架,翻遍 GitHub 也就那么几个半成品。我在一个…

2026/10/19 0:28:02 阅读更多 →
开源AI编程助手Continue的VsCode插件:把settings.json改到TaoToken

开源AI编程助手Continue的VsCode插件:把settings.json改到TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:28:02 阅读更多 →
CANfestival嵌入式CANopen协议栈深度解析与STM32实战

CANfestival嵌入式CANopen协议栈深度解析与STM32实战

简介:CANfestival 是一个轻量级、模块化的开源 CANopen 协议栈实现,面向嵌入式开发者、工业通信初学者及汽车电子/自动化领域工程师,用于快速构建符合 CANopen 标准的节点设备或学习协议底层机制。资源包共 50 个文件,以 30 个头文…

2026/10/19 0:27:02 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →