【问题标题】:Explanation of the getView() method of an ArrayAdapterArrayAdapter 的 getView() 方法说明
【发布时间】:2012-09-06 04:35:32
【问题描述】:

您能解释一下ArrayAdaptergetView() 方法吗?

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

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

我了解position 参数。就像他们说的,它暗示了请求查看的项目的位置。

convertView 来自哪里。我见过很多例子,他们检查convertView 是否为空。如果 is 为 null,它们会扩充行布局的新实例,填充并返回它。我想我也明白了这一点,但有一件事仍然让我感到困惑。通过convertView 参数传入的布局是什么。如果是the resource parameter that is passed in when initialising the ArrayAdapter?是getView() 返回的最后一个布局的缓存副本吗?

最后。 parent 参数有什么作用。我还没有看到太多使用这个的例子。他们中的大多数只是简单地重用/扩充行布局并将其返回。

(我问是因为我的ListView 中有一个点击动画。特别是this one that aims to replicate Spotify's dropdown quick action menu。我的动画有点迟钝。在诊断了这个问题一段时间后,我意识到这已经是因为我的getView() 方法需要一些时间才能完成,因为我在每次迭代中都会增加一个新的行布局。有人建议将行布局缓存在ViewHolder 中,而其他示例指向重用@ 987654339@ 参数,即仅当convertView 为空时才膨胀行布局。)

【问题讨论】:

    标签: java android android-listview android-arrayadapter android-adapter


    【解决方案1】:

    是 getView() 返回的最后一个布局的缓存副本吗?

    convertView 是离开屏幕的行的视图(因此它不是getView 方法返回的最后一个视图)。例如,首先显示列表,在这种情况下convertViewnull,之前没有构建任何行视图并离开屏幕。如果向下滚动,第 0 行将离开屏幕(不再可见),当这种情况发生时,ListView 可能会选择将该视图保留在缓存中以供以后使用(这是有道理的,因为 @ 的行987654326@ 通常具有相同的布局,只是数据不同)。将一些视图保留在缓存中并稍后使用它们的原因是因为getView 方法可能会被调用很多次(每次用户向上/向下滚动并且屏幕上出现新行时)。如果每次都需要重新创建行视图,这将导致创建大量对象,这是需要避免的。在您的getView 方法中,您将检查convertView 以查看它是否为null。如果是null,那么您必须构建一个新的行视图并用数据填充它,如果不是nullListView 为您提供了以前的视图。拥有这个先前的视图意味着您不需要构建新的行布局,而是您必须使用正确的数据填充它,因为该缓存视图仍然附加旧数据(您会看到很多关于 stackoverflow 的问题,用户会问为什么他们的ListView 的行在向下滚动时会重复)。

    父参数有什么作用。我没有看到太多的例子 利用这个。他们中的大多数只是简单地重用/膨胀行布局和 退货。

    它应该用于为新膨胀/构建的行获取正确的LayoutParams。例如,如果你对一个以RelativeLayout 为根的布局进行膨胀,并且你不使用parent 来获取LayoutParams,那么行布局可能会出现一些问题。考虑到父母,你会使用:

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

    【讨论】:

    • 这是一个非常好的答案!
    • 最佳答案 tnx
    【解决方案2】:

    我对@9​​87654321@ 的理解是,它本质上是被回收的视图,因为它们目前没有被使用——例如,你向下滚动列表,顶部的那些不在屏幕上,所以当你需要一个新的视图时,它们会被传递到这个参数中(这样你就不必创建一个全新的视图,同时让未使用的视图闲置)。 iOS 有一个类似的方法叫做dequeueReusableCellWithIdentifier。如果列表视图的每一行都具有相同的结构,则可以安全地将其转换为适当的类型并仅更新其中的信息 - 文本、图像等。它将是先前由 getView() 调用返回的视图相同的列表。

    我对@9​​87654324@ 的最佳猜测(诚然是猜测)是这个适配器的列表是其子视图。如果您需要上下文、访问资源系统、将信息传递到列表的父视图或从列表的父视图接收信息,它会为您提供返回渲染系统的路线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多