我正在考虑视图的两种不同布局布局(它将是RecyclerView中的一行)。它们是不同的,但它们都可以工作,或者
现在我想知道:在布局性能方面哪一个会更优选?
据我所知,RelativeLayout必须测量两次,因此非常慢,而FrameLayout很快,而且LinearLayout在布局性能方面还不错。在一种情况下,我只有一个缓慢的容器(RelativeLayout - > Content),另一个我会有两个更快的容器(LinearLayout - > FrameLayouts - > Content)。
答案 0 :(得分:8)
简答(TLDR):
如果你真的知道自己在做什么,那么RelativeLayouts可以更快。 如果不这样做,它们会慢得多。
长答案:
手动嵌套布局(如LinearLayout中的FrameLayout)与使用RelativeLayout中的相对位置可以有任何优点和缺点。
成本是计算动态大小,例如“wrap_content”,它必须根据孩子的需要或父母的要求约束而扩展。这会导致因子计算问题随着深度而增加。
使用嵌套视图手动定位会增加级别。水平越浅越好但仍然有效。因此,从字面上看,工作量是您的水平深度的因子,如上所述。 例如: A嵌套在Root下。 B嵌套在A.下 C嵌套在B.下 A影响Root的宽度。 B会影响影响Root的A. C影响影响A的B,影响Root。
通过使一个视图位置本身相对于另一个视图位置本身的相对定位与动态大小调整计算方面的嵌套视图相同,因为必须在考虑另一个的情况下计算每个关系。 例如:
A留在Root。 B是A的左边。 C是B的左边。 虽然A,B,C都存在于Root下,但动态测量结果如下: A影响Root的宽度。 B会影响影响Root的A. C影响影响A的B,影响Root。
换句话说,您进行了相同的因子计算。
所以唯一真正的区别在于RelativeLayouts能够以更复杂的XML为代价,更好地控制相对位置。
另一方面,仔细使用基于设备属性提前计算的@dimens,可以避免动态计算,如果使用得当,在需要复杂定位时,RelativeLayouts可以比任何其他布局更高效
答案 1 :(得分:-1)
这取决于背景,没有简单的方法来回答这个问题。已经existing threads进行了类似的讨论,并且认为性能提升可以忽略不计。
RecyclerView
允许您重用现有的ViewHolders。创建一次有限数量的ViewHolders(“RecyclerView池”),并考虑到不同的视图类型。
假设您没有破坏ViewHolder
模式,例如每次在bind方法中膨胀视图,你不太可能感觉到RelativeLayout和LinearLayout根布局之间的区别。
但是,如果您使用某种具有动态大小属性的对象(例如ImageView
,其高度设置为wrap_content并且您将不同的位图加载到其中),则可能会使您的布局无效并再次计算每次致电onBindViewHolder()
。
所以我的假设是,合理使用RelativeLayout不会让你遇到任何性能问题。