2011-08-12 201 views
3

我通過教程去搜查,但我仍然無法理解,Android的自定義列表視圖

getView(int position, View convertView, ViewGroup arg2) 

方法擴展BaseAdapter何時創建我的Android應用程序自定義的ListView是如何工作的。因此,我不能編輯我想要的自定義列表視圖。

我需要知道這個方法調用的時間和參數的含義。

如果有人可以解釋下面的方法它很棒。當你在你的代碼中調用setAdapter感謝

@Override 
public View getView(int position, View convertView, ViewGroup arg2) 
{ 

    ViewHolder holder; 
    LayoutInflater inflater = context.getLayoutInflater(); 

    if (convertView == null) 
    { 
     convertView = inflater.inflate(R.layout.listitem_row, null);      
     holder = new ViewHolder(); 
     holder.txtViewTitle = (TextView) convertView.findViewById(R.id.textView1); 
     holder.txtViewDescription = (TextView) convertView.findViewById(R.id.textView2); 

     convertView.setTag(holder); 
    } 
    else 
    { 
     holder = (ViewHolder) convertView.getTag();           
    } 

    holder.txtViewTitle.setText(title[position]); 
    holder.txtViewDescription.setText(description[position]); 



    return convertView; 
} 

回答

3

getView():正如在規範中提到的getView方法在指定的位置顯示數據。所以,當你設置適配器,當你滾動你的listView getView方法將被調用。

你在這裏複製的方法是EfficientAdapter的一部分,以優化您的ListView性能和優化您一起使用ViewHolder模式。

從規格複製:幾乎沒有更多的解釋

位置:該項目的適配器的數據集,我們希望其觀點的項目中的位置。

convertView:舊的視圖重用,如果可能的話。注意:在使用之前,您應該檢查此 視圖是否爲非空且類型適當。如果無法將此視圖轉換爲顯示正確的數據,則此方法可以創建新視圖。異構列表可以指定它們的視圖類型數量,因此這個視圖始終是正確的類型(請參閱getViewTypeCount()和getItemViewType(int))。

所以,在上面的方法中,當你正在做以下的事情時,你是重用你的convertView。

 if (convertView == null){ 
      .... 
      convertView.setTag(holder); 
    } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

並通過這樣你避免查找(findViewById)以後的事,那是什麼好東西約ViewHolder模式

 holder.txtViewTitle = (TextView) convertView.findViewById(R.id.textView1); 

:父,這種觀點最終會附加到

編輯

問題:調用getView多少次,並創建多少個convertView? 答:讓我們以Efficeint Adapter from ApiDemos爲例。如果你的屏幕顯示10行,那麼,

convertView計數:10 + 1 = 11(10行你在屏幕上看到的,一個額外的顯示滾動效果)。這意味着if(convertView == null){...}塊中的語句只會被調用11次。

getView計數:最初計數將爲10,但是當您開始滾動時,計數會繼續增加。每次調用getView來更新數據。

注意:這僅適用於問題中提到的getView方法。

+0

是的,但是當我使用此方法將項目加載到listview中時,getView()方法運行的元素數量是顯示。我無法理解爲什麼...... – JibW

+0

並且在它第一次創建convertView = inflater.inflate(R.layout.listitem_row,null)的同時,當它加載項時,它會運行多次。你能解釋一下爲什麼? – JibW

+0

@JibW當然,這取決於你在屏幕上可以看到多少行。假設你只看到3行,這意味着ListView只需要顯示3個convertView,當你滾動它們時,這3個將被重用。因爲你一次沒有在屏幕上顯示更多的內容。這就是爲什麼getView會被調用3次。嘗試HierarchyViewer它將幫助你更多地瞭解ConvertViews的數量。希望這個回答你的問題...如果不能ping我...我會很樂意幫助你。 – Gopal

4

getView()被調用。在此之後,當您將焦點移至列表或選擇任何項目或致電notifyDataSetChanged()時,您將撥打電話getView()

Position - 該項目在適配器的數據集中的位置,該項目的數據集的視圖是我們想要的。

convertView - 舊的視圖重用,如果可能的話。注意:你應該在使用之前檢查這個視圖是非空的並且是合適的類型。如果無法將此視圖轉換爲顯示正確的數據,則此方法可以創建新視圖。異構列表可以指定其視圖類型的數量,以便此視圖始終爲正確的類型

ViewGroup - 該視圖最終將附加到該視圖。

+0

嗨vineetska感謝您的答案。在我的代碼中,當我想加載這個列表時,getView()方法調用列表視圖中記錄數的三倍。我通過創建一個日誌檢查它..不明白爲什麼這是如此 – JibW

+0

使用「LayoutInflater inflater =(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);」在內部如果在getView()中代替「LayoutInflater inflater = context.getLayoutInflater(); 」 –

+0

仍然是這樣。使用這種方法有點混亂..無法真正找出執行次數。執行此方法的次數是記錄的三倍(當列表中顯示2個listview記錄時,此方法運行6次) – JibW

2

這裏是getView()參數的描述:

int position - 的視圖中的列表中的位置;

View convertView - 恕我直言,這是理解最困難的參數。在列表工作開始時,convertView = null。但是當你開始向下滾動時,當一個列表項(它是View的實例)被隱藏時,它將被存儲在內存中,如convertView。這個技巧可以讓你當你將列表滾動回,但使用存儲在內存中的convertView時不創建新項目。因此,成爲convertView的列表中的第一項是0位置處的項目。請記住,當您向下滾動ListView(從0位置到更大)時,如果向上滾動ListView,則convertView位於頂部和底部。

ViewGroup arg2 - 這是你的ListView(這個類來源於ViewGroup)。

ViewHolder是一種模式,它可以與列表項目進行舒適的通信。您將此對象作爲項目的標記,並可用於與列表項目間接交互,因爲它引用了項目的字段(View.setTag(holder))。

每次Android需要繪製另一個列表項時,都會調用getView()方法。

有任何問題嗎?

+0

感謝teoREtik .. 。當我使用這種方法將項目加載到listview中時,getView()方法運行三次要顯示的元素數量。(例如getView()方法運行6次,如果它必須加載2個元素到列表視圖),我不知道爲什麼........也創建convertView = inflater.inflate(R.layout.listitem_row, null),通過檢查convertview == null,它在將元素加載到列表視圖中時運行多次 – JibW