有一個簡單的問題,在搜索後我想問問爲什麼我們創建靜態持有者類併爲其分配視圖?請清除我的疑惑,這對我很有幫助。適配器類中的持有者類
回答
在滾動ListView
期間,您的代碼可能會頻繁地調用findViewById()
,這可能會降低性能。即使適配器返回回收的充氣視圖,您仍然需要查找元素並進行更新。圍繞重複使用findViewById()
的方式是使用設計模式。
A ViewHolder
對象將每個組件視圖存儲在Layout的標籤字段內,因此您可以立即訪問它們而無需重複查看它們。首先,您需要創建一個類來保存一組精確的視圖。
您可以閱讀Android Guideline瞭解更多詳情。
- 所以,當你使用「查看持有人」,那麼你可以很容易地訪問每個視圖,而無需查找,從而節省寶貴的處理器週期。
- 具有對意見
static inner class
極大地提高了性能
你還可以看到Why does Android prefer static classes鏈接。
一個更有趣的鏈接How ListView Work,閱讀這個博客開發者可以清除LisView的邏輯也是爲什麼需要實現內部靜態類的ListView之後。
這是一個優化點。沒有viewHolder,你需要每次調用findViewById方法。使用viewHolder,你只需要調用一次。
沒有ViewHolder:
if (convertView == null) { convertView = mInflater.inflate(..., null); } //Following called each time TextView tv = (TextView)convertView.findViewById(...); ImageView iv = (ImageView)convertView.findViewById(...); tv.setText(...)
隨着ViewHolder:
if (convertView == null) { convertView = mInflater.inflate(..., null); holder = new ViewHolder(); //called once holder.tv = (TextView) vi.findViewById(..); holder.iv = (ImageView) vi.findViewById(...); vi.setTag(holder); } else { holder = (ViewHolder) vi.getTag(); } holder.tv.setText(...)
答案也很簡單,如果你
與一個TextView和ImageView的例子瞭解如何一個AdapterView
的作品。
一個AdapterView
是一個視圖,其子視頻由Adapter
決定。 AdapterView
(更具體地說是具體的實施例,如ListView
)包含比任何給定時間顯示的更多信息。爲了優化內存消耗並且爲了性能,Adapter
通常重用代表單個項目的View
。因此,您的對象數量少於相應的數據。
重複使用的對象可能是複雜的層次結構View
s或ViewGroups
。因此,如果您想要在此層次結構中找到個別對象View
,則需要依賴findViewById()
方法,並且當視圖層次結構具有多個級別時,這會變得代價高昂。所以爲了簡單(也爲了提高性能),我們使用View-Holder模式,我們感興趣的單個對象被分配給一個靜態內部類。
有關View-Holder模式的更多信息,請參閱Lars Vogel的Android ListView and ListActivity - Tutorial。
- 1. 適配器模式:類適配器與對象適配器
- 2. 使用「高效適配器」時,持有者有時爲空
- 3. RecyclerView和java.lang.IndexOutOfBoundsException無效的視圖持有者適配器positionViewHolder
- 4. 如何從適配器類
- 5. Android - 持有者從recyclerView適配器項目位置返回null
- 6. Butterknife不適用於適配器類
- 7. C#:支持多種類型的數據庫表與適配器
- 8. VirtualBox的:英特爾適配器類型不受支持
- 9. 適配器類:嵌套在活動中?
- 10. 數據類中的適配器類vs toXXX()方法
- 11. Rails Mysql適配器試圖查詢沒有支持表的抽象模型類
- 12. 與紀錄保持者服裝適配器問題
- 13. ClickListener從適配器到其他類
- 14. setActivityForResult()在自定義適配器類
- 15. java類/接口適配器問題
- 16. 嵌套類適配器模式?
- 17. 數組pojo類與內部數組類的RecyclerView適配器
- 18. 適配器類是否使用Event類的方法?
- 19. 具有靜態類的適配器模式
- 20. 對象適配器模式和類適配器模式之間的區別
- 21. 如何獲取回調類中的視圖持有者項目
- 22. 如何在改裝的適配器類中傳遞該類型的json數據?
- 23. 創建通用類型適配器類不工作
- 24. 在適配器類以外的活動中定義RecyclerView的onCLickListener
- 25. 適配器堅持舊的ArrayList
- 26. C++類持有其他類
- 27. 得分忍者適配器API
- 28. 將RecyclerView適配器類中的JSON數組傳遞給活動類
- 29. 在listView自定義適配器中獲取父視圖支持者
- 30. 如何關閉適配器類中的導航抽屜
請幫我。 – user1537629 2012-07-19 11:16:00
您的問題是關於「靜態」限定符,還是一般的ViewHolder?您是否閱讀過文檔:http://developer.android.com/training/improving-layouts/smooth-scrolling.html – 2014-03-03 20:55:51