ArrayAdapter的getViewTypeCount和getItemViewType方法
有人能说清楚ArrayAdapter
的getViewTypeCount()
和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; }
这确实为您提供每行相同的视图类型。
编辑 – 概述一般流程:
- 使用适配器将数据绑定到
AdapterView
。 -
AdapterView
尝试显示用户可见的项目。 - 该框架为第
n
行(即将要显示的行)调用getItemViewType
。 - 该框架检查其循环视图池的行
n
的类型的意见。 它没有找到任何,因为没有意见已被回收。 - 第
n
行调用getView
。 - 你为第
n
行调用getItemViewType
来确定你应该使用什么类型的视图。 - 您使用if / switch语句来根据所需的视图类型来膨胀一个不同的xml文件。
- 你用信息填充视图。
- 你返回视图,退出
getView
,你的行视图显示给用户。
现在,通过滚动屏幕来回收视图时,它将进入由框架管理的再循环视图池。 这些基本上由视图类型组织,以便在getView
方法的convertView
参数中为您提供正确类型的视图:
- 框架再次调用
getItemViewType
来显示行。 - 这一次,在适当类型的再循环池中有一个观点。
- 回收视图作为
convertView
参数传递给您的getView
方法。 - 用新信息填充回收视图并将其返回。
如果我们需要在列表视图中显示不同类型的视图,那么在适配器中使用getViewTypeCount()
和getItemViewType()
,而不是切换视图View.GONE
和View.VISIBLE
在getView()
影响列表滚动。
请检查这个在Adapter中使用getViewTypeCount()
和getItemViewType()
。
链接: 使用getviewtypecount
观看Outttt!
我不得不面对昨天实施一个ListView
的问题,这是两种类型的视图,我滚动它后混乱的行。 即使在这个线程中的顶级投票答案给出了一个很好的一般性解释,但没有突出显示最重要的信息来阻止我提到的上述UI错误。
这是我的解释:
getViewTypeCount()
的getView
方法正在使用getViewTypeCount()
和getItemViewType()
方法来找出哪个类型的视图应该被获取,回收和返回。 (正如在线程中的顶部答案中所解释的)。 但是,如果您不根据Android API Doc直观地实现这两种方法,那么您可能会遇到我提到的问题。
总结实施指南:
要为ListView
的行实现多种类型的Views
,我们必须实现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文档。
如果你没有得到线索或不能解决,需要进一步的信息,请阅读我在这个StackOverflow Q&A线程的详细的答案 。
阅读Android开发者文档,了解更多信息,您可能会直接找到线索。
希望这个答案可能有助于有人在那里节省大量的小时!
干杯!!!
- 如何在Android Studio中创build发布的Android库包(aar)(不debugging)
- Android Studio:找不到com.android.tools.build:gradle:2.0.0-alpha2
- 这个Google Play APK发布错误消息是什么意思?
- Android SDK文件夹占用大量磁盘空间。 我们是否需要保留所有的系统映像?
- 在相对布局中以编程方式添加视图
- 如何在android imageview上显示静态谷歌地图?
- 如何从Java Android平台的外部IP
- “app-release.apk”如何改变这个默认生成的apk名称
- 无法创buildAndroid虚拟设备