0

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

@Override

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

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

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

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()。每个列表项都会发生这种情况。恐怕这会导致性能问题。

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

4

2 回答 2

5

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

于 2013-05-14T19:13:56.427 回答
1

这是正常行为。有ListView许多内部优化来实际提高性能 - 其中之一是回收视图并仅显示实际在屏幕上的行。换句话说,ListView不能通过在适配器中渲染所有 x 个视图然后简单地将它们移入和移出屏幕来工作。相反,它会在显示视图时创建视图。这就是为什么当您在列表中的第 45 项上时,它仍然将这些行称为第 0 到第 7 项。ListView一次仅显示 7 或 8 个视图 - 即适合屏幕的视图 - 即使您的适配器包含许多更多的。当您的列表变得更长时,这会产生很大的不同,因为它使设备不必提前渲染每个视图。

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

于 2013-05-14T19:04:16.103 回答