ArrayAdapter的getViewTypeCount和getItemViewType方法

有人能说清楚ArrayAdaptergetViewTypeCount()getItemViewType()方法的用法吗?

这些处理的情况下,你想不同的行不同类型的视图。 例如,在联系人应用程序中,您甚至可能希望行左侧有图片,奇数行要有右侧的图片。 在这种情况下,你可以使用:

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

框架使用你的视图类型来决定哪些视图通过你的getView方法中的convertView 。 换句话说,在上面的例子中,你的偶数行只能得到再循环的视图,左边的图片可以重复使用,奇数行只能得到右边的图片。

如果列表中的每一行都具有相同的布局,则不必担心视图类型。 实际上, BaseAdapter.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.VISIBLEgetView()影响列表滚动。

请检查这个在Adapter中使用getViewTypeCount()getItemViewType()

链接: 使用getviewtypecount

观看Outttt!
我不得不面对昨天实施一个ListView的问题,这是两种类型的视图,我滚动它后混乱的行。 即使在这个线程中的顶级投票答案给出了一个很好的一般性解释,但没有突出显示最重要的信息来阻止我提到的上述UI错误。

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

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

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

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

在任何情况下,如果你返回任何其他整数值,如1,2,3或111,222,333这个方法,你肯定可能会遇到上面的UI错误,你刚才放在不遵守Android API文档。

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

阅读Android开发者文档,了解更多信息,您可能会直接找到线索。

希望这个答案可能有助于有人在那里节省大量的小时!

干杯!!!