Android:getView()未返回正确的视图对象

Android:getView()未返回正确的视图对象,android,android-arrayadapter,Android,Android Arrayadapter,我已经编写了自定义ContactListAdapter,它从ArrayAdapter扩展而来。让我们假设这个列表只有三个元素。我正在打印每次调用getView()时收到的View对象的位置和哈希代码。我注意到视图对象没有正确返回。我做错什么了吗 private class ContactListAdapter extends ArrayAdapter<ContactItem> { ... ... @Override public View getView(int aP

我已经编写了自定义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;
    }
并在单击列表中的第三个元素时记录(注意第一个元素和最后一个元素的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