我一直在学习如何创建自定义ArrayAdapter
,并且已经熟悉了覆盖ArrayAdapter的getViewTypeCount
和getItemViewType
方法。
为什么Android View API关注getViewTypeCount
返回的“可能的视图类型数量”?而且,作为程序员,为什么我关心?
答案 0 :(得分:3)
我刚刚查看了Android源代码,以确切了解getViewTypeCount
的使用位置。它在抽象的AbsListView
类'内部RecycleBin
类'setViewTypeCount
方法中。
此setViewTypeCount
方法用于指定ArrayList<View>
的{{1}}的初始大小。此scrapViews
本身是ArrayList
个ArrayList
s - 每个“查看类型计数”一个。
此外,ArrayList<View>
返回的值已分配给getViewTypeCount
的成员变量RecycleBin
。该成员用于控制回收的逻辑,以便在RecycleBin类的少数几个方法中只有一个对多个视图(正如大家所暗示的那样)。
所以答案是,我相信,mViewTypeCount
使用了getViewTypeCount
,因此它知道它是否只有一个或多个要处理的视图。可以这么说。
(感谢大家睁开眼睛回收并激励我阅读来源。)
答案 1 :(得分:2)
Commonsware 对您之前问题的回答非常清楚地解释了为什么您需要关心这些方法。这是一个小例子:
您有一个ListView
,包含100行和3种行:
TextView
AnalogClock
视图你ListView
就是这样开始的:
如果你没有实现这些方法,那么android将简单地回收不考虑行类型的视图。因此,在上面的示例中,当用户向下滚动ListView
时,getView
方法将为具有回收视图的行5
调用(第0行不再可见), TextView
convertView
此职位不会null
。如您所见,这不是您期望的那个位置的视图。因为在getView
方法中你有这样的东西:
//...
if (convertView == null) {
// inflate views
} else {
//just use it
//...
你最终会在一行应该是custom view
(非常复杂)的行上设置数据,而是得到一个简单的TextView
。当您进一步向上和向下滚动ListView
时,情况会变得更糟。
如果你确实实现了这些方法,那么android会知道getView
方法会预期有3种类型的行。当需要显示第5行(来自上一个示例)时,android将调用getItemViewType
以查看getView
方法对该位置所期望的视图类型(位置5)。如果找到该类型的回收视图(之前已回收),则会调用getView
方法并将convertView
设置为该回收视图,否则将调用getView
{ {1}}设置为convertView
。当您滚动null
以显示位置5时,(仅)回收的视图将是简单的ListView
。 TextView
方法需要getView
(非常复杂),并且找不到该类型的回收视图,那么custom view
将为convertView
并且您有机会膨胀它。
如果您滚动null
以显示位置6,则位置1的视图(不再在屏幕上)将被回收,因此ListView
现在有两个不同类型的视图({ {1}}和ListView
(非常复杂))。然后将再次调用TextView
,对于此位置,custom view
方法需要getItemViewType
。存在此类型的回收视图,因此将getView
方法调用TextView
设置为此回收的getView
。如果您进一步滚动convertView
并且TextView
要求提供ListView
或getView
其中一个回收的视图(具有正确的类型)。此外,最终将回收类型TextView
的视图,以便custom view
具有每个列表行类型的回收视图以供重用。
答案 2 :(得分:1)
在the reference, it says中“每种类型代表一组可以在getView(int,View,ViewGroup)中转换的视图。”
如果视图不同,则无法使用不兼容的其他视图回收它们。因此,如果此方法返回与1
不同的任何内容,则标准onView
回收代码将不再有效。