ListView适配器getView()获取错误的项目

时间:2013-05-14 18:56:04

标签: android android-listview

我有一个ListView,我输入以下代码来查看我的BaseAdapter的getView()过程。

@Override

public View getView(int position, View convertView, ViewGroup parent) {

    Log.d("getView()","Fetching Row: " + position);
    ...
}

当我慢慢向下滚动列表时,我注意到发生了一些奇怪的事情。即使我在列表位置40-50ish,它仍然调用getView()的位置为0-7。这是我的日志的样子:

05-14 11:46:13.989: I/getView()(18681): Fetching Row: 45
05-14 11:46:14.039: I/getView()(18681): Fetching Row: 0
05-14 11:46:14.049: I/getView()(18681): Fetching Row: 1
05-14 11:46:14.049: I/getView()(18681): Fetching Row: 2
05-14 11:46:14.049: I/getView()(18681): Fetching Row: 3
05-14 11:46:14.059: I/getView()(18681): Fetching Row: 4
05-14 11:46:14.059: I/getView()(18681): Fetching Row: 5
05-14 11:46:14.059: I/getView()(18681): Fetching Row: 6
05-14 11:46:14.069: I/getView()(18681): Fetching Row: 7
05-14 11:46:14.320: I/getView()(18681): Fetching Row: 46
05-14 11:46:14.430: I/getView()(18681): Fetching Row: 0
05-14 11:46:14.430: I/getView()(18681): Fetching Row: 1
05-14 11:46:14.430: I/getView()(18681): Fetching Row: 2
05-14 11:46:14.430: I/getView()(18681): Fetching Row: 3
05-14 11:46:14.430: I/getView()(18681): Fetching Row: 4
05-14 11:46:14.430: I/getView()(18681): Fetching Row: 5
05-14 11:46:14.430: I/getView()(18681): Fetching Row: 6
05-14 11:46:14.430: I/getView()(18681): Fetching Row: 7

如您所见,在第45行和第46行之间,每次都会调用行0-7的getView()。每个列表项都会发生这种情况。我担心这会导致性能问题。

为什么会这样?这是正常行为吗?

2 个答案:

答案 0 :(得分:5)

在listview xml中,将layout_height更改为android:layout_height="match_parent"

答案 1 :(得分:1)

这是正常行为。 ListView有许多内部优化来实际提高性能 - 其中之一是回收视图并仅显示实际在屏幕上的行。换句话说,ListView无法通过在适配器中呈现所有x个视图,然后只是在屏幕上移动它们。相反,它会在显示时创建视图。这就是为什么当您在列表中的第45项时它仍然将这些行称为项目0到7. ListView一次只显示7或8个视图 - 即什么适合屏幕 - 即使您的适配器包含更多。这会使您的列表变得更长,因为它可以使设备免于提前渲染每个视图。

因为获得其中一个视图比仅仅使用getView()稍微复杂一点,因为根据列表的长度,它很可能不存在。