鴻蒙開發:如何實現列表吸頂

前言

本文基于Api13

列表吸頂功能,在實際的開發中有著很大的作用,比如可以讓列表層級之間更加分明,減少一定程度上的視覺混亂,由于吸頂的標題會隨著滾動固定在頂部,可以讓用戶無需反復滑動回頂部確認分組位置,方便實時定位當前分組,可以說還是非常方便的;常見的場景有聯系人的頁面,電商軟件的購物車等。

鴻蒙當中實現一個列表吸頂,很是簡單,官方為我們提供了ListItemGroup組件,使用它,便可以輕松搞定,我們可以先來看一個簡單的案例:

interface CityData {name: string;address: string[];
}@Entry
@Component
struct Index {private cityData: CityData[] = [{name: '北京市',address: ['朝陽區', '東城區', '西城區']}, {name: '河北省',address: ['石家莊', '保定市', '唐山市']}, {name: '河南省',address: ['鄭州市', '商丘市', '洛陽市', '開封市']}, {name: '山西省',address: ['太原市', '晉城市', '大同市', '長治市']}]@BuilderitemHead(text: string) {Text(text).fontSize(18).height(40).fontColor(Color.White).backgroundColor(Color.Orange).width('100%')}//組件使用build() {Column() {List() {ForEach(this.cityData, (item: CityData) => {ListItemGroup({ header: this.itemHead(item.name) }) {ForEach(item.address, (address: string) => {ListItem() {Text(address).width("100%").height(80).fontSize(16).textAlign(TextAlign.Center)}}, (item: string) => item)}.divider({ strokeWidth: 1, color: Color.Gray })})}.width("100%").sticky(StickyStyle.Header).scrollBar(BarState.Off)}.width("100%").height("100%")}
}

運行之后,效果如下:

從以上的案例中我們可以看到,ListItemGroup組件是必須要結合List組件一起使用的,這一點一定要知曉,下面,針對ListItemGroup組件,我們就一起來探究一下吧。

ListItemGroup使用方式

通過源碼,我們可以看到,ListItemGroup組件接收了一個ListItemGroupOptions參數。

 /*** Called when interface is called.** @param { ListItemGroupOptions } options* @returns { ListItemGroupAttribute }* @syscap SystemCapability.ArkUI.ArkUI.Full* @crossplatform* @atomicservice* @since 11*/(options?: ListItemGroupOptions): ListItemGroupAttribute;

ListItemGroupOptions可選擇的屬性如下,一般最常用的就是header屬性,也就是吸頂時的標題欄組件。

名稱

類型

必填

說明

header

CustomBuilder

ListItemGroup頭部組件。

headerComponent13+

ComponentContent

使用ComponentContent類型參數設置ListItemGroup頭部組件。

footer

CustomBuilder

設置ListItemGroup尾部組件。

footerComponent13+

ComponentContent

使用ComponentContent類型參數設置ListItemGroup尾部組件。

space

number | string

列表項間距。只作用于ListItem與ListItem之間,不作用于header與ListItem、footer與ListItem之間。

默認值:0

單位:vp

style10+

ListItemGroupStyle

設置List組件卡片樣式。

默認值:ListItemGroupStyle.NONE

我們可以把前言中的案例改造一下,加一個footer屬性:

ListItemGroup({header: this.itemHead(item.name),footer: this.itemFooter(item.address.length.toString())})

尾部組件視圖:

  @BuilderitemFooter(text: string) {Text("一共有" + text + "個地址").fontSize(18).height(20).fontColor(Color.White).backgroundColor(Color.Red).width('100%')}

運行之后,效果如下:

headerComponent和footerComponent參數,和header與footer功能一樣,都是用于頭或者尾組件,但是,他們的優先級高于后者,也就是如果你同時設置了他們,在實際的效果中會以前者為準。

headerComponent和footerComponent參數接收了一個ComponentContent參數,使用它,我們可以共用一個公共的視圖組件,因為它可以接受一個wrapBuilder參數。

比如上述的代碼,我們使用headerComponent代替header,運行之后可以發現,其實效果是一樣的。

 headerComponent: new ComponentContent(this.getUIContext(), wrapBuilder(buildHeader), item.name)

除此之外,還有一個style屬性,使用它,可以實現一個卡片樣式的效果:

 style: ListItemGroupStyle.CARD

設置后,會展示如下的卡片效果:

refresh庫實現

refresh庫是我開發的一個列表刷新加載庫,上架一年多來,已經有三萬多次的下載量,獲得了很多開發者的一致好評,如果您也感興趣,可以訪問如下的refresh庫地址,里面有詳細的使用方式:

https://ohpm.openharmony.cn/#/cn/detail/@abner%2Frefresh

使用刷新庫,實現一個列表吸頂也是非常的簡單,具體使用如下:

ListView({controller: this.controller, //刷新控制器itemGroupHeader: this.itemHead, //分組頭itemGroupData: this.cityData, //分組數據itemLayout: this.itemLayout, //內容視圖onRefresh: () => {setTimeout(() => {//模擬耗時this.controller.finishRefresh()}, 2000)},onLoadMore: () => {setTimeout(() => {//模擬耗時this.controller.finishLoadMore()}, 2000)}})

效果如下:

相關總結

ListItemGroup組件的使用,可以說是非常的簡單,如果僅僅是普通的吸頂,建議直接使用即可,如果您需要帶有下拉刷新和上拉加載效果的,可以使用refresh組提供的,在使用原生的時候,有一點需要注意,那就是需要設置List組件的sticky屬性,否則吸頂效果是不生效的。

.sticky(StickyStyle.Header|StickyStyle.Footer)

StickyStyle屬性介紹如下:

名稱

說明

None

0

header不吸頂,footer不吸底。

Header

1

header吸頂,footer不吸底。

Footer

2

footer吸底,header不吸頂。

本文標簽:HarmonyOS/ArkUI

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906902.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906902.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906902.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Zotero的RSS訂閱功能快速了解感興趣領域最新文章

文章目錄 寫在前面中文期刊的RSS訂閱英文期刊的RSS訂閱回到Zotero有啥用? 寫在前面 作為一名研究生或者科研工作者,肯定需要經常檢索自己研究領域的最新文獻,相比于不定期的去各大數據庫檢索文獻,借助RSS訂閱功能則更加便捷。 R…

Windows安裝Docker Desktop開啟 Kubenetes制作并部署本地鏡像

1、安裝Docker Desktop docker desktop官方下載鏈接,下載后一路點下來安裝就好了。 2、制作本地鏡像 跟著docker步驟制作鏡像,需要先配置docker 鏡像源,因為網絡問題 {"builder": {"gc": {"defaultKeepStorage&…

嵌入式學習筆記 - freeRTOS 列表,鏈表,節點跟任務之間關系

一 下圖說明了 freeRTOS 就緒列表,鏈表,節點跟任務之間關系 一個任務對應一個節點,一個鏈表對應一個優先級,一個任務根據優先級可以插入任何一個鏈表中。 插入函數為,這也是freeRTOS的核心函數,對每個任務…

scikit-learn pytorch transformers 區別與聯系

以下是 scikit-learn、PyTorch 和 Transformers 的區別與聯系的表格形式展示: 特性/庫scikit-learnPyTorchTransformers主要用途傳統機器學習算法深度學習框架預訓練語言模型與自然語言處理任務核心功能分類、回歸、聚類、降維、模型選擇等張量計算、自動微分、神經網絡構建與…

【C/C++】從零開始掌握Kafka

文章目錄 從零開始掌握Kafka一、Kafka 基礎知識理解(理論)1. 核心組件與架構2. 重點概念解析 二、Kafka 面試重點知識梳理三、C 使用 Kafka 的實踐(librdkafka)1. librdkafka 簡介2. 安裝 librdkafka 四、實戰:高吞吐生…

Spyglass:目標文件(.spq)的結構

相關閱讀 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 預備知識 為了方便檢查,Spyglass向用戶提供Guideware作為檢查參考;Guideware又包含各種方法(Methodology),應用于設計的不同階段&…

一些Dify聊天系統組件流程圖架構圖

分享一些有助于深入理解Dify聊天模塊的架構圖 整體組件架構圖 #mermaid-svg-0e2XalGLqrRbH1Jy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0e2XalGLqrRbH1Jy .error-icon{fill:#552222;}#mermaid-svg-0e2XalGLq…

地理空間索引:解鎖日志分析中的位置智慧

title: 地理空間索引:解鎖日志分析中的位置智慧 date: 2025/05/24 18:43:06 updated: 2025/05/24 18:43:06 author: cmdragon excerpt: 地理空間索引在日志分析中應用廣泛,涉及用戶登錄IP定位、移動端位置軌跡和物聯網設備位置上報等場景。MongoDB支持2dsphere和2d兩種地理…

分庫分表深度解析

一、為什么要分庫分表? 通常,數據庫性能受到如下幾個限制: 硬件瓶頸:單機的 CPU、內存、磁盤 I/O 等資源總是有限。例如,當單表中的記錄達到上億、甚至更高時,表掃描、索引維護和數據遷移會變得非常慢。單…

QListWidget的函數,信號介紹

前言 Qt版本:6.8.0 該類用于列表模型/視圖 QListWidgetItem函數介紹 作用 QListWidget是Qt框架中用于管理可交互列表項的核心組件,主要作用包括: 列表項管理 支持動態添加/刪除項:addItem(), takeItem()批量操作:addItems()…

ModbusRTU轉profibusDP網關與RAC400通訊報文解析

ModbusRTU轉profibusDP網關與RAC400通訊報文解析 在工業自動化領域,ModbusRTU和ProfibusDP是兩種常見的通信協議。ModbusRTU以其簡單、可靠、易于實現等特點,廣泛應用于各種工業設備之間的通信;而ProfibusDP則是一種高性能的現場總線標準&am…

Python容器

一、容器 1. 列表【】:有序可重復可混裝可修改 [元素1,元素2,元素3,...] ? 可以容納多個元素 ? 可以容納不同類型的元素(混裝) ? 數據是有序存儲的(有下標序號) ? 允許重復數…

webpack面試問題

一、核心概念 Webpack的構建流程是什么? 答案: 初始化:讀取配置,創建Compiler對象編譯:從入口文件開始,遞歸分析依賴關系,生成依賴圖模塊處理:調用Loader轉換模塊(如babel-loader)輸出:將處理后的模塊組合成Chunk,生成最終文件Loader和Plugin的區別? Loader:文件…

uniapp-商城-66-shop(2-品牌信息顯示,數據庫讀取的異步操作 放到vuex actions)

完成頁面的顯示,但是還需要進行修改,這里涉及到修改中的信息同步顯示。也會涉及到數據的讀取,修改和同步。 本文介紹了如何使用Vuex管理品牌數據,實現數據的同步顯示和修改。主要內容包括:1.將獲取品牌數據的異步操作封…

使用Pyinstaller打包python,全過程解析【2025最詳細】

一、如何使用 Pyinstaller 打包 Python 程序 1.打開終端 右鍵點擊文件夾空白處,選擇 打開于 > 打開終端 2.安裝 pyinstaller 在打開的終端中,輸入命令【pip install pyinstaller】 使用 Python 包管理工具 pip 來安裝 Pyinstaller。等待安裝過程結…

GPU加速Kubernetes集群助力音視頻轉碼與AI工作負載擴展

容器編排與GPU計算的結合,為追求性能優化的企業開辟了戰略轉型的新路徑 基于GPU的托管Kubernetes集群不僅是技術選擇,更是徹底改變企業處理高負載任務的戰略部署方式。 隨著人工智能和機器學習項目激增、實時數據處理需求的劇增,以及高性能媒…

LINUX 524 rsync+inotify 調試(問題1:指定端口無法同步/已通過;問題2:rsync.log文件中時間不顯示/已顯示)

怎么把java文件夾給傳過去了 rsync inotify 監控代碼實時傳輸調試 沒看到日志 這里面有了 rsync -e"ssh -p 3712" -av /root/app/java/ code192.168.235.100:/home/code/backup/java_backup/ 文件夾后面的/要加上 [rootlocalhost java]# cat /var/log/rsync.log…

Python入門手冊:條件判斷

條件判斷是編程中不可或缺的一部分,它允許程序根據不同的條件執行不同的代碼塊。Python提供了if、elif和else語句來實現條件判斷。通過這些語句,你可以控制程序的流程,使其能夠根據不同的情況做出相應的反應。本文將詳細介紹Python中的條件判…

x-cmd install | cargo-selector:優雅管理 Rust 項目二進制與示例,開發體驗升級

目錄 功能亮點安裝優勢特點適用場景總結 還在為 Rust 項目中眾多的二進制文件和示例而煩惱嗎?cargo-selector 讓你告別繁瑣的命令行,輕松選擇并運行目標程序! 功能亮點 交互式選擇: 在終端中以交互方式瀏覽你的二進制文件和示例&…

Baklib知識中臺高效實踐路徑

知識中臺全周期構建路徑 Baklib在構建知識中臺全周期管理體系時,以知識價值轉化為核心導向,通過三階段遞進實現閉環運作。在知識采集階段,運用智能爬蟲與API接口技術,聚合分散在業務系統、文檔庫及溝通工具中的碎片化知識資產&am…