我正在努力提高我们的 ListView 渲染性能,现在正在研究微调。 (我们使用 viewHolder,异步获取图像,在滚动时暂停图像显示,已经禁用滚动缓存)
现在我正在检查布局并遇到如下设置,用于单个列表项的布局,它在 getView 中膨胀。
自定义列表适配器的getView()
if (convertView == null) {
convertView = inflater.inflate(R.layout.zzz_list_item, null);
...save stuff in holder etc.
zzz_list_item.xml
<LinearLayout
android:id="@+id/layout_success"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/base"
android:orientation="vertical"
android:paddingBottom="30dp" >
...many lines of a "success" item layout
</LinearLayout>
<LinearLayout
android:id="@+id/layout_failure"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:visibility="gone" >
...many lines for a failure item layout
</LinearLayout>
可见性在我们自定义 ListView 适配器的 getView 方法中得到进一步控制
getView() 方法 - 每次执行
if(isSuccessfulItem){
((LinearLayout) convertView.findViewById(R.id.layout_failure)).setVisibility(View.GONE);
((LinearLayout) convertView.findViewById(R.id.layout_success)).setVisibility(View.VISIBLE);
} else {
((LinearLayout) convertView.findViewById(R.id.layout_failure)).setVisibility(View.VISIBLE);
((LinearLayout) convertView.findViewById(R.id.layout_success)).setVisibility(View.GONE);
}
虽然这也可能是一个小的性能消耗(getView 很昂贵),但我想知道将成功和失败元素的处理重构和拆分为两个不同的布局是否有意义,然后分别使用 getViewTypeCount()
和 getItemViewType(int position)
。
我的列表项布局的额外故障布局代码(因此增加了文件大小)是否会影响性能,即使它在 inflation 期间设置为 visibility=GONE?
非常感谢任何见解,谢谢。
最佳答案
Does the additional failure layout code (and therefore increased file size) for my list item layout affect the performance, even if it is set to visibility=GONE during inflation?
无论哪种方式,性能增益或损失都是最小的。可见性设置为 gone
的 View 不需要在布局和测量阶段进行计算,因为它会被忽略,但它确实会消耗内存(这就是您可以谈论的内容)。对于当前的实现,即使您不需要/使用行布局的失败部分,您也会占用内存(将其乘以屏幕上可见的行数)。将当前行分成两部分将清除内存需求,因为每一行将只有它实际使用的 View 。
如果我是你,我会实现两种行类型,因为我认为它更简洁(而且它也不会在内存中添加无用的 View )。
您可能知道这一点,但请使用:
convertView = inflater.inflate(R.layout.zzz_list_item, convertView, false);
另外,将行 View 缓存在 holder 中。
关于android - 具有 visibility=gone 元素的膨胀布局的性能影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16453652/