ArrayAdapter的getView()方法的说明

时间:2012-09-13 06:08:41

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

您能否解释一下getView()的{​​{1}}方法。

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

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

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

position来自哪里。我见过许多例子,他们检查convertView是否为空。如果is为null,则它们会对行布局的新实例进行膨胀,填充并返回它。我想我也已经知道了这一点,但还有一件事让我感到困惑。通过convertView参数传递的布局是什么。如果the resource parameter that is passed in when initialising the ArrayAdapter?是convertView返回的最后一个布局的缓存副本吗?

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

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

2 个答案:

答案 0 :(得分:44)

  

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

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

  

父参数有什么作用。我没有看到太多的例子   利用这个。他们中的大多数只是重复/膨胀行布局和   把它归还。

它应该用于为新膨胀/构建的行获取正确的LayoutParams。例如,如果您将以RelativeLayout作为根的布局展开,并且未使用parent来获取LayoutParams,则可能会出现行布局方面的问题。考虑到父母,你会使用:

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

答案 1 :(得分:2)

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

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