安卓布局效率:隐藏视图的多个视图或单个视图?

6
我有一个包含布局的ListView。有时候布局需要呈现不同的样式,主要是在不同区域展示文本,大小和权重也不同。主视图与其他视图的比例约为5:1。当需要更改时,整个视图中只有2/3需要更改。
我认为有两种选择:
1. (现有方式) 使用一个布局(因为回收的视图都是相同的,所以无需重新填充),并且第二个2/3的视图被隐藏,直到需要更改时,代码将显示它并隐藏原来的2/3视图。 2. (另一种方式) 使用两个布局,第一个1/3布局被复制,每个布局都有自己的另外2/3。然后当需要使用其中一个不同的布局时,从ListView回收器中获取旧视图,丢弃它并填充一个新的正确视图,在列表移动时再切换回来。
所以我的问题是:为了避免在ListView回收器中填充更多的布局,是隐藏/显示同一个布局的某些部分更好,还是使用两个精简的布局,没有额外的隐藏视图,并在需要时填充它们?
2个回答

3
如果TextViews是这些布局的主要部分,我认为性能上不会有太大的差异,所以你可以选择任何一种方式。我会选择第二个选项,因为:
  1. 普通行布局与特殊行布局之间的比例很大。如果你采用单一布局方法,那么你将不得不为每个行(普通或特殊)在代码中修改布局,因为当需要显示普通行时,你可能会处理一个隐藏了2/3部分的已回收的View(因此每次都要修改布局)。如果你采用第二个选项,则可以从getView方法中消除此部分,并使用switch来查看你正在处理哪种类型的行(不再在getView方法中每次修改行布局,你让ListView通过提供正确类型的行布局来处理它)。别担心膨胀另一个布局文件(只需一次),这不是你需要担心的性能问题。

  2. 使用一种布局意味着即使用户看不到它们,Views仍然保留在内存中(因此你可能会阻止ListView膨胀更多的Views(实际上只膨胀一次),但同时你正在占用更多的内存,即使用户看不到它们)。第一种选项的优点在于将数据绑定到行更加简单,因为你可以使用所有视图(即使用户看不到其中的一部分),而不是第二个选项,其中你必须根据行类型查看需要显示哪些数据。

  3. 代码可读性。在getView方法中测试两种行类型并查看你获得的行类型的逻辑更有意义。此外,如果你计划在将来更改这些行布局或添加更多行类型,则会更好。

只要你提供行类型,ListView就可以很好地回收视图。
编辑:ListView将为适配器中声明的每种类型保留一个已回收的视图。因此,ListView仅在第一次在ListView中找到第二个布局时才会膨胀它,下一次当它需要具有该类型的行时,它将使用已回收的行(并且将维护两种已回收的视图类型,第一种和第二种行类型)。

0

其实在我看来,这些额外的垃圾回收并不应该成为您决策的驱动因素。

我会选择更易于维护和理解的路线。

此外,在 XML 中有一个很好用的 include 标记,像这样:

<include
    android:id="@+id/abc"  
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    layout="@layout/abc"   , where abc = the xml  file you want to include
    />    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接