2013-04-08 59 views
0

到目前爲止,我已經看到了使用BaseAdapterArrayAdapter<?>的應用程序的幾個示例。但我仍然不完全清楚爲什麼應該這樣。適當使用BaseAdapter類具體getView方法

第一個例子是從ArrayAdapter<?>延伸,此示例中的ListView使用的,以下是getView方法

@override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View row = convertView; 
    Holder holder = null; 

    // Holder represents the elements of the view to use 
    // Here are initialized 
    if(null == row) {    
     row = LayoutInflater.from(mContext).inflate(LAYOUT_ITEM_ID, parent, false);     

     holder = new Holder(); 
     holder.titleTextView = (TextView)row.findViewById(android.R.id.title);    

     row.setTag(holder); 
    } else { 
     holder = (Holder) row.getTag(); 
    }  

    // here do operations in holder variable example 
    holder.titleTextView.setText("Title " + position); 

    return row; 
} 

public static class Holder {   
    TextView titleTextView;  
} 

現在在第二個例子的發現,使用BaseAdapter上一個GridView這是getView方法

// create a new ImageView for each item referenced by the Adapter 
public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { // if it's not recycled, initialize some attributes 
     imageView = new ImageView(mContext); 
     imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setPadding(8, 8, 8, 8); 
    } else { 
     imageView = (ImageView) convertView; 
    } 

    imageView.setImageResource(mThumbIds[position]); 

    return imageView; 
} 

我的問題是:一個適當的使用適配器的情況是需要使用「持有人」靜態類,這是否會對應用程序的性能和兼容性上的多個設備有何影響(AP分鐘我8)。

回答

3

沒有必要使用持有者類;儘可能確保您重用convertView更重要,因爲這有顯着的速度提升。這就是說,使用持有者確實可以提供更好的性能,尤其是在顯示大量項目的情況下,因爲getView不會每次都膨脹xml。

這部影片中更詳細地解釋了這一點:http://www.youtube.com/watch?v=wDBM6wVEO70

+0

這也適用於GridView? – rkmax 2013-04-08 21:41:35

+0

是的。實際上,他們甚至在視頻中說他們的GridView和ListView幾乎完全相同 – Nek 2013-04-08 21:45:53

1

首先,我想向您指出這是谷歌在I/O '10舉行的World of ListView session。爲了更好地理解ListView機制以及爲什麼「ViewHolder/RowWrapper」模式可以顯着加快速度,值得觀看演示文稿(或通過pdf閱讀)。

基本上有兩種,以優化getView()邏輯主要成分:

  • 利用回收的意見(獲取傳遞到getView()convertView參數)
  • 最小化的(昂貴的)findViewById()電話

在第一個示例中,ViewHolder模式僅適用於在沒有可用循環視圖時膨脹行視圖 - 這很好。其次,它通過使用ViewHolder對象標記行來減少視圖查找次數,該對象充當之前已經檢索到的TextView的包裝。

你的第二個例子不是誇大行視圖,而是在運行時實例化它。它仍然檢查是否有可用的再利用視圖,並且如果可能的話使用這種視圖 - 再次,這很好。另外,由於行視圖(在這種情況下是網格視圖)只是一個ImageView,因此convertView可以簡單地轉換爲ImageView。請注意,如果行/網格視圖由組成,而不僅僅是單個視圖,則第一個片段中的ViewHolder方法將是適當的方法。

這就是說,由於第一個代碼片段中的行視圖也只是一個單獨的TextView,所以可能使用與第二個代碼片段中相同的casting-convertView方法進行簡化。很多時候,行視圖將由多個視圖組成,所以我建議始終使用ViewHolder模式,因爲這會爲您提供最大的靈活性以適應未來的變化。

相關問題