【问题标题】:ListView adapter getView() getting wrong itemListView 适配器 getView() 获取错误项目
【发布时间】:2013-05-14 18:56:04
【问题描述】:

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

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

【问题讨论】:

    标签: android android-listview


    【解决方案1】:

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

    【讨论】:

    • 哇,没想到这么简单。感谢您的解决方案!你知道为什么设置 android:layout_height="wrap_content" 会导致列表视图这样做吗?
    • 由于 wrap_content,布局每次都会重新计算。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 2011-10-28
      相关资源
      最近更新 更多