有人可以用简单的话语向我解释getViewTypeCount()
的{{1}}和getItemViewType()
方法的用法吗?
答案 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;
}
这确实为每行提供了相同的视图类型。
修改 - 概述一般流程:
AdapterView
。AdapterView
尝试显示用户可见的项目。getItemViewType
行n
,即要显示的行。n
类型的视图。它找不到,因为还没有回收任何视图。getView
调用n
。getItemViewType
调用n
以确定应使用的视图类型。getView
,您的行视图会显示给用户。现在,当通过滚动屏幕回收视图时,它将进入由框架管理的回收视图池。这些基本上按视图类型进行组织,以便在convertView
方法的getView
参数中为您提供正确类型的视图:
getItemViewType
调用它想要显示的行。convertView
方法的getView
参数传递给您。答案 1 :(得分:12)
如果我们需要在列表视图中显示不同类型的视图,则可以在适配器中使用getViewTypeCount()
和getItemViewType()
,而不是切换视图View.GONE
和View.VISIBLE
可能是getView()
内部非常昂贵的任务,这将影响列表滚动。
请检查此内容,以便在适配器中使用getViewTypeCount()
和getItemViewType()
。
答案 2 :(得分:11)
观看Outttt !!!!
我不得不面对昨天实现ListView
的问题,并且在我滚动它之后它的两种类型的视图被混乱。即使这个帖子中的最高投票答案提供了一个很好的一般解释,但它没有突出显示最重要的信息来阻止我提到的上述UI错误。
以下是我的解释:
getViewTypeCount()
getItemViewType()
方法正在使用BaseAdapter
和getView
来查找应该获取,回收和返回的视图类型。 (如线程中的最佳答案所述)。但是如果你没有根据Android API Doc直观地实现这两种方法,那么你可能会遇到我提到的问题。
实施总结指南:
要为Views
行实现多种ListView
行,我们必须实现getItemViewType()
和getViewTypeCount()
方法。 getItemViewType()
文档为我们提供了如下注释:
注意:整数必须在
0
到getViewTypeCount() - 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以获取您可能直接找到线索的更多信息。
希望这个答案可能会对那些节省大量时间的人有所帮助!!!
干杯!!!