充气布局中具有visibility=gone元素的性能影响

3

我正在尝试改善我们的列表视图渲染性能,并正在进行微调。(我们使用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>

我们自定义的列表视图适配器中,可见性在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)分别进行填充,是否更加合理。
即使在填充时将其设置为visibility=GONE,列表项布局中额外的失败布局代码(因此增加了文件大小)是否会影响性能?
非常感谢您的任何见解。
1个回答

4
即使在充气期间将可见性设置为gone,额外的失败布局代码(因此增加了文件大小)是否会影响性能?
无论哪种情况,性能损益都很小。可见性设置为gone的视图在布局和测量阶段不需要计算,因为它被忽略,但它确实占用内存(这是你可以谈论的内容)。使用您当前的实现,即使您不需要/使用行布局的故障部分,它也会占用内存(将其乘以屏幕上可见的行数)。将当前行分成两个部分将清除该内存需求,因为每行只包含它实际使用的视图。
如果我是你,我会实现两个行类型,因为我认为这更清晰(并且还不会在内存中添加无用的视图)。
您可能已经知道这一点,但请使用:
convertView = inflater.inflate(R.layout.zzz_list_item, convertView, false);

此外,还要在holder中缓存行视图。

感谢您的见解 - 这正是我想知道的。我们的应用程序面临一些内存问题,因此清理这些视图可能有助于使应用程序更轻便。我知道可以通过指定根节点来膨胀,并且我们正在使用持有者模式,但无论如何还是感谢您提供的好建议! - Makibo

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