我有ListView
的布局。有时布局需要一种方式,有时候另一种方式。它们主要是在不同区域布置不同重量大小的文本等。主要视图与其他视图的比例约为5:1。当需要更改时,只有整个视图的2/3发生变化。
我想我有两个选择:
(现在的方式)一个布局(所以它永远不必重新充气,因为回收的视图都是相同的),视图的第二个2/3被隐藏,直到需要它为止要更改,然后代码将显示它并隐藏视图的原始2/3。
(另一种方式)两个布局,其中1/3布局重复,每个布局都在其他2/3上。然后,当需要使用其中一个不同的布局时,ListView
回收器中的旧视图会被丢弃,新的正确视图会被充气,并且在移动列表时会再次返回。
所以我在这里要问的是隐藏/显示相同布局的部分以防止ListView
中的回收者使更多布局膨胀,或者有两个简化的布局而没有额外的隐藏观点,并在需要时让它们膨胀?
答案 0 :(得分:2)
如果TextViews
是这些布局的主要部分,我不认为性能会有很大差异,所以你可以选择其中任何一种方式。 我会使用选项二,因为:
正常行布局数与特殊行数之间的比率很大。如果您采用单一布局方法,则必须修改代码中每个行的正常或特殊布局,因为您可能正在处理已回收的View
当显示正常时,隐藏2/3部分隐藏(因此每次最终修改布局)。如果您要使用第二个选项,那么您可以从getView
方法中删除此部分,只需使用switch
查看您正在处理的行类型(不再修改行布局)每次使用getView
方法时,都会让ListView
通过为您提供正确的行布局类型来处理它。不要担心膨胀另一个布局文件(一次),这不是害怕的性能打击。
使用一种类型的布局意味着即使用户没有看到Views
内存,ListView
也会留在内存中(因此您可能会阻止Views
更多地膨胀{ {1}}(实际上只有一次)但同时你用你甚至没有向用户展示的内存占用更多的内存。第一个选项的优点是数据与行的绑定更简单,因为您可以使用所有视图(即使用户没有看到它们的一部分)而不是第二个选项,您将拥有查看需要根据行类型显示哪些数据。
代码可读性。有两种行类型并测试以查看getView
方法中的哪一种,它更有意义,因为您可以看到每种类型行的逻辑。此外,如果您计划将来更改这些行布局或添加更多行类型会更好。
只要您提供行类型,ListView
在回收视图方面做得很好。
编辑:ListView
将为您在适配器中声明的每种类型保留一个回收视图。因此,ListView
只会在第一次在ListView
中找到它时才会使第二个布局膨胀,下次当它需要带有类型的行时,它将使用已回收的布局(并且它将保持2循环视图的类型,第一和第二行类型。)
答案 1 :(得分:0)
实际上,这一点额外的GC恕我直言不应该是你决定的驱动因素。
我会选择更容易维护和理解的路线。
此外,xml中还有一个非常有用的包含标记,如下所示:
<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
/>