141.[HarmonyOS NEXT 实战案例九:List系列] 分组列表组件实战:打造分类设置菜单 基础篇
2025-06-30 22:17:15
103次阅读
0个评论
[HarmonyOS NEXT 实战案例九:List系列] 分组列表组件实战:打造分类设置菜单 基础篇
项目已开源,开源地址: https://gitcode.com/nutpi/HarmonyosNextCaseStudyTutorial , 欢迎fork & star
效果演示
一、ListItemGroup组件基础介绍
在HarmonyOS NEXT应用开发中,ListItemGroup组件是List组件的扩展,用于创建具有分组功能的列表。它能够将列表项按照逻辑关系进行分组,每个分组可以有自己的头部和尾部,使界面结构更加清晰,提升用户体验。
1.1 ListItemGroup组件特点
特点 | 说明 |
---|---|
分组显示 | 将相关的列表项组织在一起,形成逻辑分组 |
自定义头部 | 支持为每个分组定制头部内容,如分组标题 |
自定义尾部 | 支持为每个分组定制尾部内容,如分组总结或分隔区域 |
折叠展开 | 支持分组的折叠和展开功能(需要自行实现) |
嵌套使用 | 可以在List组件中嵌套使用,创建多级分组 |
1.2 ListItemGroup组件常用属性
属性 | 类型 | 说明 |
---|---|---|
header | @Builder | 分组的头部构建器 |
footer | @Builder | 分组的尾部构建器 |
space | number | 分组内列表项之间的间距 |
divider | { strokeWidth?: number, color?: ResourceColor, startMargin?: number, endMargin?: number } |
分组内列表项之间的分割线样式 |
二、分组设置菜单实战案例
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组件创建一个分组的设置菜单。我们从数据模型定义、分组头部和尾部实现、页面结构设计到分组列表实现,全面讲解了分组列表的实现过程。
00
- 0回答
- 4粉丝
- 0关注
相关话题
- 142.[HarmonyOS NEXT 实战案例九:List系列] 分组列表组件实战:打造分类设置菜单 进阶篇
- [HarmonyOS NEXT 实战案例六:List系列] 垂直列表组件实战:打造高效联系人列表 基础篇
- 137.[HarmonyOS NEXT 实战案例七:List系列] 多列列表组件实战:打造精美应用推荐页 基础篇
- 151.[HarmonyOS NEXT 实战案例十二:List系列] 卡片样式列表组件实战:打造精美电商应用 基础篇
- 139.[HarmonyOS NEXT 实战案例八:List系列] 滑动操作列表组件实战:打造高效待办事项应用 基础篇
- 143.[HarmonyOS NEXT 实战案例十:List系列] 字母索引列表组件实战:打造高效联系人应用 基础篇
- 135.[HarmonyOS NEXT 实战案例七:List系列] 水平列表组件实战:打造精美图片库 基础篇
- 147.[HarmonyOS NEXT 实战案例八 :List系列] 粘性头部列表基础篇
- 155.[HarmonyOS NEXT 实战案例十二 :List系列] 聊天消息列表 - 基础篇
- 134.[HarmonyOS NEXT 实战案例六:List系列] 垂直列表组件实战:打造高效联系人列表 进阶篇
- 145.[HarmonyOS NEXT 实战案例七 :List系列] 可选择列表基础篇
- 149.[HarmonyOS NEXT 实战案例十一:List系列] 下拉刷新和上拉加载更多列表组件实战:打造高效新闻应用 基础篇
- 153.[HarmonyOS NEXT 实战案例十一 :List系列] 自定义内容列表 - 基础篇
- 138.[HarmonyOS NEXT 实战案例七:List系列] 多列列表组件实战:打造精美应用推荐页 进阶篇
- 152.[HarmonyOS NEXT 实战案例十二:List系列] 卡片样式列表组件实战:打造精美电商应用 进阶篇