我编写了自定义的ContactListAdapter,它从ArrayAdapter扩展而来。我们假设列表只有三个元素。我打印getView()的每次调用中收到的View对象的位置和哈希码。我观察到视图对象未正确返回。我在这里做错了吗?
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 :(得分:3)
convertView用于重用适配器视图的视图,因此当您显示一个列表并假设您的屏幕一次可以显示5行时,那么为了创建5行视图,convertView将保持为null,但是当您向下滚动时,适配器为适配器视图创建新视图,因此,列表重用视图中的第六个元素位于第1位。