![](/img/trans.png)
[英]What is “convertView” parameter in ArrayAdapter getView() method
[英]Explanation of the getView() method of an ArrayAdapter
你能解释一下ArrayAdapter
的getView()
方法吗?
我阅读了文档,它有三个参数:
position
:项目在我们想要的视图项的适配器数据集中的位置。 convertView
:如果可能的话,重用旧视图。 注意:在使用之前,应检查此视图是否为非null且类型是否合适。 如果无法转换此视图以显示正确的数据,则此方法可以创建新视图。 parent
:此视图最终将附加到的父级 我理解position
参数。 就像他们说的那样,这意味着该项目的位置,已经请求了视图。
convertView
来自哪里。 我见过很多例子,他们检查convertView
是否为null。 如果is为null,则它们会对行布局的新实例进行膨胀,填充并返回它。 我想我也已经知道了这一点,但还有一件事让我感到困惑。 通过convertView
参数传递的布局是什么。 是否在初始化ArrayAdapter
时传入的resource
参数 ? 是getView()
返回的最后一个布局的缓存副本?
最后。 parent
参数的作用是什么。 我没有看到太多利用它的例子。 他们中的大多数只是重复/膨胀行布局并返回它。
(我问,因为我的ListView
有一个点击动画。特别是这个目的是复制Spotify的下拉快速动作菜单 。我的动画有点迟钝。在诊断了这个问题一段时间后,我意识到这是因为我的getView()
方法需要花费一些时间才能完成,因为我在每次迭代中都在给新的行布局充气。有人建议在ViewHolder
缓存行布局,而其他示例则指向重用convertView
参数,即如果convertView
为null,则仅对行布局进行膨胀。)
是getView()返回的最后一个布局的缓存副本?
convertView
是离开屏幕的行的视图(因此它不是getView
方法返回的最后一个视图)。 例如,首先显示列表,在这种情况下, convertView
为null
,之前没有构建行视图并离开屏幕。 如果向下滚动,第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.