HarmonyOS开发实战:小分享-FavoritesPage收藏页——分类Tab+List列表
前言欢迎加入开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net收藏页让用户查看已收藏的分享内容支持分类筛选和列表展示。小分享 App 的 FavoritesPage 使用List 组件实现列表配合分类 Tab 切换筛选内容。本篇讲解 List 与 ListItem 组件、Tab 下划线、State 选中态等核心实现。详细 API 可参考 HarmonyOS List 官方文档。一、FavoritesPage 完整代码1.1 页面完整实现import router from ohos.router; import { BottomTabBar } from ../components/BottomTabBar; import { FavoriteItem } from ../common/interfaces; Entry Component struct FavoritesPage { State selectedTab: number 0; private tabs: string[] [全部, 文字, 图片, 链接, 笔记]; private favorites: ArrayFavoriteItem [ { title: 生活的美好在于分享, subtitle: , time: 今天 10:30, type: 文字 }, { title: 山川湖海天地与爱。, subtitle: , time: 今天 09:15, type: 图片 }, { title: 10个提升效率的工具推荐, subtitle: , time: 昨天 21:30, type: 链接 }, { title: 读书笔记活着, subtitle: , time: 昨天 20:45, type: 笔记 } ]; build() { Column() { this.HeaderBar() this.CategoryTabs() this.FavoriteList() BottomTabBar({ currentIndex: 3 }) } .width(100%).height(100%).backgroundColor(#F5F5F5) } }1.2 Header 导航栏Row() { Text(‹).fontSize(24).fontColor(#1A1A1A).onClick(() { router.back() }) Text(我的收藏).fontSize(18).fontWeight(FontWeight.Bold).fontColor(#1A1A1A).layoutWeight(1).textAlign(TextAlign.Center) Text().fontSize(20).fontColor(#666666) } .width(100%).padding({ left: 16, right: 16, top: 12, bottom: 12 }).backgroundColor(Color.White)二、List 与 ListItem2.1 基本结构List() { ForEach(this.favorites, (item: FavoriteItem, index: number) { ListItem() { this.FavoriteItemRow(item) } }, (item: FavoriteItem, index: number) ${item.title}_${index}) } .layoutWeight(1) .divider({ strokeWidth: 0.5, color: #F0F0F0 })2.2 List 优势对比维度ListScroll Column性能懒加载只渲染可见项一次性渲染所有分割线内置 divider 属性手动添加 Divider滑动优化流畅度基础滚动适用场景大量数据少量数据2.3 divider 分割线.divider({ strokeWidth: 0.5, color: #F0F0F0 })三、分类 Tab3.1 Tab 数组private tabs: string[] [全部, 文字, 图片, 链接, 笔记];3.2 Tab 选中下划线.border({ width: { bottom: 2 }, color: { bottom: this.selectedTab index ? #F5A623 : Color.Transparent } })四、收藏列表项4.1 列表项布局ListItem() { Row({ space: 12 }) { Column({ space: 6 }) { Text(item.title).fontSize(15).fontWeight(FontWeight.Medium).fontColor(#1A1A1A) .maxLines(1).textOverflow({ overflow: TextOverflow.Ellipsis }) Text(item.time).fontSize(12).fontColor(#999999) } .alignItems(HorizontalAlign.Start).layoutWeight(1) Text(⭐).fontSize(20) } .width(100%).padding({ left: 16, right: 16, top: 16, bottom: 16 }).backgroundColor(Color.White) }五、页面布局结构Column (主容器背景 #F5F5F5) ├─ Row (Header 导航栏白色背景) │ ├─ Text(‹) 返回 │ ├─ Text(我的收藏) 标题 │ └─ Text() 占位 ├─ Row (分类 Tab 栏) │ ├─ Text(全部) │ ├─ Text(文字) │ ├─ Text(图片) │ ├─ Text(链接) │ └─ Text(笔记) ├─ List (收藏列表) - layoutWeight(1) │ ├─ ListItem (收藏项 1) │ ├─ ListItem (收藏项 2) │ └─ ... └─ BottomTabBar (底部导航栏) - currentIndex: 3六、State 状态管理6.1 选中分类State selectedTab: number 0; .onClick(() { this.selectedTab index })七、完整代码文件索引文件路径说明pages/FavoritesPage.ets收藏页面common/interfaces.etsFavoriteItem 接口定义components/BottomTabBar.ets底部导航栏组件八、本文涉及的所有 APIAPI/组件用途文档链接List列表组件ListListItem列表项ListItemState状态管理State Guideborder()边框样式Borderrouter.back()返回RouterText文本组件TextBottomTabBar底部导航自定义组件总结本文详细讲解了 FavoritesPage 收藏页的分类 Tab 与 List 列表实现。核心知识点包括List 懒加载性能优于 ScrollColumn、divider 分割线内置属性简化代码、分类 Tab 切换border 下划线实现选中态、文字溢出省略maxLines(1)textOverflow(Ellipsis)。至此小分享 App 所有主页面和核心组件第 21-30 篇已全部讲解完毕。下一篇我们将开启第 31 篇 DiscoverPage 发现页的实现。附录收藏页的完整实现细节1. 完整的页面布局结构Column (主容器背景 #F5F5F5) ├─ Row (Header 导航栏白色背景) │ ├─ Text(‹) 返回 │ ├─ Text(我的收藏) 标题 │ └─ Text() 占位 ├─ Row (分类 Tab 栏白色背景) │ ├─ Text(全部) - 选中态 #F5A623 下划线 │ ├─ Text(文字) │ ├─ Text(图片) │ ├─ Text(链接) │ └─ Text(笔记) ├─ List (收藏列表) - layoutWeight(1) │ ├─ ListItem (收藏项 1) │ │ ├─ Column (标题 时间) │ │ └─ Text(⭐) │ ├─ ListItem (收藏项 2) │ └─ ... └─ BottomTabBar (底部导航栏) - currentIndex: 32. List 组件的完整实现List() { ForEach(this.favorites, (item: FavoriteItem, index: number) { ListItem() { Row({ space: 12 }) { Column({ space: 6 }) { Text(item.title).fontSize(15).fontWeight(FontWeight.Medium).fontColor(#1A1A1A) .maxLines(1).textOverflow({ overflow: TextOverflow.Ellipsis }) Text(item.time).fontSize(12).fontColor(#999999) } .alignItems(HorizontalAlign.Start).layoutWeight(1) Text(⭐).fontSize(20) } .width(100%).padding({ left: 16, right: 16, top: 16, bottom: 16 }).backgroundColor(Color.White) } }, (item: FavoriteItem, index: number) ${item.title}_${index}) } .layoutWeight(1) .divider({ strokeWidth: 0.5, color: #F0F0F0 })3. 分类 Tab 的完整实现Row({ space: 0 }) { ForEach(this.tabs, (item: string, index: number) { Column() { Text(item).fontSize(14) .fontColor(this.selectedTab index ? #F5A623 : #666666) .fontWeight(this.selectedTab index ? FontWeight.Bold : FontWeight.Normal) } .padding({ left: 16, right: 16, top: 12, bottom: 12 }) .border({ width: { bottom: 2 }, color: { bottom: this.selectedTab index ? #F5A623 : Color.Transparent } }) .onClick(() { this.selectedTab index }) }, (item: string, index: number) item) } .width(100%).backgroundColor(Color.White)4. 收藏页数据模型export interface FavoriteItem { title: string; subtitle: string; time: string; type: string; }5. List 与 Scroll 性能对比对比维度ListScroll Column渲染方式懒加载一次性渲染全部分割线内置 divider手动添加滑动性能优基础适用场景大量数据少量数据6. 完整代码文件索引文件路径说明pages/FavoritesPage.ets收藏页面common/interfaces.etsFavoriteItem 接口定义components/BottomTabBar.ets底部导航栏组件7. 本文涉及的所有 APIAPI/组件用途文档链接List列表组件ListListItem列表项ListItemState状态管理State Guideborder()边框样式Borderrouter.back()返回RouterText文本组件TextBottomTabBar底部导航自定义组件8. 实现要点总结收藏页的核心实现要点List 懒加载性能优于 ScrollColumndivider 分割线List 内置属性简化代码分类 Tab 切换border 下划线 State 选中态文字溢出省略maxLines(1)textOverflow(Ellipsis)底部导航集成 BottomTabBar 组件9. 总结本文详细讲解了 FavoritesPage 收藏页的完整实现。核心知识点包括List 懒加载性能优于 ScrollColumn、divider 分割线内置属性简化代码、分类 Tab 切换border 下划线实现选中态、文字溢出省略maxLines(1)textOverflow(Ellipsis)。至此小分享 App 所有主页面和核心组件第 21-30 篇已全部讲解完毕。附录收藏页的完整实现细节1. 完整的页面布局结构Column (主容器背景 #F5F5F5) ├─ Row (Header 导航栏白色背景) │ ├─ Text(‹) 返回 │ ├─ Text(我的收藏) 标题 │ └─ Text() 占位 ├─ Row (分类 Tab 栏白色背景) │ ├─ Text(全部) - 选中态 #F5A623 下划线 │ ├─ Text(文字) │ ├─ Text(图片) │ ├─ Text(链接) │ └─ Text(笔记) ├─ List (收藏列表) - layoutWeight(1) │ ├─ ListItem (收藏项 1) │ │ ├─ Column (标题 时间) │ │ └─ Text(⭐) │ ├─ ListItem (收藏项 2) │ └─ ... └─ BottomTabBar (底部导航栏) - currentIndex: 32. List 组件的完整实现List() { ForEach(this.favorites, (item: FavoriteItem, index: number) { ListItem() { Row({ space: 12 }) { Column({ space: 6 }) { Text(item.title) .fontSize(15) .fontWeight(FontWeight.Medium) .fontColor(#1A1A1A) .maxLines(1) .textOverflow({ overflow: TextOverflow.Ellipsis }) Text(item.time) .fontSize(12) .fontColor(#999999) } .alignItems(HorizontalAlign.Start) .layoutWeight(1) Text(⭐) .fontSize(20) } .width(100%) .padding({ left: 16, right: 16, top: 16, bottom: 16 }) .backgroundColor(Color.White) } }, (item: FavoriteItem, index: number) ${item.title}_${index}) } .layoutWeight(1) .divider({ strokeWidth: 0.5, color: #F0F0F0 })3. 分类 Tab 的完整实现Row({ space: 0 }) { ForEach(this.tabs, (item: string, index: number) { Column() { Text(item) .fontSize(14) .fontColor(this.selectedTab index ? #F5A623 : #666666) .fontWeight(this.selectedTab index ? FontWeight.Bold : FontWeight.Normal) } .padding({ left: 16, right: 16, top: 12, bottom: 12 }) .border({ width: { bottom: 2 }, color: { bottom: this.selectedTab index ? #F5A623 : Color.Transparent } }) .onClick(() { this.selectedTab index }) }, (item: string, index: number) item) } .width(100%) .backgroundColor(Color.White)4. FavoriteItem 数据模型export interface FavoriteItem { title: string; // 收藏标题 subtitle: string; // 副标题 time: string; // 收藏时间 type: string; // 类型文字/图片/链接/笔记 }5. 收藏列表数据标题时间类型生活的美好在于分享今天 10:30文字山川湖海天地与爱。今天 09:15图片10个提升效率的工具推荐昨天 21:30链接读书笔记活着昨天 20:45笔记6. List 与 Scroll 的性能对比对比维度ListScroll Column渲染方式懒加载只渲染可见项一次性渲染全部分割线内置divider属性手动添加 Divider滑动性能优优化流畅度基础滚动适用场景大量数据100 条少量数据 20 条7. 完整代码文件索引文件路径说明pages/FavoritesPage.ets收藏页面common/interfaces.etsFavoriteItem 接口定义components/BottomTabBar.ets底部导航栏组件8. 本文涉及的所有 APIAPI/组件用途文档链接List列表组件ListListItem列表项ListItemState状态管理State Guideborder()边框样式Borderrouter.back()返回RouterText文本组件TextBottomTabBar底部导航自定义组件9. 实现要点总结收藏页的核心实现要点List 懒加载性能优于 ScrollColumn适合大量数据divider 分割线List内置divider属性简化代码分类 Tab 切换border条件渲染下划线State控制选中态文字溢出省略maxLines(1)textOverflow(Ellipsis)底部导航集成BottomTabBar组件currentIndex: 3下一步优化方向集成Preferences实现收藏数据持久化添加滑动删除收藏项功能支持按分类筛选收藏列表如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力

相关新闻

Unity WebView插件实战指南:选型、集成与性能优化全解析

Unity WebView插件实战指南:选型、集成与性能优化全解析

1. 项目概述:为什么Unity开发者绕不开WebView? 如果你是一个Unity开发者,无论是做手游、PC应用还是XR项目,大概率都遇到过这样一个需求:在3D游戏世界里,嵌入一个能流畅显示网页内容的界面。可能是用户协议、…

2026/7/24 14:03:52 阅读更多 →
UE5 Pak文件动态加载指南:用PakLoaderPlugin实现DLC与模组管理

UE5 Pak文件动态加载指南:用PakLoaderPlugin实现DLC与模组管理

1. 项目概述:为什么我们需要一个“DLC”加载器?如果你正在用UE5开发游戏,尤其是PC或主机平台的项目,迟早会遇到一个绕不开的需求:如何优雅地管理游戏发布后的额外内容?无论是修复Bug的热更新补丁&#xff0…

2026/7/24 14:03:52 阅读更多 →
OmniTalker:AI唇形同步技术解析与实践

OmniTalker:AI唇形同步技术解析与实践

1. 项目概述:OmniTalker如何解决唇形同步难题 上周测试团队发来一段AI生成的带货视频,画面中主播的嘴型明显比配音慢了半拍,评论区全是"这AI怕不是得了面瘫"的吐槽。这种音画不同步的"电子面瘫"现象,正是当前…

2026/7/24 14:03:52 阅读更多 →

最新新闻

实时语音翻译中的术语适配:基于证据的延迟与准确性平衡策略

实时语音翻译中的术语适配:基于证据的延迟与准确性平衡策略

在实时语音翻译领域,我们经常面临一个关键抉择:什么时候应该引入额外上下文信息?传统方法要么过度依赖上下文导致延迟增加,要么完全忽略上下文造成术语翻译不准确。今天要介绍的Evidence-Grounded Terminology Adaptation方法&…

2026/7/24 14:14:57 阅读更多 →
AI动漫生成技术:从原理到实践

AI动漫生成技术:从原理到实践

1. AI动漫生成技术概述动漫创作正经历一场由AI驱动的技术革命。不同于传统手绘动画需要数周完成的单帧画面,现代生成式AI能在几秒内产出风格统一的动漫图像。这背后是扩散模型(Diffusion Models)与生成对抗网络(GANs)的…

2026/7/24 14:14:57 阅读更多 →
物流行业数据分析:AI 路径优化与配送时效预测的工程实践

物流行业数据分析:AI 路径优化与配送时效预测的工程实践

物流行业数据分析:AI 路径优化与配送时效预测的工程实践 一、物流数据场景的特殊挑战 做数据分析这几年,物流行业绝对是我遇到过最"硬核"的数据场景之一。每天几千万条轨迹点、上百万个订单状态变更、几千台车辆的实时位置,数据的体…

2026/7/24 14:14:57 阅读更多 →
CC3235MODx引脚复用与功耗管理实战:嵌入式Wi-Fi设计核心解析

CC3235MODx引脚复用与功耗管理实战:嵌入式Wi-Fi设计核心解析

1. 项目概述:从引脚复用与功耗管理看CC3235MODx的设计哲学在嵌入式Wi-Fi系统设计中,尤其是面对CC3235MODx这类高度集成的无线模块,硬件工程师和嵌入式开发者常常面临两个核心挑战:如何在有限的物理引脚上实现尽可能丰富的功能&…

2026/7/24 14:14:56 阅读更多 →
ADS131M06 ADC转换模式与SPI接口实战解析

ADS131M06 ADC转换模式与SPI接口实战解析

1. 项目概述:深入理解ADS131M06的转换模式与接口在嵌入式系统,尤其是高精度测量领域,模数转换器(ADC)的性能直接决定了整个系统的“天花板”。无论是监测电池组的微小电压波动,还是捕捉心电信号的微弱变化&…

2026/7/24 14:14:56 阅读更多 →
前端错误监控体系搭建:从console.error到Sentry全链路追踪的实践

前端错误监控体系搭建:从console.error到Sentry全链路追踪的实践

前端错误监控体系搭建:从console.error到Sentry全链路追踪的实践 一、console.error的幻象:用户看到的错误,你一条都没收到 前端错误监控的传统方式是在关键位置放置try-catch并console.error。这种方式在用户量达到2000时暴露了三个致命缺陷…

2026/7/24 14:13:56 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻