回复
141.[HarmonyOS NEXT 实战案例九:List系列] 分组列表组件实战:打造分类设置菜单 基础篇 原创
全栈若城
发布于 2025-6-30 15:40
浏览
0收藏
[HarmonyOS NEXT 实战案例九:List系列] 分组列表组件实战:打造分类设置菜单 基础篇
项目已开源,开源地址: https://gitcode.com/nutpi/HarmonyosNextCaseStudyTutorial , 欢迎fork & star
效果演示
![141.[HarmonyOS NEXT 实战案例九:List系列] 分组列表组件实战:打造分类设置菜单 基础篇-鸿蒙开发者社区 141.[HarmonyOS NEXT 实战案例九:List系列] 分组列表组件实战:打造分类设置菜单 基础篇-鸿蒙开发者社区](https://dl-harmonyos.51cto.com/images/202506/78245ea62bd0d7f5b92444737fe828fd79e8fd.png?x-oss-process=image/resize,w_373,h_597)
一、ListItemGroup组件基础介绍
在HarmonyOS NEXT应用开发中,ListItemGroup组件是List组件的扩展,用于创建具有分组功能的列表。它能够将列表项按照逻辑关系进行分组,每个分组可以有自己的头部和尾部,使界面结构更加清晰,提升用户体验。
1.1 ListItemGroup组件特点
| 特点 | 说明 |
|---|---|
| 分组显示 | 将相关的列表项组织在一起,形成逻辑分组 |
| 自定义头部 | 支持为每个分组定制头部内容,如分组标题 |
| 自定义尾部 | 支持为每个分组定制尾部内容,如分组总结或分隔区域 |
| 折叠展开 | 支持分组的折叠和展开功能(需要自行实现) |
| 嵌套使用 | 可以在List组件中嵌套使用,创建多级分组 |
1.2 ListItemGroup组件常用属性
| 属性 | 类型 | 说明 |
|---|---|---|
| header | @Builder | 分组的头部构建器 |
| footer | @Builder | 分组的尾部构建器 |
| space | number | 分组内列表项之间的间距 |
| divider | {<br>strokeWidth?: number,<br>color?: ResourceColor,<br>startMargin?: number,<br>endMargin?: number<br>} | 分组内列表项之间的分割线样式 |
二、分组设置菜单实战案例
2.1 需求分析
我们将实现一个分组设置菜单,包含以下功能:
- 将设置项按照功能分为多个组:通用、隐私与安全、关于
- 每个分组有明显的标题
- 设置项包含图标、标题和右侧内容(文本或开关)
- 分组之间有明显的视觉分隔
2.2 数据模型定义
首先,我们定义设置项和分组的数据模型:
interface ItemsType {
title: string,
icon: Resource,
rightText?: string,
toggle?: boolean
}
interface SettingType{
groupName: string,
items: ItemsType[]
}
然后,准备设置项数据:
private settingsData: SettingType[] = [
{
groupName: '通用',
items: [
{ title: '语言', icon: $r('app.media.01'), rightText: '简体中文' },
{ title: '字体大小', icon: $r('app.media.02'), rightText: '标准' },
{ title: '存储空间', icon: $r('app.media.03'), rightText: '1.2GB可用' },
{ title: '清除缓存', icon: $r('app.media.04') }
]
},
{
groupName: '隐私与安全',
items: [
{ title: '锁屏密码', icon: $r('app.media.note_icon'), toggle: true },
{ title: '指纹解锁', icon: $r('app.media.music_icon'), toggle: true },
{ title: '隐私政策', icon: $r('app.media.game_icon') },
{ title: '权限管理', icon: $r('app.media.dcc_health_icon') }
]
},
{
groupName: '关于',
items: [
{ title: '版本信息', icon: $r('app.media.img'), rightText: 'v1.0.0' },
{ title: '检查更新', icon: $r('app.media.dcc_health_icon') },
{ title: '用户协议', icon: $r('app.media.game_icon') },
{ title: '帮助与反馈', icon: $r('app.media.map_icon2') }
]
}
]
2.3 分组头部和尾部实现
接下来,我们实现分组的头部和尾部:
// 构建分组头部
@Builder
GroupHeader(groupName: string) {
Text(groupName)
.fontSize(16)
.fontWeight(FontWeight.Medium)
.backgroundColor('#F1F3F5')
.width('100%')
.padding({ left: 16, top: 12, bottom: 12 })
}
// 构建分组底部
@Builder
GroupFooter() {
Row()
.height(16)
.width('100%')
.backgroundColor('#F1F3F5')
}
分组头部显示分组名称,底部则是一个高度为16的空白区域,用于分隔不同的分组。
2.4 页面结构设计
整个页面采用垂直布局,包含标题栏和设置列表两部分:
build() {
Column() {
// 标题栏
Row() {
Text('设置')
.fontSize(24)
.fontWeight(FontWeight.Bold)
}
.width('100%')
.height(56)
.padding({ left: 16 })
.backgroundColor('#F1F3F5')
// 设置列表
List() {
// 列表内容
}
.width('100%')
.layoutWeight(1)
.divider({
strokeWidth: 1,
color: '#E5E5E5',
startMargin: 56,
endMargin: 16
})
}
.width('100%')
.height('100%')
.backgroundColor('#FFFFFF')
}
2.5 分组列表实现
最后,我们实现分组列表的内容:
List() {
ForEach(this.settingsData, (group:SettingType) => {
ListItemGroup({
header: this.GroupHeader(group.groupName),
footer: this.GroupFooter()
}) {
ForEach(group.items, (item:ItemsType) => {
ListItem() {
Row() {
// 图标
Image(item.icon)
.width(24)
.height(24)
.margin({ right: 16 })
// 标题
Text(item.title)
.fontSize(16)
.layoutWeight(1)
// 右侧文本或开关
if (item.rightText) {
Text(item.rightText)
.fontSize(14)
.fontColor('#666666')
.margin({ right: 8 })
}
if (item.toggle !== undefined) {
Toggle({ type: ToggleType.Switch, isOn: item.toggle })
} else {
Image($r('app.media.arrowright'))
.width(16)
.height(16)
}
}
.width('100%')
.padding({ left: 16, right: 16, top: 12, bottom: 12 })
}
.height(56)
})
}
})
}
在这段代码中:
- 使用ForEach遍历settingsData数组,为每个分组创建一个ListItemGroup
- 为每个ListItemGroup设置header和footer
- 在ListItemGroup内部,使用ForEach遍历分组内的items数组,为每个设置项创建一个ListItem
- 在ListItem内部,使用Row布局包含图标、标题和右侧内容(文本、开关或箭头图标)
三、完整代码解析
@Component
export struct BasicListItemGroup {
// 设置项数据
private settingsData: SettingType[] = [
// 数据定义(同上)
]
// 构建分组头部
@Builder
GroupHeader(groupName: string) {
// 头部实现(同上)
}
// 构建分组底部
@Builder
GroupFooter() {
// 底部实现(同上)
}
build() {
Column() {
// 标题栏
Row() {
// 标题栏实现(同上)
}
// 设置列表
List() {
// 列表实现(同上)
}
.width('100%')
.layoutWeight(1)
.divider({
strokeWidth: 1,
color: '#E5E5E5',
startMargin: 56,
endMargin: 16
})
}
.width('100%')
.height('100%')
.backgroundColor('#FFFFFF')
}
}
3.1 代码结构分析
| 部分 | 说明 |
|---|---|
| 数据模型 | 定义ItemsType和SettingType接口,描述设置项和分组的数据结构 |
| 数据准备 | 创建settingsData数组,包含三个分组的设置项数据 |
| 构建器 | 定义GroupHeader和GroupFooter两个构建器,用于创建分组的头部和尾部 |
| 页面结构 | 使用Column作为根容器,包含标题栏和设置列表 |
| 分组列表 | 使用List和ListItemGroup创建分组列表,每个分组包含多个ListItem |
3.2 样式设置分析
在这个案例中,我们使用了多种样式设置来美化界面:
-
尺寸设置:
- 使用width(‘100%’)和height(‘100%’)使组件占满父容器
- 使用layoutWeight(1)使List组件占据剩余空间
- 设置具体的像素值,如height(56)、width(24)等
-
边距和填充:
- 使用padding设置内边距
- 使用margin设置外边距
-
颜色和背景:
- 设置背景颜色backgroundColor
- 设置文本颜色fontColor
-
文本样式:
- 设置字体大小fontSize
- 设置字体粗细fontWeight
-
分割线:
- 使用divider设置列表项之间的分割线
- 设置分割线的颜色、粗细和边距
总结
在本篇教程中,我们学习了如何使用HarmonyOS NEXT的ListItemGroup组件创建一个分组的设置菜单。我们从数据模型定义、分组头部和尾部实现、页面结构设计到分组列表实现,全面讲解了分组列表的实现过程。
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
赞
收藏
回复
相关推荐




















