鸿蒙应用开发从入门到实战(十七):ArkUI组件List&列表布局
大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业级项目实战等原创内容、欢迎关注!
ArkUI提供了丰富的系统组件,用于制作鸿蒙原生应用APP的UI,本文通过简单案例演示如何使用List组件实现列表布局。
一、List布局优化商品列表
上一小节里的商品列表,随着数据增多,当超出界面后,无法滚动查看。List列表布局就可以解决这个问题。
List列表是一种复杂容器,具备下列特点:
列表项ListItem数量过多超出屏幕后,会自动提供滚动功能
列表项ListItem既可以纵向排列,也可以横向排列
再pages/layout下新建list目录,新建ProductList.ets文件,将上一小节里的代码文件ProductListPage.ets文件里的内容拷贝过来进行修改。
将ForEach部分的内容放到List组件里即可
class Item1 { // 复制过来后,即使再不同的文件中,也会提示同名
name: string //小写
image: ResourceStr
price: number
discount: number
constructor(name: string, image: ResourceStr, price: number, discount: number = 0) {
this.name = name
this.image = image
this.price = price
this.discount = discount
}
}
@Entry
@Component
struct ProductList {
// 商品数据
private items: Array<Item1> = [
new Item1('华为Mate60', $r('app.media.mate60'), 6999, 500),
new Item1('MateBookProX', $r('app.media.mate60'), 13999),
new Item1('WatchGT4', $r('app.media.mate60'), 1438),
new Item1('FreeBuds Pro3', $r('app.media.mate60'), 1499),
new Item1('FreeBuds Pro3', $r('app.media.mate60'), 199),
new Item1('Mate X5', $r('app.media.mate60'), 12999)
]
build() {
Column({ space: 8 }) {
// 标题
Row() {
Text('商品列表')
.fontSize(30)
.fontWeight(FontWeight.Bold)
}
.width('100%')
// .height(30) //控制高度
.margin({ bottom: 20 })
// 商品列表
List({ space: 8 }) {
ForEach(
this.items,
(item: Item1) => {
ListItem() { //ListItem子元素必须用根元素包裹
Row({ space: 10 }) {
Image(item.image)
.width(100)
Column({ space: 4 }) {
if (item.discount) {
Text(item.name)
.fontSize(20)
.fontWeight(FontWeight.Bold)
Text('原价:¥' + item.price)
.fontColor('#CCC')
.fontSize(14)
.decoration({ type: TextDecorationType.LineThrough })
Text('折扣价:¥' + (item.price - item.discount))
.fontColor('#F36')
.fontSize(18)
Text('补贴:¥' + item.discount)
.fontColor('#F36')
.fontSize(18)
} else {
Text(item.name)
.fontSize(20)
.fontWeight(FontWeight.Bold)
Text('¥' + item.price)
.fontColor('#F36')
.fontSize(18)
}
}
.height('100%')
.alignItems(HorizontalAlign.Start)
}
.width('100%')
.backgroundColor('#FFF')
.borderRadius(20)
.height(120)
.padding(10)
}
}
)
}
.width('100%')
// .layoutWeight(1)
}
.width('100%')
.height('100%')
.backgroundColor('#EFEFEF')
.padding(20)
}
}
这样,就可以通过拖动呈现超过屏幕区的内容。
二、列表布局详解
2.1 概述
List是一个功能强大的容器组件,使用List可以轻松高效地显示结构化、可滚动的列表信息,例如通讯录、新闻列表等等。

List容器的子组件为ListItem或者ListItemGroup,其中,ListItem表示单个列表项,ListItemGroup用于列表数据的分组展示,其子组件也是ListItem,具体用法如下
List() {
// 列表项
ListItem() {......}
ListItem() {......}
ListItem() {......}
ListItem() {......}
ListItem() {......}
ListItem() {......}
ListItem() {......}
ListItem() {......}
ListItem() {......}
ListItem() {......}
ListItem() {......}
ListItem() {......}
}
效果

List() {
// 列表组
ListItemGroup(){
//列表项
ListItem(){......}
ListItem(){......}
}
ListItemGroup(){
ListItem(){......}
ListItem(){......}
}
ListItemGroup(){
ListItem(){......}
ListItem(){......}
}
}
效果

2.2 参数
List 组件的参数定义如下,下面逐一介绍每个参数
List(value?:{space?: number | string, scroller?: Scroller})
2.2.1 列表项间距
space参数用于设置列表项的间距,如下图所示

2.2.2 列表滚动控制器
scroller参数用于绑定列表滚动控制器(Scroller),Scroller可以控制列表的滚动,例如令列表返回顶部

示例:
拷贝icon-top.png到resources/base/media目录
pages /layout/list新建ScrollerPage.ets
@Entry
@Component
struct ScrollerPage {
data: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
scroller: Scroller = new Scroller();
build() {
Stack({ alignContent: Alignment.BottomEnd }) {
List({ space: 20, scroller: this.scroller }) {
ForEach(this.data, (item) => {
ListItem() {
Text(item.toString())
.itemTextStyle()
}
})
}.listStyle()
.height('100%')
.width('100%')
Button({ type: ButtonType.Circle }) {
Image($r('app.media.icon_top'))
.width(40)
.height(40)
}
.width(60)
.height(60)
.backgroundColor(Color.Orange)
.offset({ x: -20, y: -100 })
.onClick(() => {
this.scroller.scrollToIndex(0)
})
}
}
}
@Extend(Text) function itemTextStyle() {
.height(80)
.width('100%')
.textAlign(TextAlign.Center)
.fontColor(Color.White)
.fontSize(40)
.fontWeight(FontWeight.Bold)
.backgroundColor('#008a00')
.borderRadius(10)
}
@Extend(List) function listStyle() {
.backgroundColor(Color.White)
.padding(20)
}
2.3 常用属性
2.3.1 主轴方向
使用listDirection()方法可以设置列表的主轴方向(即列表的排列和滚动方向),其参数类型为枚举类型Axis,可选的枚举值如下

2.3.2 交叉轴对齐方式
使用alignListItem()方法可以设置子组件在交叉轴方向的对齐方式,其参数类型为枚举类型ListItemAlign,可选的枚举值有

示例代码
pages /layout/list新建AlignPage.ets
@Entry
@Component
struct AlignPage {
data: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
build() {
List({ space: 20 }) {
ForEach(this.data, (item) => {
ListItem() {
Text(item.toString())
.height(80)
.width(320)
.itemTextStyle1()
}
})
}.listStyle1()
.height('100%')
.width('100%')
.alignListItem(ListItemAlign.Center)
}
}
@Extend(Text) function itemTextStyle1() { //同一个命名空间下不能重复,否则会报错
.textAlign(TextAlign.Center)
.fontColor(Color.White)
.fontSize(40)
.fontWeight(FontWeight.Bold)
.backgroundColor('#008a00')
.borderRadius(10)
}
@Extend(List) function listStyle1() {
.backgroundColor(Color.White)
.padding({ top: 20, bottom: 20 })
}
2.3.3 元素分割线
使用divider()属性可设置列表元素分割线样式,该方法的参数定义如下
divider(value: {strokeWidth: Length, color?: ResourceColor, startMargin?: Length, endMargin?: Length})
各参数的含义如下
| 参数 | 含义 |
|---|---|
strokeWidth |
分割线线宽 |
color |
分割线颜色 |
startMargin |
分割线起始端到列表侧边距离(如下图所示) |
endMargin |
分割线末端到列表侧边距离(如下图所示) |

示例代码
pages /layout/list新建DividerPage.ets
@Entry
@Component
struct DividerPage {
data: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
build() {
List({ space: 20 }) {
ForEach(this.data, (item) => {
ListItem() {
Text(item.toString())
.height(80)
.width(320)
.itemTextStyle2()
}
})
}
.listStyle2()
.height('100%')
.width('100%')
.alignListItem(ListItemAlign.Center)
.divider({
strokeWidth: 1,
color: Color.Orange,
startMargin: 30,
endMargin: 30
})
}
}
@Extend(Text) function itemTextStyle2() {
.textAlign(TextAlign.Center)
.fontColor(Color.White)
.fontSize(40)
.fontWeight(FontWeight.Bold)
.backgroundColor('#008a00')
.borderRadius(10)
}
@Extend(List) function listStyle2() {
.backgroundColor(Color.White)
.padding({ top: 20, bottom: 20 })
}
2.3.4 滚动条样式
使用scrollBar()方法可以设置滚动条状态,该方法的参数类型为枚举类型BarState,可选的枚举值如下
| 名称 | 描述 |
|---|---|
BarState.Off |
不显示 |
BarState.On |
常驻显示 |
BarState.Auto |
按需显示(触摸时显示,2s后消失) |
示例代码
pages /layout/list新建ScrollBarPage.ets
@Entry
@Component
struct ScrollBarPage {
data: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
build() {
List({ space: 20 }) {
ForEach(this.data, (item) => {
ListItem() {
Text(item.toString())
.height(80)
.width(320)
.itemTextStyle3()
}
})
}.listStyle3()
.height('100%')
.width('100%')
.alignListItem(ListItemAlign.Center)
.scrollBar(BarState.Auto)
}
}
@Extend(Text) function itemTextStyle3() {
.textAlign(TextAlign.Center)
.fontColor(Color.White)
.fontSize(40)
.fontWeight(FontWeight.Bold)
.backgroundColor('#008a00')
.borderRadius(10)
}
@Extend(List) function listStyle3() {
.backgroundColor(Color.White)
.padding({ top: 20, bottom: 20 })
}
《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业级项目实战等原创内容,防止迷路,欢迎关注!
鸿蒙应用开发从入门到实战(十七):ArkUI组件List&列表布局的更多相关文章
- 《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf
<ASP.NET Core跨平台开发从入门到实战>样章节 Web API自定义格式化protobuf. 样章 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于 ...
- Python项目案例开发从入门到实战 - 书籍信息
Python项目案例开发从入门到实战 - 爬虫.游戏和机器学习(微课版) 作者:郑秋生 夏敏捷 清华大学出版社 ISBN:978-7-302-45970-5
- 5-Python3从入门到实战—基础之数据类型(列表-List)
Python从入门到实战系列--目录 列表定义 list:列表(list)是Python内置的一种数据类型,list是一种有序的集合,索引从0开始,可以进行截取.组合等: //创建列表 list1 = ...
- asp.net core跨平台开发从入门到实战文摘
第1章 .NET Core 第2章 dotnet命令 第3章 VS Code安装及介绍 第4章 VS2015开发.NET Core 第5章 ASP.NET Core 第6章 EF Core 第7章 A ...
- Python项目案例开发从入门到实战-1.4Python图形界面设计
Python提供了多个图形开发界面的库,常用的Python GUI库如下. -Tkinter:Python内置模块 -wxPython -Jython 1.4.1创建Windows窗口 import ...
- Python项目案例开发从入门到实战-1.5Python文件的使用
Python对文件的操作通常按照三个步骤进行: un 使用open()函数打开(或建立)文件,并返回一个file对象. deux 使用file对象的读写方法对文件进行读写操作. trois 使用fil ...
- Python项目案例开发从入门到实战-1.3 Python面向对象设计
1.3.1定义于使用类 类的定义 class class_name: attribute function 例: class Person: age=18 def say(): print(" ...
- Python项目案例开发从入门到实战-1.2 Python语法基础
书籍信息 1.2 Python语法基础 1.2.1 Python数据类型 数值类型 整型(int):浮点型(float):复数(complex),以j或J结尾,如2+3j 字符串 布尔类型 空值,用N ...
- 小程序开发全栈1.2/3/4组件、flex布局、样式
1.2 组件 1.2.1 text组件 编写文本信息,类似于HTTP中的span 1.2.2 view组件 容器,类似于HTTP中的div 1.2.3 image组件 图片显示组件 1.3 页面fle ...
- Transform组件C#游戏开发快速入门
Transform组件C#游戏开发快速入门大学霸 组件(Component)可以看作是一类属性的总称.而属性是指游戏对象上一切可设置.调节的选项,如图2-8所示.本文选自C#游戏开发快速入门大学霸 ...
随机推荐
- js\jquery下载本地txt文档
有一个功能,是需要将相对位置下txt文件读取,并下载:相对路径:"../../assets/download/版本更新日志.txt" 利用a标签进行如下设置,结果只是预览内容,没有 ...
- Classical Management: emphasized rationality and making organizations and workers as efficient as possible
Modern approach: more humanity, human-centric, personal, intuitive, emotional, sense, social, democr ...
- Unity Editor 编辑器开发全通关
https://github.com/XINCGer/UnityToolchainsTrick https://zhuanlan.zhihu.com/p/503154643
- 在vscode里面运行c#项目并且调试
https://travis.media/how-to-run-csharp-in-vscode/ 如何在 VSCode 中运行 C# 1.安装.NET 首先,安装 .NET .你可以在这里做到这一点 ...
- Linux CentOS系统 /etc/mtab 文件详解
在Linux CentOS系统中,/etc/mtab 文件是一个动态记录当前已挂载文件系统的关键配置文件,其作用与机制如下: 1. 文件定义 内容:/etc/mtab 以文本形 ...
- C语言数据结构-链式队列
1.队列 先进先出结构
- 小程序轻松实现IM即时通讯多人聊天室
IM多人聊天室功能简介 ZIM SDK 提供多人房间聊天功能,支持用户向房间内发送文本消息或自定义消息,实现了多人在线交流.同步分享. 多人房间聊天功能可应用于小班课或者会议室等场景,房间成员数量上限 ...
- Redis:Redis为什么是单线程的
菜瓜:怎么愁眉苦脸的 水稻:哎呀,这两天被Redis的单线程设计折磨的死去活来 菜瓜:有什么说法,给科普一下呗. 水稻:说起Redis,都知道它是单线程的.前段时间研究并发编程的时候刚刚体验到多线程的 ...
- 1003 Express Mail Taking
http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1003&cid=909 Express Mail Taking Time ...
- Web前端入门第 83 问:JavaScript localStorage 有大小限制吗?溢出会怎样?
本地存储除了 Cookie 外,还有 localStorage 和 sessionStorage,本文一探 localStorage. localStorage 此 API 存入的数据会 永久 保存在 ...