为什么Android View API关心ArrayAdapter的getViewTypeCount?

时间:2012-04-22 17:26:59

标签: android android-listview android-arrayadapter recycle

我一直在学习如何创建自定义ArrayAdapter,并且已经熟悉了覆盖ArrayAdapter的getViewTypeCountgetItemViewType方法。

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

3 个答案:

答案 0 :(得分:3)

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

setViewTypeCount方法用于指定ArrayList<View>的{​​{1}}的初始大小。此scrapViews本身是ArrayListArrayList s - 每个“查看类型计数”一个。

此外,ArrayList<View>返回的值已分配给getViewTypeCount的成员变量RecycleBin。该成员用于控制回收的逻辑,以便在RecycleBin类的少数几个方法中只有一个对多个视图(正如大家所暗示的那样)。

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

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

答案 1 :(得分:2)

Commonsware 对您之前问题的回答非常清楚地解释了为什么您需要关心这些方法。这是一个小例子:

您有一个ListView,包含100行和3种行:

  1. 一个简单的TextView
  2. 自定义视图(非常复杂)
  3. AnalogClock视图
  4. ListView就是这样开始的:

    • 位置0:TextView&lt; = 第一个可见位置
    • 位置1:自定义视图
    • 位置2:自定义视图
    • 位置3:TextView
    • 位置4:AnalogClock&lt; = 最后一个可见位置
    • 位置5:自定义视图&lt; = 第一个不可见位置(此处android将提供回收视图)
    • 位置6:TextView

    如果你没有实现这些方法,那么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时,(仅)回收的视图将是简单的ListViewTextView方法需要getView(非常复杂),并且找不到该类型的回收视图,那么custom view将为convertView并且您有机会膨胀它。

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

答案 2 :(得分:1)

the reference, it says中“每种类型代表一组可以在getView(int,View,ViewGroup)中转换的视图。”

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