Android:getView()未返回正确的视图对象
我已经编写了自定义ContactListAdapter,它从ArrayAdapter扩展而来。让我们假设这个列表只有三个元素。我正在打印每次调用getView()时收到的View对象的位置和哈希代码。我注意到视图对象没有正确返回。我做错什么了吗Android:getView()未返回正确的视图对象,android,android-arrayadapter,Android,Android Arrayadapter,我已经编写了自定义ContactListAdapter,它从ArrayAdapter扩展而来。让我们假设这个列表只有三个元素。我正在打印每次调用getView()时收到的View对象的位置和哈希代码。我注意到视图对象没有正确返回。我做错什么了吗 private class ContactListAdapter extends ArrayAdapter<ContactItem> { ... ... @Override public View getView(int aP
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;
}
并在单击列表中的第三个元素时记录(注意第一个元素和最后一个元素的hashcode是如何交换的)。我的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
这是反复观察的,每次只交换第一个和最后一个条目的hashcode。可能是什么原因造成的?convertView用于重用适配器视图的视图,因此当您显示列表并假设屏幕一次可以显示5行时,如果要在5行中创建视图,convertView将保持空值,但当您向下滚动时,适配器会为适配器视图创建新视图,因此,列表重用视图中第六个元素位于位置1。我猜这是针对
列表视图的。
?如果是这种情况,那么ListView
将回收现有视图-这就是convertView
的作用。如果convertView
不是null
,则需要使用它返回新的视图。是的,这是Listview。好吧,这很棘手。也就是说,每次调用getView()时,我都应该调用setTag()。我只是在convertView为空时才这么做!!我想这是个错误。如果是这样的话,那么ViewHolder成语是如何工作的。例如,如果我想使用setTag()在视图中为每个元素存储单独的数据。通过ViewHolder,我们可以在adapter视图中获取视图的视图对象,并为每个视图设置新值,因此看起来两行使用的是不同的视图。
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