繁体   English   中英

ArrayAdapter的getView()方法的说明

[英]Explanation of the getView() method of an ArrayAdapter

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

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

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

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

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

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

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

是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的每一行都具有相同的结构,则可以安全地将其转换为适当的类型并只更新其中的信息 - 文本,图像等。它将是以前由getView()调用返回的视图同一个清单。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM