ArrayAdapter的getViewTypeCount和getItemViewType方法

时间:2011-03-14 15:47:30

标签: android

有人可以用简单的话语向我解释getViewTypeCount()的{​​{1}}和getItemViewType()方法的用法吗?

3 个答案:

答案 0 :(得分:298)

这些处理您希望不同行的不同类型视图的情况。例如,在联系人应用程序中,您可能希望偶数行在左侧显示图片,而奇数行则在右侧显示图片。在这种情况下,您将使用:

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

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

框架使用您的视图类型来决定convertView方法中通过getView向您发送哪些观看次数。换句话说,在上面的示例中,偶数行只会获得带有左侧图片的循环视图以便重复使用,而奇数行只会获得右侧带图片的视图。

如果列表中的每一行都具有相同的布局,则无需担心视图类型。实际上,BaseAdapter.java为所有适配器提供了默认行为:

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

public int getViewTypeCount() {
    return 1;
}

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

修改 - 概述一般流程:

  1. 使用适配器将数据绑定到AdapterView
  2. AdapterView尝试显示用户可见的项目。
  3. 框架调用getItemViewTypen,即要显示的行。
  4. 框架检查其回收的视图池以查看行n类型的视图。它找不到,因为还没有回收任何视图。
  5. 对行getView调用
  6. n
  7. 您为行getItemViewType调用n以确定应使用的视图类型。
  8. 根据所需的视图类型,使用if / switch语句来膨胀不同的xml文件。
  9. 您可以在视图中填写信息。
  10. 您返回视图,退出getView,您的行视图会显示给用户。
  11. 现在,当通过滚动屏幕回收视图时,它将进入由框架管理的回收视图池。这些基本上按视图类型进行组织,以便在convertView方法的getView参数中为您提供正确类型的视图:

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

答案 1 :(得分:12)

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

请检查此内容,以便在适配器中使用getViewTypeCount()getItemViewType()

链接:the-use-of-getviewtypecount

答案 2 :(得分:11)

观看Outttt !!!!
我不得不面对昨天实现ListView的问题,并且在我滚动它之后它的两种类型的视图被混乱。即使这个帖子中的最高投票答案提供了一个很好的一般解释,但它没有突出显示最重要的信息来阻止我提到的上述UI错误。

以下是我的解释:
getViewTypeCount() getItemViewType()方法正在使用BaseAdaptergetView来查找应该获取,回收和返回的视图类型。 (如线程中的最佳答案所述)。但是如果你没有根据Android API Doc直观地实现这两种方法,那么你可能会遇到我提到的问题。

实施总结指南:
要为Views行实现多种ListView行,我们必须实现getItemViewType()getViewTypeCount()方法。 getItemViewType()文档为我们提供了如下注释:

  

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

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

在任何情况下,如果您为此方法返回任何其他整数值(如1,2,3或111,222,333),您肯定可能会遇到上述UI错误,您只是因为不遵守Android API文档而放置。< / p>

如果您没有得到线索或无法解决并需要进一步的信息,请阅读我的detailed answer within this StackOverflow Q&A thread

阅读Android Developer Doc以获取您可能直接找到线索的更多信息。

希望这个答案可能会对那些节省大量时间的人有所帮助!!!

干杯!!!