簡體   English   中英

了解RecyclerView.ViewHolder

[英]Understanding RecyclerView.ViewHolder

我很難理解視圖持有者的工作,這里有一些問題可以增加我對視圖持有者的理解:

據說oncreateViewHolder返回viewholder對象,viewholder對象是什么包含單行中的所有視圖? 如果有1000個項目的列表將創建多少個viewobjects?

我的理解:如果我們正在創建viewholder對象,它包含findviewbyid之類的視圖引用,因為findviewbyid是擴展操作,所以通過viewholder我們可以創建單個viewholder對象並通過設置圖像或文本來重用(在onBindView中發生)。

但onCreateViewHolder多次運行,因此findviewbyid也會執行多次,是不是性能問題?

它與簡單列表視圖的基本適配器的convertView有何不同

謝謝!

查看持有者它是幫助你減少id調用查找視圖的東西。 讓我們舉個例子。

假設您有1k個項目,每個項目都需要通過id找到5個視圖,並且在屏幕上只能顯示5個完整項目。

因此,recyclerView將創建7個(5 +一個不完整底部和一個不完整頂部)視圖持有者。 下次循環recyclelerView時,它將使用現有的 viewHolders。 正如名字所說:“ Recycler View”

所以findViewById將被稱為7 * 5 = 35次。 如果您不使用viewHolder,您將獲得5 * 1000 = 5000次呼叫。

35 vs 5000,所以你理解我的想法。

據說oncreateViewHolder返回viewholder對象,viewholder對象是什么包含單行中的所有視圖? 如果有1000個項目的列表將創建多少個viewobjects?

一個視圖行的一個ViewHolder對象。 每次調用onCreateViewHolder時都會創建一個ViewHolder對象。 它是根據設備中可見項的數量調用的。 即使您有100個項目,如果有10個項目可見,onCreateViewHolder將被調用10次,並且將有10個ViewHolders。 (基於RecyclerView優化可能有一個或兩個額外項目,因為如果滾動列表,則下一個項目應立即可見)

我的理解:如果我們正在創建viewholder對象,它包含findviewbyid之類的視圖引用,因為findviewbyid是擴展操作,所以通過viewholder我們可以創建單個viewholder對象並通過設置圖像或文本來重用(在onBindView中發生)。

RecyclerView已經在回收和重用View和相應的ViewHolders。 隨時出現的ViewHolder(和View)數量取決於屏幕上可見項目的數量。

但onCreateViewHolder多次運行,因此findviewbyid也會執行多次,是不是性能問題?

如前所述,此次調用的次數僅適用於可見項目的數量。 滾動時,將重復使用視圖和視圖。 每行都有不同的視圖。 因此每行都會有不同的ViewHolder。

它與簡單列表視圖的基本適配器的convertView有何不同

在ListView中,convertView是舊視圖,它提供了在滾動列表時為新行重用相同視圖的選項。 但它是可選的,因為開發人員可能根本不使用convertView。 在RecyclerView中,重復使用舊視圖是自動完成的。

RecyclerView.ViewHolder是一個幫助類,它包含一行或多行的視圖。 為每個viewType創建一個或多個ViewHolder。

如果多個行具有相同的ViewType,則可以為多個行重用相同的View。

覆蓋getItemViewType(int position)是獲得多種視圖類型的方法。 如果getItemViewType在viewType之前返回未使用的內容,則將調用onCreateViewHolder以創建新的ViewHolder。

適配器onBindViewHolder是用每行的特定數據填充視圖的地方。

添加:

一個概念必須明確:使ViewHolder重用的原因是它共享相同的viewType。 相反,如果你使getItemViewType(int position)為每一行返回一個不同的值,那么每一行都將擁有其獨立的ViewHolder和view。

假設您要顯示1000個項目的列表,並且屏幕上的用戶只能看到10個項目。 您的適配器創建10個ViewHolder實例以同時顯示它們。 當用戶滾動並且適配器必須顯示更多項目時,它不再創建ViewHolder的新實例,而是重用不再可見的項目。 您的適配器會阻止創建新視圖並節省CPU時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM