HarmonyOS鸿蒙Next中请问这个列表应该用什么组件?
HarmonyOS鸿蒙Next中请问这个列表应该用什么组件?
List() {
ForEach(
this.settings, // 数据源
(item: string, index: number) => { // 循环生成每个列表项
HdsListItem({
hdsListItemCard: {
textItem: {
primaryText: {
text: item
}
}
}
})
},
(item: string, index: number) => index.toString() // 唯一键(推荐)
)
}
.width('100%')
这是我的写法,请问怎样才能达到像设置里面的列表一样的效果?


更多关于HarmonyOS鸿蒙Next中请问这个列表应该用什么组件?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
推荐你学习一下官方教学Demo:https://gitcode.com/HarmonyOS_Samples/component-collection
集合了ArkUI组件库中组件类、通用类、动画类和全局类模块,帮助开发者掌握多种ArkUI组件和事件的使用方法。

更多关于HarmonyOS鸿蒙Next中请问这个列表应该用什么组件?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
你去看这个,了解一下“ListItemGroup”:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-listitemgroup,
这种设置项列表优先用 List 承载数据,再在 ListItem 里放 HdsListItem 或你自己的行组件。List 负责滚动、复用和边界行为,HdsListItem 负责系统风格的标题、说明、图标、开关等内容样式。
如果数据量很少,Column + ForEach 也能显示,但后续增加分组、滚动、懒加载、分割线、吸顶标题时会比较吃力。设置页常见结构可以是:外层 List,分组用 ListItemGroup 或分组标题,组内每一行是 HdsListItem。
如果是两列/多列入口卡片,再考虑 Grid;纯纵向设置项不要为了排版去手写一堆固定高度 Row。
期待HarmonyOS能在未来推出更多针对特定场景的优化功能。
ListItemGroup 这个组件不就可以吗 ,看下文档哈 ,这个还是比较基础的, 不给代码了
有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html
建议用 List,不是 Grid/WaterFlow。截图是纵向分组设置页:List 负责整页滚动,ListItemGroup 做白色圆角块,行抽成 SettingRow;少量固定项才用 Scroll+Column。
骨架:
List({ space:16 }) {
ListItemGroup() {
ListItem(){ SettingRow({ title:'护眼模式', value:'智能开启' }) }
ListItem(){ SettingRow({ title:'电子书模式', value:'已关闭' }) }
}.backgroundColor(Color.White).borderRadius(24).clip(true)
}.padding(16).scrollBar(BarState.Off)
SettingRow 用 Row + Blank + Text/Toggle/箭头。参考:官方《创建列表(List)》《Toggle》。
你现在这种写法,本质上只是把 HdsListItem 一个个垂直堆起来,所以看起来更像:
- 独立卡片
- 每项之间有较大间距
- 没有系统设置那种「分组列表」效果
而系统设置页面实际上是 Group List(分组列表) 设计模式,不是普通 List + Card。
推荐方案
鸿蒙设置页一般是:
Column
├── Group Card
│ ├── Item1
│ ├── Divider
│ ├── Item2
│ ├── Divider
│ └── Item3
│
├── Group Card
│ ├── Item4
│ └── Item5
│
└── Group Card
└── Item6
类似这样:
Column({ space: 12 }) {
// 第一组
Column() {
ForEach(this.group1, (item: SettingItem, index) => {
Row() {
Text(item.title)
.fontSize(18)
Blank()
if (item.arrow) {
Image($r('app.media.ic_arrow_right'))
.width(20)
}
}
.height(56)
.padding({ left: 16, right: 16 })
if (index < this.group1.length - 1) {
Divider()
.margin({ left: 16 })
}
})
}
.backgroundColor(Color.White)
.borderRadius(24)
// 第二组
Column() {
...
}
.backgroundColor(Color.White)
.borderRadius(24)
}
.padding(16)
.backgroundColor('#F5F5F5')
效果就会非常接近系统设置。
如果你使用 HDS
其实不要直接:
List() {
ForEach(...)
}
而应该:
Column({ space: 12 }) {
HdsCard() {
Column() {
ForEach(...)
}
}
HdsCard() {
Column() {
ForEach(...)
}
}
}
即:
Card 包 Group
Group 里面放多个 HdsListItem
而不是:
List 里面放多个 Card
这两个视觉效果差别很大。
你的截图对应的结构
像「色彩调节与色温」「通知管理」「隐私设置」应该属于同一个 Group:
Column() {
HdsListItem(...)
Divider()
HdsListItem(...)
Divider()
HdsListItem(...)
}
.backgroundColor(Color.White)
.borderRadius(24)
.margin({ top: 12 })
这样就会变成:
┌─────────────────┐
│ 色彩调节与色温 >│
├─────────────────┤
│ 通知管理 >│
├─────────────────┤
│ 隐私设置 >│
└─────────────────┘
跟系统设置页基本一致。
另外一个细节
你截图里的按钮:
◀ 返回
[单打][双打]
下面那一大块内容其实不需要 List。
因为内容很少,推荐:
Scroll()
{
Column()
{
...
}
}
而不是:
List()
鸿蒙设置页大量使用的是:
Scroll
+ Column
+ Card
+ ListItem样式
而不是 Android 传统的 RecyclerView/ListView 思路。
对于你这个页面,我会直接推荐:
Scroll
└── Column
├── SegmentedButton
├── 输入框A
├── 输入框B
├── 设置分组1
├── 设置分组2
└── 底部开始按钮
这样最接近 HarmonyOS 系统设置页面的视觉和交互风格。
你多看基础视频吧,我看你这回复,你很多属性都不会用,
奇怪,
listitemgroup和系统的不一样,圆角有区别,而且字体不对,现在系统应用用的应该是hdslistitem,但是不知道父容器应该用哪个,
我这个提问就是想问一下,那个属性是多少,特别是圆角是多大,默认的圆角和我想要的效果不一样。我不知道系统应用所用的圆角是多少…,
@Entry
@Component
struct Index {
build() {
Column() {
Text('字体大小和界面缩放')
.height(48)
.width('100%')
.backgroundColor(Color.White)
.padding(10)
.backgroundColor(Color.White)
.borderRadius(15)
List() {
ForEach(['色彩调节与色温', '通知管理', '隐私设置'], (item: string, index: number) => {
ListItem() {
Column() {
Text(item)
.height(48)
.width('100%')
if (index < 2) {
Divider().width('100%').height(2).color(Color.Gray)
}
}
}
}, (item: string, index: number) => index.toString())
}
.width('100%')
.margin(10)
.padding({left:10,right:10})
.backgroundColor(Color.White)
.borderRadius(15)
}
.height('100%')
.width('100%')
.padding(10)
.backgroundColor(Color.Gray)
}
}

不对,
在HarmonyOS Next中,列表推荐使用ArkTS的 List 组件。List支持懒加载、分组、滑动删除等能力,配合 ListItem、ForEach 或 LazyForEach 实现数据渲染。若需网格布局,可使用 Grid 组件。
要用 List 达到设置页的分组卡片效果,需要在 ListItem 外层包裹 ListItemGroup,并设置 style(ListItemGroupStyle.Card) 样式。
核心写法如下:
// 假设数据源按分组组织
@State groupData: string[][] = [['项目1', '项目2'], ['项目3']]
List() {
ForEach(this.groupData, (group: string[], groupIndex: number) => {
ListItemGroup({ style: ListItemGroupStyle.Card }) { // Card样式实现圆角卡片分组
ForEach(group, (item: string, itemIndex: number) => {
ListItem() {
HdsListItem({
hdsListItemCard: {
textItem: { primaryText: { text: item } }
}
})
}
}, (item: string, index: number) => `${groupIndex}_${index}`)
}
})
}
关键在于用 ListItemGroup 包裹一组 ListItem 并指定 Card 样式,即可自动获得类似系统设置页的分组圆角卡片、分割线和间距效果。


