ArrayAdapter的getViewTypeCount和getItemViewType方法

Eug*_*ene 156 android

有人可以用简单的话来解释我的用法getViewTypeCount()getItemViewType()方法ArrayAdapter吗?

Mat*_*lis 303

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

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

@Override
public int getItemViewType(int position) {
    return position % 2;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

public int getViewTypeCount() {
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

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

编辑 - 概述一般流程:

  1. AdapterView使用适配器将数据绑定到您的数据.
  2. AdapterView尝试显示是对用户可见的项目.
  3. 框架调用getItemViewTypen,它将要显示的行.
  4. 框架检查其循环视图池以查看行n类型的视图.它找不到,因为还没有回收任何视图.
  5. getView被称为行n.
  6. 您调用getItemViewTypen来确定应使用的视图类型.
  7. 您可以使用if/switch语句来扩充不同的xml文件,具体取决于所需的视图类型.
  8. 您可以使用信息填充视图.
  9. 您返回视图,退出getView,并且您的行视图将显示给用户.

现在,当通过滚动屏幕来回收视图时,它将进入由框架管理的循环视图池.这些基本上按视图类型进行组织,以便convertViewgetView方法的参数中为您提供正确类型的视图:

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

  • 谨防!getItemViewType()必须返回0和getViewTypeCount() - 1之间的int. (74认同)

kyo*_*ogs 12

如果我们需要在列表视图中显示不同类型的视图,那么它的好用getViewTypeCount()getItemViewType()适配器而不是切换视图,View.GONE并且View.VISIBLE可能是非常昂贵的任务,getView()其中将影响列表滚动.

请检查此一个是否适用于getViewTypeCount()和使用getItemViewType()适配器.

链接:使用-getviewtypecount


Ran*_*man 11

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

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

实现的总结指南:
要实现多种类型的Viewsfor ListView行,我们必须实现getItemViewType()getViewTypeCount()方法.和getItemViewType()文档给了我们一个提示如下:

注:整数必须在范围0getViewTypeCount() - 1. IGNORE_ITEM_VIEW_TYPE也可以退货.

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

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

如果您没有得到线索或无法解决并需要进一步的信息,请阅读我在StackOverflow问答帖子中的详细答案.

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

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

干杯!!!