我一直在学习如何创建 customArrayAdapter
并熟悉了重写 ArrayAdaptergetViewTypeCount
和getItemViewType
方法。
为什么 Android View API 关心返回的“可能的视图类型数量” getViewTypeCount
?而且,作为程序员,我为什么要关心?
我一直在学习如何创建 customArrayAdapter
并熟悉了重写 ArrayAdaptergetViewTypeCount
和getItemViewType
方法。
为什么 Android View API 关心返回的“可能的视图类型数量” getViewTypeCount
?而且,作为程序员,我为什么要关心?
我刚刚查看了 Android 源代码,以了解确切getViewTypeCount
的使用位置。它在抽象AbsListView
类的“内部RecycleBin
类”setViewTypeCount
方法中。
此setViewTypeCount
方法用于指定 的初始大小ArrayList<View>
。scrapViews
这ArrayList
本身就是一个ArrayList
of ArrayList<View>
s - 每个“视图类型计数”一个。
此外,返回的值getViewTypeCount
被分配给RecycleBin
的成员变量mViewTypeCount
。该成员用于控制在 RecycleBin 类中的少数方法中只有一个视图与多个视图的情况下的回收逻辑(正如每个人都在暗示的那样)。
所以答案是,我相信,它getViewTypeCount
被使用,RecycleBin
以便它知道它是否只有一个或多个视图要处理。可以这么说。
(感谢大家睁开眼睛回收并激励我阅读源代码。)
Commonsware对您上一个问题的回答很好地解释了为什么您需要关心这些方法。这是一个小例子:
您有ListView
100 行和 3 种类型的行:
TextView
AnalogClock
视图你ListView
是这样开始的:
如果您不实现这些方法,那么 android 将简单地回收视图而不考虑行的类型。因此,在上面的示例中,当用户向下滚动时,将为具有回收视图的行调用ListView
该方法(不再可见的第 0 行),a (不会用于此位置)。如您所见,这不是您在该位置所期望的视图。因为在方法中你有这样的东西:getView
5
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
将调用该方法并convertView
设置为null
。当您滚动ListView
显示位置 5 时,(唯一)回收视图将是简单的TextView
. 该getView
方法需要一个custom view
(非常复杂的),并且由于找不到该类型的回收视图,因此您convertView
将null
有机会对其进行膨胀。
如果滚动ListView
显示位置 6,则位置 1(不再显示在屏幕上)的视图将被回收,因此ListView
现在有两个不同类型的视图(TextView
和一个custom view
(非常复杂))。然后getItemViewType
将再次调用,对于这个位置,该getView
方法需要一个TextView
. 存在这种类型的回收视图,因此getView
将调用该方法并将其convertView
设置为此回收TextView
。如果您进一步滚动ListView
并且getView
需要一个TextView
或一个custom view
回收视图(具有正确的类型),将提供。此外,最终类型视图AnalogCLock
将被回收,因此ListView
每个列表行类型的回收视图将被重用。
在参考资料中,它说“每种类型都代表一组可以在 getView(int, View, ViewGroup) 中转换的视图。”
如果视图不同,则它们不能与不兼容的其他视图一起回收。1
因此,如果此方法返回与标准回收代码不同的任何内容,onView
则将不再起作用。