2012-12-21 41 views
0

在自定義adapter中,如何知道我需要重新配置convertView還是不需要?如果它不爲空,我需要配置ConvertView屬性嗎?

public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { 
     imageView = (ImageView) mInflater.inflate(R.layout.avatar, parent, false); 

     // Should this 2 lines of code be here ? 
     User user = mUserList.getUserAt(position); 
     user.setAvatar(imageView); 
    } else { 
     imageView = (ImageView) convertView; 
    } 

    // or here ? 
    User user = mUserList.getUserAt(position); 
    user.setAvatar(imageView); 

    return imageView; 
} 

我認爲,如果它被回收,我也不會需要重置用戶的化身,但我經常看到的配置發生的if塊之外。這是爲什麼?

回答

2

我總是在if塊之外配置視圖。您在getView方法中獲得的這個convertView可能(並且很可能將會)由於之前調用getView而爲另一個用戶設置,因爲ListView的策略在屏幕離開時重用項目視圖。如果你沒有設置適當的頭像,那麼這個道具就會出錯。當然,你不需要重置獨立於背景等具體位置的屬性。

例如CursorAdapterseparates getView分爲兩部分:newView,執行充氣和(主要)位置無關的設置和bindView,分配實際的位置相關數據。

它也可能發生,你會得到完全一樣的觀點,你以前用於這個位置。當然,在這種情況下,您可以避免重置視圖,但您需要檢查此視圖中的數據是否有效。設置然後檢查視圖的tag是我認爲最明顯的解決方案。

2

它不是真正的循環,它只是意味着你需要以填補根據其新位置新數據的「回收」的看法。如果你不這樣做,這行將充滿舊數據,不再顯示在屏幕上,因爲你滾動了它的位置。

因此,在短期,你必須重新配置視圖與新的數據,每次getView()調用(if塊之外在你的代碼)。

1

你的問題只有在瞭解listview。

所以在這裏,我會讓你清楚它是如何工作的?

假設ListView中必須包含20項但當前屏幕可以容納(屏幕顯示)僅8項(列表中的項目,你的情況ImageView的)。

當列表視圖試圖獲得1----8th項目它會回報你convertView作爲null因爲沒有回收發生過的對象。

但是,當您嘗試滾動時,在我們的情況下(向上滾動!)。

the 1st element of the list will be recycled when go out of screen, and will be supplied as convertView for 9th item. 

以這種方式,listview必須僅管理第8個(在我們的情況下)以顯示任意數量的項目。

如果我們向下滾動病房,會發生相反的情況。

因此,轉換視圖(空與否)的基礎上,你要設計你的邏輯既可以創建和填寫或填寫。

希望這會幫助你。

相關問題