一尘不染

ArrayAdapter的getView()方法的说明

java

你能解释一下getView()方法吗ArrayAdapter

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

  • position:项目在我们想要其视图的项目的适配器数据集中的位置。
  • convertView:如果可能,请重用旧视图。注意:使用前,应检查此视图是否为非null并具有适当的类型。如果无法转换此视图以显示正确的数据,则此方法可以创建一个新视图。
    异构列表可以指定其视图类型的数量,以便此View始终具有正确的类型(请参见getViewTypeCount()和getItemViewType(int))。

  • parent:该视图最终将附加到的父对象

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

哪里convertView来的。我看过很多例子,它们检查是否convertView为null。如果为null,则将为行布局添加一个新实例,将其填充并返回。我想我也对此有所了解,但有一件事仍然使我感到困惑。通过convertView参数传递的布局是什么。如果是resource是的初始化时传入的参数ArrayAdapter?是由返回的最后一个布局的缓存副本getView()吗?

最后。什么是parent参数做。我还没有看到太多利用此方法的示例。他们中的大多数人只是简单地重复/膨胀行布局并返回它。

(我之所以问是因为我的动画中有一个单击动画ListView。特别是这个旨在复制Spotify的下拉快速动作菜单的动画。我的动画有点呆滞。诊断了一段时间之后,我意识到这是由于我的getView()方法在每次迭代中增加新的行布局时需要花费一些时间来完成的,有人建议将行布局缓存,ViewHolder而其他示例则指向重用convertView参数,即仅对a行布局(如果convertView为null)。


阅读 644

收藏
2020-12-03

共1个答案

一尘不染

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

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

父参数做什么。我还没有看到太多利用此方法的示例。他们中的大多数人只是简单地重复/膨胀行布局并返回它。

应该使用它来获得正确LayoutParams的新膨胀/建立的行。例如,如果您RelativeLayout将以a
为根的布局充气,而没有使用parent来获取LayoutParams,则行布局可能会出现一些问题。考虑到父母,您可以使用:

convertView = getLayoutInflater().inflate(R.layout.row_layout, parent, false);
2020-12-03