2012-07-19 48 views
8

有一個簡單的問題,在搜索後我想問問爲什麼我們創建靜態持有者類併爲其分配視圖?請清除我的疑惑,這對我很有幫助。適配器類中的持有者類

+0

請幫我。 – user1537629 2012-07-19 11:16:00

+0

您的問題是關於「靜態」限定符,還是一般的ViewHolder?您是否閱讀過文檔:http://developer.android.com/training/improving-layouts/smooth-scrolling.html – 2014-03-03 20:55:51

回答

7

在滾動ListView期間,您的代碼可能會頻繁地調用findViewById(),這可能會降低性能。即使適配器返回回收的充氣視圖,您仍然需要查找元素並進行更新。圍繞重複使用findViewById()的方式是使用設計模式。

A ViewHolder對象將每個組件視圖存儲在Layout的標籤字段內,因此您可以立即訪問它們而無需重複查看它們。首先,您需要創建一個類來保存一組精確的視圖。

您可以閱讀Android Guideline瞭解更多詳情。

  1. 所以,當你使用「查看持有人」,那麼你可以很容易地訪問每個視圖,而無需查找,從而節省寶貴的處理器週期。
  2. 具有對意見static inner class極大地提高了性能

你還可以看到Why does Android prefer static classes鏈接。

一個更有趣的鏈接How ListView Work,閱讀這個博客開發者可以清除LisView的邏輯也是爲什麼需要實現內部靜態類的ListView之後。

1

這是一個優化點。沒有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(...) 
    
2

答案也很簡單,如果你

與一個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

相關問題