鸿蒙开发中的List组件详解

目录

引言

1.List组件基础

2.List接口参数

 1.space

2.initialIndex

3.scroller

3.ListView的属性        

1.listDirection

2.lanes

3.divider

4.scrollBar

4.布局与约束

5.ListItem生命周期

1.使用ForEach创建ListItem

2.使用LazyForEach创建ListItem        

3.使用Repeat创建ListItem

1.使用virtualScroll

2.不使用virtualScroll

6.List的使用场景

1. 最简单的List

2. 自定义组件

3. 滚动控制

高级特性

1. 分组列表

2. 懒加载

3. 下拉刷新与上拉加载

性能优化技巧

常见问题解决

结语


引言

        在鸿蒙(HarmonyOS)应用开发中,List组件是最常用的UI组件之一,用于展示垂直滚动的列表数据。本文将详细介绍List组件的特性、使用方法以及一些实用技巧。

1.List组件基础

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

        List是鸿蒙OS中用于展示垂直滚动列表的容器组件,具有以下特点:

  • 高性能的列表渲染

  • 支持大数据量的流畅滚动

  • 内置多种布局和交互效果

  • 支持分组和多种列表项样式

2.List接口参数

    当我们创建 List 的时候,有三个默认可选参数,分别是 space、initialIndex、scroller。

    我们分别看看他们的属性。

 1.space

        space 用来设置子组件主轴方向的间隔。

 图1.space属性

2.initialIndex

        设置当前 List初次加载的时候,初始 item 的索引值。

图2.修改初次加载显示的数据元素下标

3.scroller

        可以滚动组件的控制器。

        我们可以调用scroll的相关方法处理List。

        例如我们可以通过下面的代码把List滚动到底部

          Button("滚动到底部").onClick(()=>{this.scroller.scrollEdge(Edge.Bottom)})

3.ListView的属性        

1.listDirection

        设置List组件的排列方向。

        listDirection是Axis类型的枚举,定义如下:

declare enum Axis {
    Vertical,
    Horizontal
}        

        默认值为Axis.Vertical,方向为纵向。

        Axis.Horizontal方向为横向。

2.lanes

        设置List组件的布局列数或者行数。

        lanes是鸿蒙(HarmonyOS)中List组件的一个重要属性,用于控制列表在水平方向上的布局方式,特别适用于需要多列布局的场景。通过设置lanes属性,可以让List组件中的列表项以网格形式排列,而不是传统的单列垂直排列。

3.divider

        设置ListItem分割线样式,默认无分割线。

4.scrollBar

        设置滚动条状态。

        BarState.AutoAuto:按需显示

        BarState.AutoOff:不显示

        BarState.AutoOn:常驻显示

4.布局与约束

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

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

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

图3.List、ListItemGroup和ListItem组件关系

5.ListItem生命周期

1.使用ForEach创建ListItem

        List组件创建时,所有ListItem将会被创建。显示区域内的ListItem在首帧进行布局,预加载范围内的ListItem在空闲时完成布局。预加载范围之外的ListItem仅创建ListItem自身,ListItem其内部的子组件不会被创建。

        当List组件滑动时,进入预加载及显示区域的ListItem将会创建其内部的子组件并完成布局,而滑出预加载及显示区域的ListItem将不会被销毁。

图4.ForEach创建ListItem

2.使用LazyForEach创建ListItem        

        List组件创建时,显示区域中的ListItem会被创建与布局。预加载范围内的ListItem在空闲时创建与布局,但是不会被挂载到组件树上。预加载范围外的ListItem则不会被创建。

        当List组件滑动时,进入预加载及显示区域的ListItem将被创建与布局,创建ListItem过程中,若ListItem内部如果包含@Reusable标记的自定义组件,则会优先从缓存池中复用。滑出预加载及显示区域的ListItem将被销毁,其内部若含@Reusable标记的自定义组件,则会被回收并加入缓存池。

图5.LazyForEach创建ListItem的生命周期

3.使用Repeat创建ListItem

1.使用virtualScroll

        List组件创建时,显示区域内的ListItem将被创建和布局。预加载范围内的ListItem在空闲时创建和布局,并且挂载至组件树上。预加载范围外的ListItem则不会被创建。

        当List组件滑动时,进入预加载及显示区域的ListItem,将从缓存池中获取ListItem并复用及布局,若缓存池中无ListItem,则会新创建并布局。滑出预加载及显示区域的ListItem会将被回收至缓存池。

        图6.Repeat使用virtualScroll创建ListItem的生命周期

2.不使用virtualScroll

        List组件创建时,所有ListItem均被创建。显示区域内的ListItem在首帧完成布局,预加载范围内的ListItem在空闲时完成布局。预加载范围外的ListItem不会进行布局。

        当List组件滑动时,进入预加载及显示区域的ListItem将进行布局。滑出预加载及显示区域的ListItem不会销毁。

图7.Repeat不使用virtualScroll创建ListItem的生命周期

1.listDirection

1.listDirection

// 示例代码:基本List使用
import { List, ListItem } from '@ohos/arkui';@Entry
@Component
struct MyList {private data: string[] = ['苹果', '香蕉', '橙子', '葡萄', '西瓜']build() {Column() {List({ space: 20 }) {ForEach(this.data, (item: string) => {ListItem() {Text(item).fontSize(20).margin({ left: 15 })}})}.width('100%').height('100%')}}
}

6.List的使用场景

1. 最简单的List

        在最简单的列表形式中,List静态地创建其列表项ListItem的内容。

        当我们ListView的ListItem只有一个组件的时候,我们使用下面的代码即可实现一个简单的列表。

@Entry
@Component
struct CityList {build() {NavDestination(){List() {ListItem(){Text('北京').fontSize(24)}ListItem(){Text('上海').fontSize(24)}ListItem(){Text('杭州').fontSize(24)}}    .backgroundColor('#FFF1F3F5').alignListItem(ListItemAlign.Center)}.title("List实现城市列表")}
}

        效果图如下:

图8.最简单的List

@State private messages: Message[] = [{ id: 1, content: '你好鸿蒙' },{ id: 2, content: 'List组件学习' },// 更多数据...
];List() {ForEach(this.messages, (item: Message) => {ListItem() {Text(item.content)}})
}

2. 自定义组件

        因此,如果ListItem是由多个组件元素组成的,则需要将这多个元素组合到一个容器组件内或组成一个自定义组件。

        例如我们要实现一个通讯录联系人页面:

图9.联系人列表

        如上图所示,联系人列表的列表项中,每个联系人都有头像和名称。此时,需要将Image和Text封装到一个Row容器内。

List() {ListItem() {Row() {// app.media.iconE为自定义资源Image($r('app.media.iconE')).width(40).height(40).margin(10)Text('小明').fontSize(20)}}ListItem() {Row() {// app.media.iconF为自定义资源Image($r('app.media.iconF')).width(40).height(40).margin(10)Text('小红').fontSize(20)}}
}

3. 滚动控制

private scroller: Scroller = new Scroller()List({ scroller: this.scroller }) {// 列表内容
}// 滚动到指定位置
this.scroller.scrollTo({ x: 0, y: 100 })

高级特性

1. 分组列表

List() {ForEach(this.groupData, (group: Group) => {ListItemGroup({ header: this.GroupHeader(group.name) }) {ForEach(group.items, (item: Item) => {ListItem() {Text(item.name)}})}})
}

2. 懒加载

List() {LazyForEach(this.dataSource, (item: Item) => {ListItem() {Text(item.name)}})
}

3. 下拉刷新与上拉加载

List({ controller: this.listController }) {// 列表内容
}
.onRefresh(() => {// 下拉刷新逻辑
})
.onReachEnd(() => {// 上拉加载更多
})

性能优化技巧

  1. 复用列表项​:确保ListItem的结构尽可能简单,提高复用率

  2. 避免复杂计算​:在列表渲染中避免复杂的计算和频繁的UI更新

  3. 使用LazyForEach​:对于大数据集,使用LazyForEach代替ForEach

  4. 图片懒加载​:列表中的图片使用懒加载技术

常见问题解决

  1. 列表滚动卡顿​:

    • 检查是否有过多的UI更新

    • 确保使用了正确的数据绑定方式

    • 考虑分页加载数据

  2. 列表项点击无响应​:

    • 检查是否添加了.onClick事件

    • 确保没有其他组件遮挡了点击区域

  3. 列表数据显示异常​:

    • 检查数据源是否正确更新

    • 确认ForEach或LazyForEach的key值唯一且稳定

结语

List组件是鸿蒙应用开发中不可或缺的重要组件,掌握其使用方法和优化技巧对于构建流畅的用户界面至关重要。通过本文的介绍,希望您能更高效地使用List组件,为您的鸿蒙应用带来更好的用户体验。

在实际开发中,建议多参考鸿蒙官方文档和示例代码,不断实践和优化您的列表实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94343.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026界计算机专业毕业的有福了!(开题报告任务书)

开题报告 我们以基于Java的婚纱店管理系统为案例进行指导。 任务书: 首先是毕设的立题依据,这个主要描写一些简洁大体的大白话,描述一下你为什么要做这个题目的毕设。 那就需要你描述一下现阶段社会面婚纱店的运营情况,写一些…

安全、高效、可靠的物理隔离网络安全专用设备———信刻光盘安全隔离与文件单向导入系统!

着各种数据传输、储存技术、信息技术的快速发展,保护信息安全是重中之重。军工企业、政府、部队及企事业单位等利用A网与B网开展导入/导出相关工作已成为不可逆转的趋势。针对于业务需要与保密规范相关要求,涉及重要秘密信息,需做到完全的物理…

JetPack 与 PyTorch 版本对应及资源详情

下载链接 JetPack 版本适配 PyTorch 版本发布日期可下载资源(.whl 安装包 / 文档)JP 6.1PyTorch 2.5.0a0(构建号:872d972e41.nv24.08.17622132)2024/10/01- torch-2.5.0a0872d972e41.nv24.08.17622132-cp310-cp310-li…

【c++进阶系列】:万字详解多态

🔥 本文专栏:c 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录: 你以为自己在孤独地爬坡吗?看看身后吧——那些被汗水浸湿的脚印,早已连成一道向上的阶梯 ★★★ 本文前置知识&am…

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年8月23日第168弹

从今天开始,咱们还是暂时基于旧的模型进行预测,好了,废话不多说,按照老办法,重点8-9码定位,配合三胆下1或下2,杀1-2个和尾,再杀4-5个和值,可以做到100-300注左右。(1)定位…

分布式搜索(Elasticsearch)深入用法

目录 数据聚合 聚合的种类 DSL实现聚合 桶聚合 度量聚合 RestAPI实现聚合 多条件聚合 自动补全 拼音分词器 自定义分词器 自动补全查询 实现搜索框自动补全 数据同步 数据同步思路分析 实现elasticsearch与数据库数据同步 集群 搭建ES集群 集群脑裂问题 集群…

java:接口与实现类

1. Java 基础层面接口(Interface) 只是方法的定义/规范,里面没有真正的逻辑。例如:public interface IBookService {boolean save(Book book); }👉 这里只说明了:我要有一个 save 方法,但“怎么…

Chrome 插件开发实战:从入门到进阶

1.1 Chrome 插件的魅力与应用场景Chrome 插件是增强 Chrome 浏览器功能的得力助手,能实现广告拦截、密码管理、标签管理等实用功能。在日常办公中,我们可以借助插件提升效率,如自动填充表单、快速保存网页内容;在浏览网页时&#…

通过官方文档详解Ultralytics YOLO 开源工程-熟练使用 YOLO11实现分割、分类、旋转框检测和姿势估计(附测试代码)

目录 前言: 1.了解ultralytics工程与yolo模型 1.1 yolo11可以为我们做些什 1.2 yolo11模型的高性能 1.3 对于yolo11一些常见的问题 1.3.1 YOLO11 如何以更少的参数实现更高的精度? 1.3.2 YOLO11 可以部署在边缘设备上吗? 2. 深入了解y…

vue实现小程序oss分片上传

随着小程序越来越普及,小程序上传文件必不可少,那么上传的文件大小就不可控了,小则几mb,大到好几百mb,小文件还可以,但是一到超过200mb或稍微再大些的小程序就很容易上传失败,导致功能不能继续进行。以下我们就来解决这个问题,将大文件实现分片上传 温馨提示,不要看内…

14.Shell脚本修炼手册--玩转循环结构(While 与 Until 的应用技巧与案例)

while 循环和 until 循环的应用实践 文章目录while 循环和 until 循环的应用实践当型和直到型循环:两种 "重复" 的逻辑while 循环:满足条件就继续until 循环:不满足条件就继续基础示例:从简单场景学用法示例 1&#xff…

chromadb使用hugging face模型时利用镜像网站下载注意事项

chromadb默认使用sentence-transformers/all-MiniLM-L6-v2的词嵌入(词向量)模型,如果在程序首次运行时,collection的add或query操作时如果没有指定embeddings或query_embeddings,程序会自动下载相关嵌入向量模型&#…

基于大模型的对话式推荐系统技术架构设计

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《GPT多模态大模型与AI Agent智能体》(跟我一起学人工智能)【陈敬雷编著】【清华大学出版社】 清华《GPT多模态大模型与AI Agent智能体》书籍配套视频课程【陈敬雷…

第1章 React组件开发基础

在掌握React开发之前,我们需要先建立扎实的组件开发基础。这些基础知识不仅影响你的开发效率,更决定了应用程序的性能、可维护性和团队协作的顺畅程度。 本章将深入探讨React组件开发的核心技巧,从JSX语法优化到组件架构设计,帮你建立正确的React开发思维模式。 🗂️ 本…

【yocto】Yocto Project 配置层(.conf)文件语法详解

【加关注,不迷路,持续输出中...】Yocto Project 是一个开源的嵌入式 Linux 系统构建框架,其核心是通过元数据(Metadata)来定义如何构建系统。这些元数据主要包括配方(.bb / .bbappend)、配置&am…

知识蒸馏 Knowledge Distillation 序列的联合概率 分解成 基于历史的条件概率的连乘序列

知识蒸馏 Knowledge Distillation 序列的联合概率 分解成 基于历史的条件概率的连乘序列 flyfish 代码实践 论文 Generalized Knowledge Distillation (GKD) On-Policy Distillation of Language Models: Learning from Self-Generated Mistakes 自回归分解 将 “序列的联合…

React15.x版本 子组件调用父组件的方法,从props中拿的,这个方法里面有个setState,结果调用报错

在React 15.x中,子组件通过props调用父组件包含setState的方法时出现错误,最常见的原因是父组件方法的this指向丢失,导致调用setState时出现Cannot read property setState of undefined之类的错误。 核心原因 React类组件的方法默认不会绑定…

交叉编译.so到鸿蒙使用

以下是在 Ubuntu 20.04 系统上的操作,tpc_c_cplusplus 他是把编译的流程都给写进去了,你只需要关注你要编译的库配置好环境就行了。 第一步:下载 tpc_c_cplusplus 仓库地址: GitCode - 全球开发者的开源社区,开源代码托管平台…

LLaMA-Factory 中配置文件或命令行里各个参数的含义

常见参数分类 & 含义对照表: 🔹模型相关参数含义model_name_or_path基础模型的路径(本地或 HuggingFace Hub 上的名字,如 meta-llama/Llama-2-7b-hf)adapter_name_or_pathLoRA/Adapter 权重路径(如果要…

JavaScript 性能优化实战技术文章大纲

一、引言1.1 背景阐述在当今 Web 应用高度交互化、复杂化的趋势下,JavaScript 作为核心脚本语言,其性能优劣直接决定了用户体验的好坏。从单页应用(SPA)的流畅运行,到复杂数据可视化的实时交互,JavaScript …