【发布时间】:2012-09-19 02:58:35
【问题描述】:
我正在构建递归分层布局。这是我的 message_with_replies.xml(我删除了对齐属性和一些项目以使想法清晰):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<Button
android:id="@+id/toggleReplies"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/button_expand_replies" />
<LinearLayout
android:id="@+id/replies"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
</RelativeLayout>
在 Java 代码中,我使用此布局对项目进行膨胀并将它们嵌入到父级的 replies 布局中,然后对子级重复此操作,从而形成一棵树:
root item
- child 0 of root
- - child 0 of child 0 of root
- - child 1 of child 0 of root
- - - child 0 of child 1 of child 0 of root
- child 1 of root
- child 2 of root
- child 3 of root
- - child 0 of child 3 of root
当我在顶层或离顶层大约 2-3 层时,一切看起来和执行都很好,但随着我深入,布局响应越来越慢。减速是非线性的,在大约 7 或 8 的深度上,UI 完全卡住了(模拟器在思考了大约半分钟后引发了异常)。
显然,问题在于嵌入式布局。我将线性布局嵌入到相对布局中,因此层次结构的每个新级别都意味着在 UI 布局方面有两个额外的嵌入。
如何优化这个?
我可以尝试摆脱线性布局,但我认为这不会解决问题,只会将其推迟到更深的层次,因为我仍然有嵌入。
当我使用其他布局膨胀子项时,通常可以保持层次结构平坦吗?我可以给物品充气,然后在没有容器的情况下取出物品吗?
补充:我已经绕过了这个问题。现在我使用边距构建树,因此不会嵌入布局,并且 UI 不会卡住。一切看起来都很好。
但是原始问题尚未得到解答。
【问题讨论】:
-
您提出的平面视图层次结构 是 实际上是对原始问题的有效答案。您最初的问题可以解释为“我正在做这个非常昂贵的操作,我该如何优化它?”有时,正确答案是“少做事”。在 Android 中拥有太多的布局层总是很昂贵。