有没有人能简单地解释一下 ArrayAdapter的 getViewTypeCount()和 getItemViewType()方法的用法?
ArrayAdapter
getViewTypeCount()
getItemViewType()
它们可以处理需要不同行的不同 类别视图的情况。例如,在联系人应用程序中,您可能希望偶数行在左侧有图片,而奇数行在右侧有图片。在这种情况下,您将使用:
@Override public int getViewTypeCount() { return 2; } @Override public int getItemViewType(int position) { return position % 2; }
框架使用您的视图类型来决定 在 ABC1方法中通过 convertView传递给你的视图。换句话说,在上面的例子中,偶数行只能得到左侧带有图片的回收视图,而奇数行只能得到右侧带有图片的回收视图。
convertView
如果列表中的每一行具有相同的布局,则不需要担心视图类型。事实上,Java为所有适配器提供了默认行为:
public int getItemViewType(int position) { return 0; } public int getViewTypeCount() { return 1; }
这确实为每一行提供了相同的视图类型。
编辑 -概述一般流程:
AdapterView
n
getItemViewType
getView
现在,当一个视图通过滚动屏幕进行回收时,它会进入一个由框架管理的回收视图池。这些视图基本上是按照视图类型组织的,以便在 getView方法的 convertView参数中给出正确类型的视图:
如果我们需要在列表视图中显示不同类型的视图,那么在适配器中使用 getViewTypeCount()和 getItemViewType()代替切换视图 View.GONE和 View.VISIBLE将是 getView()中非常昂贵的任务,这将影响列表滚动。
View.GONE
View.VISIBLE
getView()
请检查适配器中 getViewTypeCount()和 getItemViewType()的使用情况。
链接: 使用 getviewtype 计数
看着奥特 昨天我不得不面对一个实现 ListView的问题,在我滚动它之后,有两种视图的行被混淆了。尽管这个帖子里最受欢迎的答案给出了一个很好的一般性解释,但是它并没有强调最重要的一点信息来停止上面我提到的 UI bug。
ListView
以下是我的解释: BaseAdapter的 getView方法同时使用 getViewTypeCount()和 getItemViewType()来确定视图应该被提取、回收和返回的类型。(正如线程顶部答案中所解释的)。但是,如果您不能根据 Android API Doc 直观地实现这两个方法,那么您可能会遇到我提到的问题。
BaseAdapter
执行概要指南: 要为 ListView的行实现多种类型的 Views,我们必须实现 getItemViewType()和 getViewTypeCount()方法。getItemViewType()文档给我们提供了如下注释:
Views
注意: 整数必须在 0到 getViewTypeCount() - 1的范围内。 也可以返回 IGNORE_ITEM_VIEW_TYPE。
0
getViewTypeCount() - 1
IGNORE_ITEM_VIEW_TYPE
因此,在 getItemViewType()中,应该将 View Type 的值从0开始返回到最后一个类型(Type-1的数量)。例如,假设您只有三种类型的视图?因此,根据视图的数据对象,您只能从 getItemViewType()方法返回 0、 1或 2,就像从零开始的数组索引一样。由于您使用了三种类型的视图, 你的 getViewTypeCount()方法必须返回3。
在任何情况下,如果您返回任何其他整数值,如1,2,3或111,222,333这个方法,您肯定会遇到上述 UI 错误,您只是放置不服从 Android API 文档。
如果你没有得到的线索或仍然不能解决,需要进一步的信息,请阅读我的 在这个 StackOverflow 问答线程中的详细答案。
阅读 Android 开发者文档进一步的信息,你可能会直接找到线索。
希望这个答案可以帮助有些人在那里节省很多时间! ! !
干杯! ! !