ArrayAdapter的getView()方法的说明

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

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

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

我理解position参数。 就像他们说的那样,这意味着该项目的位置,已经请求了视图。

convertView来自哪里。 我见过很多例子,他们检查convertView是否为null。 如果is为null,则会为行布局的新实例充气,填充并返回它。 我想我也已经知道了这一点,但还有一件事让我感到困惑。 通过convertViewparameter passing的布局是什么。 是否在初始化ArrayAdapter时传入的resource参数 ? 是getView()返回的最后一个布局的缓存副本?

最后。 parent参数的作用是什么。 我没有看到太多利用它的例子。 他们中的大多数只是重复/膨胀行布局并返回它。

(我问,因为我的ListView有一个点击animation。特别是这个旨在复制Spotify的下拉快速操作菜单 。我的animation有点迟钝。在诊断了这个问题一段时间之后,我意识到这是因为我的getView()方法需要花费一些时间才能完成,因为我在每次迭代中都在为一个新的行布局进行膨胀。有人建议在ViewHolder缓存行布局,而其他示例则指向重用convertView参数,即如果convertView为null,则仅对行布局进行膨胀。)

Solutions Collecting From Web of "ArrayAdapter的getView()方法的说明"

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

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

parent参数的作用是什么。 我没有看到太多利用它的例子。 他们中的大多数只是重复/膨胀行布局并返回它。

它应该用于为新膨胀/构建的行获取正确的LayoutParams 。 例如,如果您将具有RelativeLayout作为根的布局膨胀,并且您不使用parent来获取LayoutParams ,则可能会对行布局产生一些问题。 考虑到父母,你会使用:

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

我对convertView理解是它本质上是被回收的视图,因为它们目前还没有被使用 – 例如,你向下滚动列表,顶部的那些不在屏幕上,所以它们被传递到这个参数在你需要一个新视图时使用(这样你就不必创建一个全新的视图,同时让未使用的视图空闲)。 iOS有一个名为dequeueReusableCellWithIdentifier的类似方法。 如果listview的每一行都具有相同的结构,则可以安全地将其转换为适当的types,只需更新其中的信息 – 文本,图像等。它将是之前由getView()调用返回的View。同一个清单。

我对parent最好的猜测(并且无可否认地猜测)是这个适配器的列表是其子代的视图。 如果您需要上下文,访问资源系统,向列表的父视图传递信息或从列表的父视图接收信息,它将为您提供返回渲染系统的路径。