Android | 再探 RecyclerView 之名詞解析

文章目錄

  • Adapter、ViewHolder
  • child view
  • LayoutManager
  • Recycler
  • Scrap
  • Dirty
  • Index
  • Position
    • layout position 和 adapter position
  • 四級緩存


瀏覽本文前推薦先閱讀 Android入門(九)| 滾動控件 ListView 與 RecyclerView

Adapter、ViewHolder

Adapter: A subclass of RecyclerView.Adapter responsible for providing views that represent items in a data set.

  • 翻譯:RecyclerView.Adapter 的子類。Adapter (適配器) 負責提供表示 data set(數據集) 中 items(子項) 的 views(視圖)。

  • 解析:RecyclerView 只是一個 ViewGroup,它只認識 View ,不清楚構成 前端界面View 的 后端Data數據的具體結構。因此,RecyclerView 需要一個 AdapterData 轉換為 RecyclerView 認識的 ViewHolder

  • ViewHolder:view 進行操作,在 ViewHolder 中會將 view 中的各個控件實例化,然后進行管理,如:設置控件的點擊事件等。


child view

RecyclerView滾動控件 中的 最小子元素,比如對于布局方式為 LinearLayout(線性布局) 的 RecyclerView 來說,child view(子視圖) 就是每一行。

我個人理解為 RecyclerView 是由 data set 的所有數據構建而成的,而每個 child view 都是由某個 data item(數據子項) 構建而成的。


LayoutManager

雖然 Adapter 已經將 data set 轉換為了 views,但是以怎樣的布局顯示這些 views 也是一個問題。因此 RecyclerView 委托 LayoutManager 負責 view 布局的顯示管理。有多種布局方式供選擇,如:線性布局、網格布局等。

PS:LayoutManager 只負責將 view 呈現在 Recycle 中,并不直接負責對 view 的管理,view 的管理由下面的 Recycler 負責。


Recycler

管理不在前臺的 View,對 View 進行緩存,以便后續重用,避免每次都需要加載 view,顯著提高性能。LayoutManager 在需要 View 的時候會向 Recycler 進行索取,當 LayoutManager 不需要 View (試圖滑出)的時候,就直接將廢棄的 View 丟給 Recycler


Scrap

在加載布局期間已進入 臨時分離(temporarily detached) 狀態的子視圖。 Scrap views 可以在不與 parent RecyclerView 完全分離(fully detached) 的情況下重用。 重用時需要做進一步判定是否需要修改 scrap views

  • 如果不需要 rebinding重新綁定 則不需要修改。
  • 如果該 view 被視為 dirty,則由 適配器Adapter 進行修改。

Dirty

在顯示之前必須由 適配器 重新綁定rebound子視圖child view


Index

調用 ViewGroup.getChildAt() 時使用的參數,已經添加到 RecyclerView 中的 子view 的索引。 與 Position 形成對比,Position 是數據的位置,Index 是視圖的位置。


Position

Position: The position of a data item within an Adapter.

  • 適配器中 data item(數據子項) 的位置。

Position 從大的方向可以分為兩種情況:

  1. 方法 onBindViewHolder() 中的參數 position
  2. 通過 ViewHoldergetLayoutPosition()/getAdapterPosition() 方法得到的 layout position/adapter position

對于第一種 positon,我們通常使用它來得到子視圖,舉個例子:

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {// 通過 position 獲取 DataSet 數據集(如數組等)中對應的子項 DateDate date = DataSet.get(position);
}

對于第二種

layout position 和 adapter position

ListView 不同, RecyclerView 將 跟蹤 Adapter 的工作從 RecyclerView.LayoutManager 中抽離,交給 RecyclerView.Adapter 類。ListView 是沒有 “ListView.Adapter” 的,ListView 中需要用到適配器的時候,都是自定義一個 BaseAdapter類 的子類,而 RecyclerView 已經為開發者封裝好了 RecyclerView.Adapter ,如此一來 RecyclerView 便能夠在更新布局期間對 data set(數據集)進行批處理(等待數據修改完成再傳遞給布局,此等待時間小于 16 毫秒)。這可以將 LayoutManager 從跟蹤 Adapter 的工作中解脫出來,而去負責 calculate animations(更新界面)的工作。這有助于提高性能,因為所有 view bindings(視圖綁定) 都同時發生,并且避免了不必要的綁定。

不過這種抽象方式導致了在 RecyclerView 中有兩種與 位置 相關的方法:

  • layout position: 在最近一次布局更新后 view item 在布局中的位置,這個位置是站在 LayoutManager 的角度得到的 view 的位置,也是布局更新后用戶直觀看到的布局。通過 getLayoutPosition() 得到。
  • adapter position: ViewHolder item 在適配器中的位置,這是站在 Adapter 的角度得到的 ViewHolder 所在的位置,通常是用戶單擊某個 ViewHolder item 時,詢問 Adapter 得到的。通過 getAdapterPosition() 得到。

當適配器內容改變時,并且調用 adapter.notify*方法 從 RecyclerView 請求一個新的布局。從那一刻起,新布局更新完成(此時間小于 16 毫秒),兩個 position 可能不匹配,因為布局還沒有反映適配器的變化。除此之外,這兩個 position 在大多數時候是相等的。

getAdapterPosition() 使用時的注意事項:

  • 由于調用 notifyDataSetChanged() 會使所有內容無效,因此 RecyclerView 在更新下一個布局之前不知道 ViewHolderadapter position。在這種情況下,getAdapterPosition() 將返回 RecyclerView#NO_POSITION( -1)

  • 但是假設調用了 notifyItemInserted(0) ,先前 adapter position = 0ViewHolder 調用 getAdapterPosition() 將立即返回 adapter position = 1。因此,只要是對 granular (最小粒度,指單元子項)調用 notify events (應該指的是 notifyItem* 方法),那么即使布局尚未更新完成,也能立刻獲得 adapter position

  • 如果用戶點擊時 getAdapterPosition() 返回 NO_POSITION,那么最好忽略那個點擊,因為不知道用戶點擊了什么(除非有一些其他的機制能夠確認被點擊的是什么,例如用于查找單元子項的穩定ID)。


四級緩存

緩存級別詳細描述
一級緩存 mAttachedScrap/mChangedScrap緩存屏幕可見范圍的 ViewHolder
二級緩存 mCachedViews按 child View 的 position 或 id 緩存滑動時即將與 RecyclerView 分離的 ViewHolder。
三級緩存 mViewCacheExtension開發者自行實現的緩存。
四級緩存 mRecyclerPoolViewHolder緩存池,本質上是一個 android.util.SparseArray,其中 key 是 ViewType(int類型),value 存放的是 ArrayList< ViewHolder> ,默認每個 ArrayList 中最多存放5個 ViewHolder。

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

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

相關文章

Linux學習:第一章-Linux簡介

一 UNIX發展史1 1965年&#xff0c;美國麻省理工學院&#xff08;MIT&#xff09;、通用電氣公司&#xff08;GE&#xff09;及AT&T的貝爾實驗室聯合開發Multics工程計劃&#xff0c;其目標是開發一種交互式的具有多道程序處理能力的分時操作系統&#xff0c;但因Multics追…

尼爾機器人技能快捷鍵_《尼爾機械紀元》連招操作技巧

《尼爾機械紀元》中的每個角色都可以裝備一個輕武器和一個重武器&#xff0c;技能招式也很豐富&#xff0c;下面為大家帶來了《尼爾機械紀元》連招操作技巧&#xff0c;希望對你們有所幫助。連擊技能展示視頻視頻原址&#xff1a;點擊進入基本沒有什么太難的連段&#xff0c;只…

保姆級教學!Xcode 配置 OpenGL 環境

文章目錄GLFW獲取 GLFWGLAD獲取 GLAD在 Xcode 中配置下載好的 GLFW 和 GLAD配置流程檢測是否配置成功無關配置的題外話——Xcode 下安全的刪除移動操作GLFW Graphics Library Framework&#xff08;圖形庫框架&#xff09;&#xff0c;可以讓我們通過其封裝好的 通用API 來正確…

Android入門(17)| 百度提供的 Android定位SDK

文章目錄配置百度提供的 Android定位SDK用于發布的 SHA1用于測試的 SHA1使用百度定位實例配置百度提供的 Android定位SDK 詳情參見官方文檔&#xff0c;這里僅對獲取 SHA1 做詳細介紹&#xff1a; 用于發布的 SHA1 用于測試的 SHA1 使用百度定位實例 public class LocationAc…

ios 不被遮擋 陰影_為何你沒見到日環食?你不知道的天象常識原來還有這么多 | 返樸...

關注風云之聲提升思維層次導讀說好的日環食呢&#xff0c;為什么上周很多人只等到了日偏食?日食月食的時間和種類是怎么預測的?你真的弄懂了各種日食和月食的成因嗎&#xff1f;你了解它們有什么區別和聯系&#xff0c;又遵循什么樣的時間規律嗎? 日食和月食發生的頻率一樣嗎…

初識貝塞爾(bezier)曲線

文章目錄資料援引貝塞爾曲線的用途一階貝塞爾&#xff08;bezier&#xff09;曲線二階貝塞爾&#xff08;bezier&#xff09;曲線三階貝塞爾&#xff08;bezier&#xff09;曲線高階貝塞爾&#xff08;bezier&#xff09;曲線三階貝塞爾曲線求插值&#xff08;Slerp&#xff09…

python代碼測試 vim_用 Hypothesis 快速測試你的 Python 代碼

點擊上方“Python編程時光”&#xff0c;選擇“加為星標”第一時間關注Python技術干貨&#xff01;介紹無論你使用哪種編程語言或框架&#xff0c;測試都非常重要。Hypothesis是 Python 的一個高級測試庫。它允許編寫測試用例時參數化&#xff0c;然后生成使測試失敗的簡單易懂…

Mac 下 CMake 的配置與使用

文章目錄安裝與配置編譯單個源文件編譯前的準備開始編譯編譯多個源文件多個源文件在同一目錄下多個源文件在不同目錄下math 目錄下的 CMakeLists.txt根目錄的 CMakeLists.txtoption 選項導入外部庫本地導入&#xff08;find_package&#xff09;外部導入&#xff08;FetchConte…

五軸編程_沙井萬豐數控數控編程五軸編程那個軟件好用

沙井萬豐數控數控編程五軸編程那個軟件好用設計需要掌握很高很全面的知識和技能&#xff0c;模具做的好&#xff0c;產品質量好&#xff0c;模具結構合理&#xff0c;生產效率高&#xff0c;工廠效益好。正因如此&#xff0c;模具技術工在外打工的工資都非常的高。少則每月幾千…

Linux學習:第二章-Linux安裝

一虛擬機使用 VMware主要特點&#xff1a; 1、不需要分區或重新開機就能在同一臺PC上使用兩種以上的操作系統 2、本機系統可以與虛擬機系統網絡通信 3、可以設定并且隨時修改虛擬機操作系統的硬件環境 二安裝方式 圖形安裝&#xff1a;直接回車 字符安裝&#xff1a;linux tex…

keil3如何放大字體_國潮海報不會做?送你國風字體+圖案筆刷+PSD素材+包裝樣機...

有很多朋友都問帶魚&#xff0c;國潮風的海報到底應該怎么做呢&#xff1f;首先你要知道什么是國潮風&#xff1a;國潮風就是現代文化和古代文化的碰撞&#xff0c;是年輕人的態度&#xff01;那么應該如何構圖如何設計呢&#xff1f;如何配色如何搭配字體呢&#xff1f;這些方…

Google 開源項目風格指南學習筆記——C++篇

文章目錄前言0. 縮寫名詞解釋1. 頭文件1.1. Self-contained 頭文件1.2. 頭文件保護1.3. 前置聲明1.4 內聯函數1.5. #include 的路徑及順序2. 作用域2.1. 命名空間2.2. 非成員函數、靜態成員函數和全局函數2.3. 局部變量2.4. 靜態和全局變量3. 類3.1. 構造函數的職責3.2. 隱式類…

hiveserver2啟動不起來_給愛車配個充電寶,70邁汽車應急啟動電源,讓你遠離搭電小廣告...

說到汽車應急啟動其實我有切身的痛&#xff0c;在哈爾濱零下35的嚴冬&#xff0c;晚上帶著女神吃完飯&#xff0c;高高興興地吃完以后一上車&#xff0c;發現電瓶被凍沒電了&#xff0c;天知道當時有多尷尬。馬上叫了保險公司過來給搭電&#xff0c;結果在飯店從晚上8點一直等到…

Windows 下 VS 配置 OpenGL 環境

文章目錄前言獲取 GLFW打開 VS前言 感謝B站同學搬運YouTube上的教學視頻。 獲取 GLFW 從官網上下載GLFW macOS下64位二進制文件 打開 VS 新建解決方案 OpenGL test&#xff0c;并在解決方案中新建文件夾 Dependencies&#xff1a; 從下載好的 glfw 文件夾中找到最新版鏈接…

ubuntu 網卡雙網口 配置_無線網卡m2 ngff keya keye、minipcie接口改轉多口有線網卡實現軟路...

小型主板及筆記本中的無線網卡m2ngffkeyakeye接口&#xff08;CNVI除外&#xff09;通過m2ngffkeyae轉接pcie1x轉接板&#xff0c;或者無線網卡的minipcie接口&#xff0c;通過minipcie轉接pcie1x轉接板可以改裝有線網卡板卡&#xff0c;來實現軟路由功能。m2ngffkeyae轉接pcie…

OpenGL | 通過繪制一個三角形來入門 OpenGL 圖形渲染管線

文章目錄前言什么是 OpenGl &#xff1f;回顧openGL 的 Object顯存結構工作階段通過頂點緩沖對象將頂點數據初始化至緩沖中標準化設備坐標頂點緩沖對象 VBOglGenBuffersglBindBufferglBufferData建立了一個頂點和一個片段著色器著色器是什么&#xff1f;為什么需要使用著色器&a…

javascript特效_如何在網頁添加鼠標點擊特效

經常有同學問我怎么做到的&#xff0c;本論壇屬于DZ當然用的是插件啦。偶然在網上找到一個關于wordpress的特效代碼&#xff0c;分享給大家。WordPress 添加鼠標點擊特效實際上這種教程在網上搜索一下有一大堆&#xff0c;已經是各大博主玩爛的東西了。不過既然給自己的博客加上…

Android |雙鎖單例模式中使用Context如何避免內存泄露的 Warning 提示

文章目錄問題解決方法拓展問題 在Android開發中&#xff0c;經常會將工具類以單例模式的方法實現&#xff0c;而工具類中又總不可避免的用到 Context &#xff0c;例如&#xff1a; public class MySingleton {private static volatile MySingleton instance;private final C…

android nio debug模式正常 release包crash_Flutter包大小治理上的探索與實踐

Flutter作為一種全新的響應式、跨平臺、高性能的移動開發框架&#xff0c;在性能、穩定性和多端體驗一致上都有著較好的表現&#xff0c;自開源以來&#xff0c;已經受到越來越多開發者的喜愛。但是&#xff0c;Flutter的引入往往帶來包體積的增大&#xff0c;給很多研發團隊帶…

Linux學習:第三章-Linux常用命令-1

提示符&#xff1a; [rootlocalhost ~]# [登錄用戶名主機名 當前所在目錄]提示符 ~家目錄 /root /home/aa 提示符&#xff1a; #超級用戶 $普通用戶 一 linux命令的格式1、命令 [選項] [參數]lslist顯示目錄下內容 ①命令名稱&#xff1a;ls 命令英文原意&#xff1a;list 命令…