掌握 Android 中的 RecyclerView 優化

掌握 Android 中的 RecyclerView 優化

  • 一、RecyclerView Pool以及何時使用它
  • 二、onCreateViewHolder 和 onBindViewHolder
  • 三、優化 RecyclerView 的不同方法
  • 四、視圖無效與請求布局
  • 五、ViewHolder模式
  • 六、默認的廢料和臟視圖類型
  • 七、結論

RecyclerView 是 Android 中一個功能強大的小部件,用于高效顯示大型列表或數據網格。為了確保應用程序的性能和響應能力,優化 RecyclerView 實現至關重要。這里我們將探討各種技術和概念,幫助充分利用 RecyclerView。

一、RecyclerView Pool以及何時使用它

RecyclerView Pool 是一種幫助管理 RecyclerView 中視圖的內存和性能的機制。它本質上是一個緩存,用于保存當前在屏幕上不可見但在不久的將來可能再次需要的視圖。這顯著減少了每次新項目進入可見區域時膨脹新視圖的開銷。

何時使用 RecyclerView Pool:

  • 處理大型列表或數據網格時使用它。
  • 當列表中的項目具有不同的視圖類型時,請選擇 RecyclerView Pool。

二、onCreateViewHolder 和 onBindViewHolder

在RecyclerView中,onCreateViewHolder和onBindViewHolder是適配器中必不可少的方法。它們共同為列表中的每個項目創建和綁定視圖。

  • onCreateViewHolder在需要創建新視圖時被調用。它負責擴展布局并創建 ViewHolder 實例。
  • 當現有視圖被新項目重用時,將調用onBindViewHolder 。它將數據綁定到視圖持有者,允許您更新視圖的內容。
  • onBindViewHolder不應該用于綁定點擊偵聽器,我們應該注意我們在其中執行的匿名對象或任務。仔細閱讀下面的代碼,然后我會解釋為什么?
class  MyAdapter ( private  val items: List<Item>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() { inside  class  ViewHolder (itemView: View) : RecyclerView.ViewHolder(itemView) { init { itemView.setOnClickListener { // 處理項目click here val position = adapterPosition if (position != RecyclerView.NO_POSITION) { val clickedItem = items[position] // 處理 clickedItem 的點擊事件} } } } override  fun  onCreateViewHolder (parent: ViewGroup , viewType: Int ) : ViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, Parent, false ) return ViewHolder(view) } override  fun  onBindViewHolder (holder: ViewHolder ,position: Int ) { val currentItem = items[position] / / 此處將數據綁定到視圖持有者} override  fun  getItemCount () = items.size 
}
  • 在onBindViewHolder中,為每個項目單獨生成單擊偵聽器,從而導致多個偵聽器實例。通過將點擊監聽器放置在 中ViewHolder,它們在 ViewHolder 創建時就形成了,由于 ViewHolder 的可重用性,提高了內存效率。

三、優化 RecyclerView 的不同方法

  1. 使用圖像庫:

處理圖像時,建議使用提供位圖池的圖像庫。這可以防止過多的內存使用和頻繁的垃圾收集。

Glide.with( this ) .load(imageUrl) .placeholder(R.drawable.placeholder_image) .error(R.drawable.error_icon) .into(imageView)
  1. 優化圖像尺寸:從服務器獲取圖像尺寸和寬高比,以避免不必要的調整大小和縮放。
  2. setHasStableIds:此方法應用于setHasStableIds(true)啟用穩定的項目 ID。這有助于有效地更新和重新排序項目,而無需不必要的重新綁定。
class  MyAdapter ( private  val itemList: List<Item>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() { init { setHasStableIds( true ) // 為此適配器啟用穩定 ID} //....}
  1. setHasFixedSize:如果RecyclerView大小本身是固定的并且不會因其內容而改變,則使用它setHasFixedSize(true)可以通過避免不必要的布局計算來幫助提高性能。
val recyclerView = findViewById<RecyclerView>(R.id.recyclerView) 
recyclerView.setHasFixedSize( true ) // 為 RecyclerView 啟用固定大小
  1. setItemViewCacheSize:使用此方法調整緩存大小,以控制保留多少個離屏視圖。這可以幫助管理內存使用。
val recyclerView = findViewById<RecyclerView>(R.id.recyclerView) 
recyclerView.setItemViewCacheSize( 10 ) // 根據項目大小將視圖緩存大小設置為自定義值

四、視圖無效與請求布局

  • Invalidate:用于指示視圖的內容已更改并且需要重新繪制。
  • requestLayout:用于請求新的布局通道,影響視圖的大小和位置。

您可能想知道為什么我突然談論invalidate與requestLayout。讓我解釋。

我討論了“無效”與“請求布局”,以說明它們如何影響視圖的生命周期。這會影響屏幕重繪時間,過多的布局和繪制階段會降低性能。要優化 Android 頁面,尤其是 RecyclerView,徹底掌握視圖生命周期至關重要。

讓我用一個例子來進一步解釋一下:

當 TextView 的 wrap_content 與 100dp 固定時,將或應該調用什么(invalidate 或 requestLayout)?

回答:

當 TextView 的寬度設置為 時wrap_content,調用requestLayout()會更合適。這是因為這requestLayout()表明視圖層次結構需要重新測量和布局,以確保內容正確地適合邊界。

當 TextView 的寬度固定時(例如,設置為特定值,如100dp),調用invalidate()通常就足夠了。它通知系統視圖的內容已更改,并且需要在現有布局范圍內重新繪制。這可以避免在更新視圖外觀時進行不必要的重新布局計算。

五、ViewHolder模式

ViewHolder 模式是一種設計模式,它通過最大限度地減少對 .recyclerview 的調用次數來增強 recyclerview 的性能findViewById()。它涉及創建一個 ViewHolder 類,該類保存對項目布局中視圖的引用。這允許在用戶滾動列表時有效地重用視圖。有關 ViewHolder 模式的綜合示例,請查看此鏈接。

六、默認的廢料和臟視圖類型

在RecyclerView中,每種視圖類型的廢視圖和臟視圖的默認計數設置為 5。對于標題等僅 1 或 2 個剪貼視圖就足夠的情況,此通用編號可能不是最佳選擇。廢料視圖是可重用的、分離的視圖,可以輕松地重新附加。

為了提高內存效率,您可以根據每個特定視圖類型的流行程度自定義池大小,從而定制剪貼視圖行為。這種方法通過有效管理RecyclerView中不同類型項目的剪貼視圖數量,確保優化內存使用。

val customRecycledViewPool = RecyclerView.RecycledViewPool().apply { setMaxRecycledViews(viewType, poolSize) // 設置自定義 viewType 和 poolSize}

七、結論

優化 RecyclerView 實施對于保持流暢且響應迅速的用戶體驗至關重要。通過理解 RecyclerView Pool 和 ViewHolder 模式等概念,并優化視圖創建和綁定,您可以確保您的應用程序有效地處理大量數據。

請記住,每種優化技術都有特定的目的,并且應用這些技術的組合可以顯著提高 RecyclerView 的性能。

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

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

相關文章

【操作系統】磁盤存儲空間的管理

實驗5 磁盤存儲空間的管理 一、實驗目的 磁盤是用戶存放程序和數據的存儲設備&#xff0c;磁盤管理的主要目的是充分有效地利用磁盤空間。本實驗模擬實現磁盤空間的分配與回收&#xff0c;使學生對磁盤空間的管理有一個較深入的理解。 二、實驗內容 實驗任務&#xff1a;用位…

FreeSWITCH debian11/12 apt安裝

官方給的easy way安裝方式如下&#xff1a; # 換成自己的token TOKENpat_ZrPXJQ8JNWsVQW2ubhnUwi7gapt-get update && apt-get install -y gnupg2 wget lsb-releasewget --http-usersignalwire --http-password$TOKEN -O /usr/share/keyrings/signalwire-freeswitch-…

#LLM入門|Prompt#1.2_提示原則_Guidelines

提示原則 一、編寫清晰、具體的指令 使用分隔符清晰地表示輸入的不同部分&#xff1a; 在Prompt中使用分隔符&#xff0c;如、“”"、< >、 、:等&#xff0c;將不同的文本部分區分開來&#xff0c;避免混淆和意外的結果。分隔符能夠防止提示詞注入&#xff0c;提…

petalinux_zynq7 驅動DAC以及ADC模塊之四:python實現http_api

前文&#xff1a; petalinux_zynq7 C語言驅動DAC以及ADC模塊之一&#xff1a;建立IPhttps://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C語言驅動DAC以及ADC模塊之二&#xff1a;petalinuxhttps://blog.csdn.net/qq_27158179/article/details/1362…

Java觀察者模式:實現高效的事件驅動編程

Java中的裝飾者模式&#xff1a;靈活地為對象添加功能 一、引言 在軟件設計中&#xff0c;我們經常需要為對象動態地添加功能或行為。裝飾者模式&#xff08;Decorator Pattern&#xff09;是一種結構型設計模式&#xff0c;它允許我們在運行時將功能動態地添加到對象上&…

串的相關題目

于是他錯誤的點名開始了 我發現有關hash得題目有些是可以通過map數組來完成的&#xff1a;何為map數組&#xff0c;我們先思考一下最簡單的桶的排序&#xff0c;桶排序是將我們需要數字最為下標輸進數組中&#xff0c;而數組是存放的數字是這個數字出現的次數&#xff0c;但是由…

Matlab論文插圖繪制模板第137期—極坐標分組氣泡圖

在之前的文章中&#xff0c;分享了Matlab極坐標氣泡圖的繪制模板&#xff1a; 進一步&#xff0c;再來分享一下極坐標分組氣泡圖。 先來看一下成品效果&#xff1a; ? 特別提示&#xff1a;本期內容『數據代碼』已上傳資源群中&#xff0c;加群的朋友請自行下載。有需要的朋…

解決SSH遠程登錄開飯板出現密碼錯誤問題

輸入“adduser Zhanggong回車”&#xff0c;使用adduser命令創建開發板用戶名為Zhanggong 輸入密碼“123456” 輸入密碼“123456”

openGauss學習筆記-226 openGauss性能調優-系統調優-配置LLVM-LLVM適用場景與限制

文章目錄 openGauss學習筆記-226 openGauss性能調優-系統調優-配置LLVM-LLVM適用場景與限制226.1 適用場景226.2 非適用場景 openGauss學習筆記-226 openGauss性能調優-系統調優-配置LLVM-LLVM適用場景與限制 226.1 適用場景 支持LLVM的表達式 查詢語句中存在以下的表達式支持…

PostgreSQL數據庫備份和恢復

一、數據庫備份 /usr/lib/postgresql/16/bin/pg_dump -h localhost -p 5432 -U odoo -F c -b -v -f backup.sql laonian 二、數據庫恢復 1 現在目標pgsql數據庫中創建空數據庫老年 create database laonian owner odoo; 2 執行恢復命令&#xff08;windows系統下&#xff…

網絡安全-nc(Netcat)工具詳解

經常在反彈shell的時候使用nc命令&#xff0c;但是從來沒有了解過&#xff0c;今天翻書看到了&#xff0c;準備記錄一下。 nc全稱Netcat&#xff0c;是TCP/IP連接的瑞士軍刀。哈哈我最喜歡瑞士軍刀了。 有一個比較偏的知識點&#xff0c;nc還可以探測目標的端口是否開放&…

Modern C++ std::variant的5個特性+原理

1 前言 上一節《Modern C std::variant的實現原理》我們簡單分析了std::variant的實現原理&#xff0c;其實要學好C編程&#xff0c;除了看優秀的代碼包括標準庫實現&#xff0c;讀文檔也是很便捷且必須的一種辦法。 本節我將逐條解析文檔中的五個特性&#xff0c;解析的辦法有…

LINUX操作系統:重定向

輸出重定向&#xff1a;將命令行程序的輸出重定向到其他位置&#xff0c;如文件、程序、打印機等。 輸入重定向&#xff1a;從其他位置獲取輸入&#xff0c;而不是從標準輸入&#xff08;鍵盤、鼠標等&#xff09; 錯誤重定向&#xff1a;同輸出。 輸出重定向&#xff08;Outp…

R語言【sp】——over(),%over%

Package sp version 1.5-0 Description 點、網格和多邊形的一致空間覆蓋:在對象x的空間位置從空間對象y檢索索引或屬性。 Usage over(x, y, returnList = FALSE, fn = NULL, ...) x %over% y Arguments 參數【x】:查詢的幾何(位置)。 參數【y】:層,從中查詢幾何或屬性。…

PYTHON-使用正則表達式進行模式匹配

目錄 Python 正則表達式Finding Patterns of Text Without Regular ExpressionsFinding Patterns of Text with Regular ExpressionsCreating Regex ObjectsMatching Regex ObjectsReview of Regular Expression MatchingMore Pattern Matching with Regular ExpressionsGroupi…

阿里開源低代碼引擎 - Low-Code Engine

阿里開源低代碼引擎 - Low-Code Engine 本文主要介紹如何在Windows運行/開發阿里開源低代碼引擎 - Low-Code Engine 詳細文檔參見【 阿里開源低代碼引擎 - Low-Code Engine 官方文檔】 目錄 阿里開源低代碼引擎 - Low-Code Engine一、環境準備1、使用 WSL 在 Windows 上安裝 L…

方法鑒權:基于 Spring Aop 的注解鑒權

在Spring框架中&#xff0c;可以使用面向切面編程&#xff08;AOP&#xff09;來實現注解鑒權。這通常涉及到定義一個切面&#xff08;Aspect&#xff09;&#xff0c;該切面會在方法執行前進行攔截&#xff0c;并根據注解value值來決定是否允許執行該方法。 簡單思路&#xf…

Java學習筆記2024/2/22

面向對象進階部分學習方法&#xff1a; 特點&#xff1a; 邏輯性沒有那么強&#xff0c;但是概念會比較多。 記憶部分重要的概念&#xff0c;理解課堂上講解的需要大家掌握的概念&#xff0c;多多練習代碼。 今日內容 復習回顧 static關鍵字 繼承 教學目標 能夠掌握st…

【開源】JAVA+Vue.js實現醫院門診預約掛號系統

目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 功能性需求2.1.1 數據中心模塊2.1.2 科室醫生檔案模塊2.1.3 預約掛號模塊2.1.4 醫院時政模塊 2.2 可行性分析2.2.1 可靠性2.2.2 易用性2.2.3 維護性 三、數據庫設計3.1 用戶表3.2 科室檔案表3.3 醫生檔案表3.4 醫生放號…

qml 保存當前界面并在其圖片中添加文字

使用場景&#xff1a;在保存二維碼的時候&#xff0c; 在二維碼圖片加標題或描述 保存后的圖片 demo&#xff1a;https://download.csdn.net/download/uVarAndMethod/88868455