2012-01-12 106 views
1

我寫了自定義的ContactListAdapter,它從ArrayAdapter擴展而來。我們假設列表只有三個元素。我打印getView()的每個調用中收到的View對象的位置和哈希碼。我觀察到視圖對象沒有正確返回。我在這裏做錯了什麼?Android:getView()不返回正確的視圖對象

private class ContactListAdapter extends ArrayAdapter<ContactItem> { 
... ... 
    @Override 
    public View getView(int aPosition, View aConvertView, ViewGroup aParent) { 
     Log.d(TAG, "Inside ContactListAdapter.getView()"); 
     if(aConvertView==null) { 
      Log.d(TAG, "ConvertView is null"); 
      // Inflate view... 
     } 
     Log.d(TAG, "Pos: " + aPosition + " View: " + aConvertView.hashCode()); 
     return aConvertView; 
    } 

這裏是最初的視圖創建日誌:

D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): ConvertView is null 
D/ContactsActivity( 759): Pos: 0 View: 1156974184 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): ConvertView is null 
D/ContactsActivity( 759): Pos: 1 View: 1157007416 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): ConvertView is null 
D/ContactsActivity( 759): Pos: 2 View: 1157027832 

,當我點擊第三個要素列表中的日誌(請注意如何第一和最後一個元素的哈希碼交換)。我的onClick方法只是使少數單位在各自的列表條目:

D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 0 View: 1157027832 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 1 View: 1157007416 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 2 View: 1156974184 

,當我點擊第二元素日誌:

D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 0 View: 1156974184 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 1 View: 1157007416 
D/ContactsActivity( 759): Inside ContactListAdapter.getView() 
D/ContactsActivity( 759): Pos: 2 View: 1157027832 

這是反覆觀察,只有第一和最後一個條目的哈希碼是每次交換。什麼可能導致這種情況?

+0

我猜這是用於ListView?如果是這種情況,那麼'ListView'回收現有視圖 - 這就是'convertView'的用途。如果'convertView'不是'null',那麼你需要用它來返回你的新'View'。 – Squonk 2012-01-12 08:52:46

+0

是的,這是Listview。好的...這很棘手。這意味着,每次調用getView()時都應該調用setTag()。我只在convertView爲空時才這樣做!我想這是錯誤的。 – nayan 2012-01-12 09:03:49

回答

3

convertView用於重新使用適配器視圖的視圖,因此當您顯示列表並假設您的屏幕一次可以顯示5行時,則對於創建5行視圖convertView將保持爲null,但是當您滾動你的適配器爲你的適配器視圖創建了新的視圖,所以,在列表中的第六個元素在位置1重用視圖。

+0

如果是這種情況,ViewHolder成語如何工作。例如,如果我想使用setTag()在視圖中存儲每個元素的單獨數據。 – nayan 2012-01-12 08:59:17

+0

通過ViewHolder我們可以在適配器視圖中獲得視圖的對象,併爲每個視圖設置新的值,因此它看起來像兩行都使用不同的視圖。 – jeet 2012-01-12 09:02:48

相關問題