我一直在学习如何创建 customArrayAdapter并熟悉了重写 ArrayAdaptergetViewTypeCount和getItemViewType方法。
为什么 Android View API 关心返回的“可能的视图类型数量” getViewTypeCount?而且,作为程序员,我为什么要关心?
我一直在学习如何创建 customArrayAdapter并熟悉了重写 ArrayAdaptergetViewTypeCount和getItemViewType方法。
为什么 Android View API 关心返回的“可能的视图类型数量” getViewTypeCount?而且,作为程序员,我为什么要关心?
我刚刚查看了 Android 源代码,以了解确切getViewTypeCount的使用位置。它在抽象AbsListView类的“内部RecycleBin类”setViewTypeCount方法中。
此setViewTypeCount方法用于指定 的初始大小ArrayList<View>。scrapViews这ArrayList本身就是一个ArrayListof ArrayList<View>s - 每个“视图类型计数”一个。
此外,返回的值getViewTypeCount被分配给RecycleBin的成员变量mViewTypeCount。该成员用于控制在 RecycleBin 类中的少数方法中只有一个视图与多个视图的情况下的回收逻辑(正如每个人都在暗示的那样)。
所以答案是,我相信,它getViewTypeCount被使用,RecycleBin以便它知道它是否只有一个或多个视图要处理。可以这么说。
(感谢大家睁开眼睛回收并激励我阅读源代码。)
Commonsware对您上一个问题的回答很好地解释了为什么您需要关心这些方法。这是一个小例子:
您有ListView100 行和 3 种类型的行:
TextViewAnalogClock视图你ListView是这样开始的:
如果您不实现这些方法,那么 android 将简单地回收视图而不考虑行的类型。因此,在上面的示例中,当用户向下滚动时,将为具有回收视图的行调用ListView该方法(不再可见的第 0 行),a (不会用于此位置)。如您所见,这不是您在该位置所期望的视图。因为在方法中你有这样的东西:getView5TextViewconvertViewnullgetView
//...
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则将不再起作用。