鸿蒙开发笔记(十七): 列表 List

列表是一种复杂的容器,当列表项达到一定数量,内容超过屏幕大小时,可以自动提供滚动功能。它适合用于呈现同类数据类型或数据类型集,例如图片和文本。在列表中显示数据集合是许多应用程序中的常见要求(如通讯录、音乐列表、购物清单等)。

使用列表可以轻松高效地显示结构化、可滚动的信息。通过在List组件中按垂直或者水平方向线性排列子组件ListItemGroup或ListItem,为列表中的行或列提供单个视图,或使用ForEach迭代一组行或列,或混合任意数量的单个视图和ForEach结构,构建一个列表。List组件支持使用条件渲染、循环渲染、懒加载等渲染控制方式生成子组件。

1. 布局与约束

列表作为一种容器,会自动按其滚动方向排列子组件,向列表中添加组件或从列表中移除组件会重新排列子组件。

如下图所示,在垂直列表中,List按垂直方向自动排列ListItemGroup或ListItem。

ListItemGroup用于列表数据的分组展示,其子组件也是ListItem。ListItem表示单个列表项,可以包含单个子组件。

在这里插入图片描述

1.1 布局

List除了提供垂直和水平布局能力、超出屏幕时可以滚动的自适应延伸能力之外,还提供了自适应交叉轴方向上排列个数的布局能力。

利用垂直布局能力可以构建单列或者多列垂直滚动列表,如下图所示。

在这里插入图片描述

利用水平布局能力可以是构建单行或多行水平滚动列表,如下图所示。

在这里插入图片描述

1.2 约束

列表的主轴方向是指子组件列的排列方向,也是列表的滚动方向。垂直于主轴的轴称为交叉轴,其方向与主轴方向相互垂直。

如下图所示,垂直列表的主轴是垂直方向,交叉轴是水平方向。水平列表的主轴是水平方向,交叉轴是垂直方向。

在这里插入图片描述

  • 如果List组件主轴或交叉轴方向设置了尺寸,则其对应方向上的尺寸为设置值。

  • 如果List组件主轴方向没有设置尺寸,当List子组件主轴方向总尺寸小于List的父组件尺寸时,List主轴方向尺寸自动适应子组件的总尺寸。(wrap content)

  • 如果子组件主轴方向总尺寸超过List父组件尺寸时,List主轴方向尺寸适应List的父组件尺寸。(match parent)

  • List组件交叉轴方向在没有设置尺寸时,其尺寸默认自适应父组件尺寸。(match parent)

2. 设置主轴方向

List组件主轴默认是垂直方向,即默认情况下不需要手动设置List方向,就可以构建一个垂直滚动列表。

若是水平滚动列表场景,将List的listDirection属性设置为Axis.Horizontal即可实现。listDirection默认为Axis.Vertical,即主轴默认是垂直方向。

List() {
   
  ...
}
.listDirection(Axis.Horizontal)

3. 设置交叉轴布局

List组件的交叉轴布局可以通过lanes和alignListItem属性进行设置,lanes属性用于确定交叉轴排列的列表项数量,alignListItem用于设置子组件在交叉轴方向的对齐方式。

List组件的lanes属性通常用于在不同尺寸的设备自适应构建不同行数或列数的列表。lanes属性的取值类型是"number | LengthConstrain",即整数或者LengthConstrain类型。以垂直列表为例,如果将lanes属性设为2,表示构建的是一个两列的垂直列表。lanes的默认值为1,即默认情况下,垂直列表的列数是1。

List() {
   
  ...
}
.lanes(2)

当其取值为LengthConstrain类型时,表示会根据LengthConstrain与List组件的尺寸自适应决定行或列数。

List() {
   
  ...
}
.lanes({
    minLength: 200, maxLength: 300 })

例如,假设在垂直列表中设置了lanes的值为{ minLength: 200, maxLength: 300 }。此时,

  • 当List组件宽度为300vp时,由于minLength为200vp,此时列表为一列。
  • 当List组件宽度变化至400vp时,符合两倍的minLength,则此时列表自适应为两列。

同样以垂直列表为例,当alignListItem属性设置为ListItemAlign.Center表示列表项在水平方向上居中对齐。alignListItem的默认值是ListItemAlign.Start,即列表项在列表交叉轴方向上默认按首部对齐。

List() {
   
  ...
}
.alignListItem(ListItemAlign.Center)

4. 在列表中显示数据

列表视图垂直或水平显示项目集合,在行或列超出屏幕时提供滚动功能,使其适合显示大型数据集合。在最简单的列表形式中,List静态地创建其列表项ListItem的内容。

由于在ListItem中只能有一个根节点组件,不支持以平铺形式使用多个组件。因此,若列表项是由多个组件元素组成的,则需要将这多个元素组合到一个容器组件内或组成一个自定义组件。

通常更常见的是,应用通过数据集合动态地创建列表。使用循环渲染可从数据源中迭代获取数据,并在每次迭代过程中创建相应的组件,降低代码复杂度。

ArkTS通过ForEach提供了组件的循环渲染能力。以简单形式的联系人列表为例,将联系人名称和头像数据以Contact类结构存储到contacts数组,使用ForEach中嵌套ListItem的形式来代替多个平铺的、内容相似的ListItem,从而减少重复代码。

import util from '@ohos.util';

class Contact {
   
  key: string = util.generateRandomUUID(true);
  name: string;
  icon: Resource;

  constructor(name: string, icon: Resource) {
   
    this.name = name;
    this.icon = icon;
  }
}

@Entry
@Component
struct SimpleContacts {
   
  private contacts = [
    new Contact('小明', $r("app.media.iconA")),
    new Contact('小红', $r("app.media.iconB")),
    ...
  ]

  build() {
   
    List() {
   
      ForEach(this.contacts, (item: Contact) => {
   
        ListItem() {
   
          Row() {
   
            Image(item.icon)
              .width(40)
              .height(40)
              .margin(10)
            Text(item.name).fontSize(20)
          }
          .width('100%')
          .justifyContent(FlexAlign.Start)
        }
      }, item => item.key)
    }
    .width('100%')
  }
}

在List组件中,ForEach除了可以用来循环渲染ListItem,也可以用来循环渲染ListItemGroup。ListItemGroup的循环渲染详细使用请参见支持分组列表。

5. 自定义列表样式

5.1 设置内容间距

在初始化列表时,如需在列表项之间添加间距,可以使用space参数。例如,在每个列表项之间沿主轴方向添加10vp的间距:

List({
     space: 10 }) {
   
  ...
}

5.2 添加分隔线

分隔线用来将界面元素隔开,使单个元素更加容易识别。

List提供了divider属性用于给列表项之间添加分隔线。在设置divider属性时,可以通过strokeWidth和color属性设置分隔线的粗细和颜色。

startMargin和endMargin属性分别用于设置分隔线距离列表侧边起始端的距离和距离列表侧边结束端的距离。

List
创建一个鸿蒙开发的毕业项目可以分为以下几个步骤: 1. **选择主题**: 你可以考虑新闻类应用(如引用[1]所示)或读书类应用(如引用[2]描述)。后者可能更适合做为毕业项目,因为它涉及的内容更为丰富。 2. **了解环境**: 学习并配置HarmonyOS开发工具和环境,包括SDK、IDE(如DevEco Studio)以及相关的API文档。 3. **需求分析**: 根据选题确定具体功能,比如新闻类应用可能需要展示新闻列表、详情页、搜索等;读书类应用则可能包括书架、图书详细信息、阅读进度等功能。 4. **设计UI**: 使用HarmonyOS的设计规范,创建吸引人的用户界面布局和交互设计。 5. **编写代码**: 基于所选主题,利用代码注释(如引用[1][2]中的说明)开始编码。对于新手,可以从基础模块如登录注册、数据请求开始,逐步实现核心功能。 ```java // 示例:获取新闻列表 List<NewsItem> newsList = getNewsFromServer(); NewsAdapter adapter = new NewsAdapter(newsList); newsListView.setAdapter(adapter); // 假设newsListView是新闻列表视图 ``` 6. **测试与调试**: 完成初步开发后,务必对各个功能进行充分测试,确保性能稳定,用户体验良好。 7. **部署与提交**: 按照HarmonyOS的发布流程,打包应用程序并提交给审核,准备发布到模拟器或真机上供用户试用。 8. **撰写报告**: 整理项目过程中的学习笔记、遇到的问题解决方案以及最终产品的技术细节,作为毕业设计报告的一部分。 记得在整个过程中,如果遇到困难,可以查阅相关文档,向导师提问,或者参考已有的示例代码来解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值