【问题标题】:GetView method and convertView misconception?GetView 方法和 convertView 的误解?
【发布时间】:2012-08-08 14:57:07
【问题描述】:

我已多次阅读有关 GetView DataAdapter 类的 android 文档。据我了解,如果我有一个同质列表,其中每个项目都只是一个文本视图,并且所有项目都落在屏幕内(不可能滚动),则不会有任何视图回收,所以我应该收到 4 次调用 GetView convertView 为空。好吧,这不是发生在我身上的事情。第一次 convertView 为空,但其他 3 个创建的项目相同。列表已正确填充,但我想了解为什么会发生这种情况。如果有人可以提供帮助,我将非常感激。

【问题讨论】:

标签: android android-layout


【解决方案1】:

我相信 Android 总是会尝试回收视图,因为这会使填充速度最快。是否所有视图都适合列表的可见视口并不重要。膨胀/创建视图非常昂贵,这就是 Android 想要尽可能多地回收利用的原因。

您可以保证传递给 GetView 的视图将具有相同的视图类型(在数据适配器中定义)或为空。如果为 null,则需要为该视图类型创建一个新视图,否则应尝试重用传入的视图。对于 TextView 的同构列表,这很简单:

if (convertView == null)
{
    TextView tv = new TextView();
    ....
    tv.setText("First Item");
}
else
{
    TextView tv = (TextView) convertView;
    ...
    tv.setText("Recycled Item");
}

为简单起见,您总是可以返回一个新视图而不是使用 convertView,但性能不会那么好。

【讨论】:

  • 没错,这是基于getItemViewType()返回的值
  • 那么,为什么我会在列表中显示 4 个不同的文本?如果它总是首先创建回收,难道我不会改变原始视图的文本等等,有一个包含 4 个项目的列表,并引用相同的视图吗?我有点搞砸了。
  • Android 在其底层保存的视图引用数不等于列表中的项目数。一旦你将 View 引用返回给 Android,你就不应该再考虑它了。 Android 将负责 View 引用的生命周期。它可能只是将 View 呈现为位图,然后由于它不需要 View 对象,因此将其返回以供回收。或者它可能会快速复制它持有一段时间的视图。如果您对它的工作原理感到好奇,请查看 Android 源代码。我敢打赌这很有趣。
  • @Notbad 你仍然可以向他们添加onClickListener()。最简单的方法是使用ListView.setOnItemClickListener(),但您也可以通过在每个 TextView 上设置一个侦听器来实现,然后在 getView() 方法中返回它。
  • @Notbad,蒂姆是正确的。这应该适用于回收。如果您在这个问题中发布您的代码,我们可以查看它并可能诊断出问题所在。
猜你喜欢
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
相关资源
最近更新 更多