ArrayAdapter的getView()方法解释

21

能否解释一下 ArrayAdaptergetView() 方法。

我看了文档,它有三个参数:

  • position: 要查找其视图的项目在适配器数据集中的位置。
  • convertView: 如果可能的话要重用的旧视图。注意: 使用之前应检查此视图非空并且类型合适。如果无法将此视图转换为显示正确数据,则此方法可以创建新视图。
    异构列表可以指定其视图类型的数量,以便此视图始终为正确类型(请参阅 getViewTypeCount() 和 getItemViewType(int))。
  • parent: 此视图最终将附加到的父级

我理解了 position 参数,就像他们说的那样,它只是被请求的视图的项的位置。

convertView 是从哪里来的呢?我看过许多示例,其中检查 convertView 是否为空。如果为空,它们会膨胀一个新的行布局实例,填充它并返回它。我想我已经理解了这一点,但仍然有一件事让我感到困惑。通过 convertView 参数传入的布局是什么?它是在初始化 ArrayAdapter 时传入的 resource 参数吗?它是由上一个调用 getView() 返回的布局的缓存副本吗?

最后,parent 参数是做什么的。我还没有看到太多利用它的示例。大多数示例只是重用/膨胀行布局并返回它。

我提出这个问题是因为我的 ListView 中有一个点击动画。具体来说,这是 一个旨在复制 Spotify 下拉式快速操作菜单的动画。我的动画有点卡顿。经过一段时间的诊断后,我意识到这是由于我的 getView() 方法需要一些时间来完成,因为我在每次迭代中都会充气一个新的行布局。有人建议在 ViewHolder 中缓存行布局,而其他示例则指向重用 convertView 参数,即仅在 convertView 为空时充气行布局。

2个回答

44

parent.inflate(R.layout.my_row_layout, parent, false);

The parent parameter in the inflate method should be used to get the correct layout parameters for the newly inflated/built row to avoid any potential problems with the row layout.

convertView = getLayoutInflater().inflate(R.layout.row_layout, parent, false);

2
我的理解是,convertView 实际上是已经被回收利用的视图,因为它们目前没有使用 - 例如,你向下滚动列表,顶部的视图不在屏幕上,所以它们被传递到这个参数中,在需要新视图时使用(这样你就不必创建一个全新的视图,同时保留未使用的视图空闲)。iOS 有一个类似的方法叫做 dequeueReusableCellWithIdentifier。如果您的 ListView 的每一行具有相同的结构,则将其安全地转换为适当的类型并只更新其中的信息 - 文本、图片等。它将是之前由 getView() 调用返回的 View,用于同一列表。
对于 parent,我的最佳猜测(确实只是猜测)是它是此适配器列表的父级视图。如果需要上下文、访问资源系统、向列表的父视图传递信息或接收信息,则可以通过它返回到渲染系统。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接