回复
     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组件创建一个分组的设置菜单。我们从数据模型定义、分组头部和尾部实现、页面结构设计到分组列表实现,全面讲解了分组列表的实现过程。
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
     
        赞
        
 
        收藏 
      
 回复
  相关推荐
 



















