我寫了自定義的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
這是反覆觀察,只有第一和最後一個條目的哈希碼是每次交換。什麼可能導致這種情況?
我猜這是用於ListView?如果是這種情況,那麼'ListView'回收現有視圖 - 這就是'convertView'的用途。如果'convertView'不是'null',那麼你需要用它來返回你的新'View'。 – Squonk 2012-01-12 08:52:46
是的,這是Listview。好的...這很棘手。這意味着,每次調用getView()時都應該調用setTag()。我只在convertView爲空時才這樣做!我想這是錯誤的。 – nayan 2012-01-12 09:03:49