Android:getView()不返回正确的View对象

时间:2012-01-12 08:45:55

标签: android android-arrayadapter

我编写了自定义的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

重复观察,每次只交换第一个和最后一个条目的哈希码。可能导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:3)

convertView用于重用适配器视图的视图,因此当您显示一个列表并假设您的屏幕一次可以显示5行时,那么为了创建5行视图,convertView将保持为null,但是当您向下滚动时,适配器为适配器视图创建新视图,因此,列表重用视图中的第六个元素位于第1位。