2

我一直在学习如何创建 customArrayAdapter并熟悉了重写 ArrayAdaptergetViewTypeCountgetItemViewType方法。

为什么 Android View API 关心返回的“可能的视图类型数量” getViewTypeCount而且,作为程序员,我为什么要关心?

4

3 回答 3

3

我刚刚查看了 Android 源代码,以了解确切getViewTypeCount的使用位置。它在抽象AbsListView类的“内部RecycleBin类”setViewTypeCount方法中。

setViewTypeCount方法用于指定 的初始大小ArrayList<View>scrapViewsArrayList本身就是一个ArrayListof ArrayList<View>s - 每个“视图类型计数”一个。

此外,返回的值getViewTypeCount被分配给RecycleBin的成员变量mViewTypeCount。该成员用于控制在 RecycleBin 类中的少数方法中只有一个视图与多个视图的情况下的回收逻辑(正如每个人都在暗示的那样)。

所以答案是,我相信,它getViewTypeCount被使用,RecycleBin以便它知道它是否只有一个或多个视图要处理。可以这么说。

(感谢大家睁开眼睛回收并激励我阅读源代码。)

于 2012-04-24T14:00:35.800 回答
2

Commonsware对您上一个问题的回答很好地解释了为什么您需要关心这些方法。这是一个小例子:

您有ListView100 行和 3 种类型的行:

  1. 一个简单的TextView
  2. 自定义视图(非常复杂)
  3. 一个AnalogClock视图

ListView是这样开始的:

  • 位置 0:TextView <=第一个可见位置
  • 位置1:自定义视图
  • 位置2:自定义视图
  • 位置 3:文本视图
  • 位置 4:AnalogClock <=最后可见位置
  • 位置5:自定义视图<=第一个不可见位置(这里android会提供一个回收视图)
  • 位置 6:文本视图

如果您不实现这些方法,那么 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(非常复杂的),并且由于找不到该类型的回收视图,因此您convertViewnull有机会对其进行膨胀。

如果滚动ListView显示位置 6,则位置 1(不再显示在屏幕上)的视图将被回收,因此ListView现在有两个不同类型的视图(TextView和一个custom view(非常复杂))。然后getItemViewType将再次调用,对于这个位置,该getView方法需要一个TextView. 存在这种类型的回收视图,因此getView将调用该方法并将其convertView设置为此回收TextView。如果您进一步滚动ListView并且getView需要一个TextView或一个custom view回收视图(具有正确的类型),将提供。此外,最终类型视图AnalogCLock将被回收,因此ListView每个列表行类型的回收视图将被重用。

于 2012-04-22T18:41:55.673 回答
1

参考资料中,它说“每种类型都代表一组可以在 getView(int, View, ViewGroup) 中转换的视图。”

如果视图不同,则它们不能与不兼容的其他视图一起回收。1因此,如果此方法返回与标准回收代码不同的任何内容,onView则将不再起作用。

于 2012-04-22T17:31:40.633 回答