ArrayAdapter 的 getViewTypeCount 和 getItemViewType 方法

有没有人能简单地解释一下 ArrayAdaptergetViewTypeCount()getItemViewType()方法的用法?

72185 次浏览

它们可以处理需要不同行的不同 类别视图的情况。例如,在联系人应用程序中,您可能希望偶数行在左侧有图片,而奇数行在右侧有图片。在这种情况下,您将使用:

@Override
public int getViewTypeCount() {
return 2;
}


@Override
public int getItemViewType(int position) {
return position % 2;
}

框架使用您的视图类型来决定 在 ABC1方法中通过 convertView传递给你的视图。换句话说,在上面的例子中,偶数行只能得到左侧带有图片的回收视图,而奇数行只能得到右侧带有图片的回收视图。

如果列表中的每一行具有相同的布局,则不需要担心视图类型。事实上,Java为所有适配器提供了默认行为:

public int getItemViewType(int position) {
return 0;
}


public int getViewTypeCount() {
return 1;
}

这确实为每一行提供了相同的视图类型。

编辑 -概述一般流程:

  1. 使用适配器将数据绑定到 AdapterView
  2. AdapterView尝试显示用户可见的项。
  3. 框架对要显示的行 n调用 getItemViewType
  4. 该框架检查其回收的视图池以获得行 n的类型的视图。它没有找到任何视图,因为还没有视图被回收利用。
  5. 对于行 n调用 getView
  6. 对行 n调用 getItemViewType以确定应该使用什么类型的视图。
  7. 您可以使用 if/switch 语句根据所需的视图类型来扩充不同的 xml 文件。
  8. 用信息填充视图。
  9. 您返回视图,退出 getView,并向用户显示您的行视图。

现在,当一个视图通过滚动屏幕进行回收时,它会进入一个由框架管理的回收视图池。这些视图基本上是按照视图类型组织的,以便在 getView方法的 convertView参数中给出正确类型的视图:

  1. 框架再次为它想要显示的行调用 getItemViewType
  2. 这一次,在回收池中有一个适当类型的视图。
  3. 回收的视图作为 convertView参数传递给您的 getView方法。
  4. 用新信息填充回收视图并返回它。

如果我们需要在列表视图中显示不同类型的视图,那么在适配器中使用 getViewTypeCount()getItemViewType()代替切换视图 View.GONEView.VISIBLE将是 getView()中非常昂贵的任务,这将影响列表滚动。

请检查适配器中 getViewTypeCount()getItemViewType()的使用情况。

链接: 使用 getviewtype 计数

看着奥特
昨天我不得不面对一个实现 ListView的问题,在我滚动它之后,有两种视图的行被混淆了。尽管这个帖子里最受欢迎的答案给出了一个很好的一般性解释,但是它并没有强调最重要的一点信息来停止上面我提到的 UI bug。

以下是我的解释:
BaseAdaptergetView方法同时使用 getViewTypeCount()getItemViewType()来确定视图应该被提取、回收和返回的类型。(正如线程顶部答案中所解释的)。但是,如果您不能根据 Android API Doc 直观地实现这两个方法,那么您可能会遇到我提到的问题。

执行概要指南:
要为 ListView的行实现多种类型的 Views,我们必须实现 getItemViewType()getViewTypeCount()方法。getItemViewType()文档给我们提供了如下注释:

注意: 整数必须在 0getViewTypeCount() - 1的范围内。 也可以返回 IGNORE_ITEM_VIEW_TYPE

因此,在 getItemViewType()中,应该将 View Type 的值从0开始返回到最后一个类型(Type-1的数量)。例如,假设您只有三种类型的视图?因此,根据视图的数据对象,您只能从 getItemViewType()方法返回 012,就像从零开始的数组索引一样。由于您使用了三种类型的视图, 你的 getViewTypeCount()方法必须返回3。

在任何情况下,如果您返回任何其他整数值,如1,2,3或111,222,333这个方法,您肯定会遇到上述 UI 错误,您只是放置不服从 Android API 文档。

如果你没有得到的线索或仍然不能解决,需要进一步的信息,请阅读我的 在这个 StackOverflow 问答线程中的详细答案

阅读 Android 开发者文档进一步的信息,你可能会直接找到线索。

希望这个答案可以帮助有些人在那里节省很多时间! ! !

干杯! ! !