java - ArrayAdapter 的 getView() 方法说明

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

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

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

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

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

convertView 是从哪里来的。我见过很多例子,他们检查 convertView 是否为空。如果 is 为 null,它们会扩充行布局的新实例,填充并返回它。我想我也明白了这一点,但有一件事仍然让我感到困惑。通过 convertView 参数传入的布局是什么。是如果 the resource parameter that is passed in when initialising the ArrayAdapter ?是 getView() 返回的最后一个布局的缓存副本吗?

最后。 parent 参数有什么作用。我还没有看到太多使用这个的例子。他们中的大多数只是简单地重用/扩充行布局并将其返回。

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

最佳答案

Is is a cached copy of the last layout returned by getView()?

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

What does the parent parameter do. I haven't seen too many examples utilising this. Most of them simply reuse/inflate a row layout and return it.

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

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

关于java - ArrayAdapter 的 getView() 方法说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12400338/

相关文章:

java - 如何测试 util detector OS 类

android - 云功能与 Firebase 安全规则

android - 在android ListView中滑动删除后如何管理撤消?

java - 一个类可以观察多个可观察对象吗?

android - 问题 :display shape android

java - 单击时从 ListView 中删除所选项目

android - ListView 中的 ViewPager - 如何锁定滚动轴?

Java泛型类型方法返回错误的类型

java - 在 Java 中读取 Microsoft Access 文件

java - Windows(7?)上 Java 7 命令行的损坏的通配符扩展