鴻蒙開發中的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
英文地址,請注明出處:http://en.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 …