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%')

这是我的写法,请问怎样才能达到像设置里面的列表一样的效果?

![](https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/377/190/165/D7EBFEEF73767D6A6D142D0B8532F2A1:443E43B7E34231502478CAE9A00A5BA4AFB95B071C89F88B6CCAB17362BCBDD2.20260601143006.86669978606193209265836823899088:50001231000000:2800:5B42CBB15B94FC5854990E1B8AEEFDF4B8DC9DC0626E1C9B5E96AD4E5D4EB4BC.jpg)
![](https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/377/190/165/D7EBFEEF73767D6A6D142D0B8532F2A1:443E43B7E34231502478CAE9A00A5BA4AFB95B071C89F88B6CCAB17362BCBDD2.20260601143006.46539891824479338617119823632050:50001231000000:2800:B0999D49CD4A7C2D8FD3C3D1009DF22D6D9D0A8202AA6EB558B9C85FC92A062A.jpg)

更多关于HarmonyOS鸿蒙Next中请问这个列表应该用什么组件?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

20 回复

推荐你学习一下官方教学Demo:https://gitcode.com/HarmonyOS_Samples/component-collection

集合了ArkUI组件库中组件类、通用类、动画类和全局类模块,帮助开发者掌握多种ArkUI组件和事件的使用方法。

cke_546.png

更多关于HarmonyOS鸿蒙Next中请问这个列表应该用什么组件?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这种设置项列表优先用 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 系统设置页面的视觉和交互风格。

你多看基础视频吧,我看你这回复,你很多属性都不会用,

List()<br>&nbsp;&nbsp;&nbsp;&nbsp;ListItemGroup({&nbsp;style:&nbsp;ListItemGroupStyle.CARD&nbsp;})<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ForEach()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HdsListItem(),

圆角不对,

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)
  }
}

cke_652.png

在HarmonyOS Next中,列表推荐使用ArkTS的 List 组件。List支持懒加载、分组、滑动删除等能力,配合 ListItemForEachLazyForEach 实现数据渲染。若需网格布局,可使用 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 样式,即可自动获得类似系统设置页的分组圆角卡片、分割线和间距效果。

回到顶部