在Android上应对复杂的布局

时间:2011-05-25 21:58:25

标签: android performance layout android-layout

我们有一个数据驱动的活动,它构造一个大型集合(通常最多100个)类Button组件并将它们放在Scrollable中。每个按钮都是从资源中膨胀的,并且基于RelativeLayout。该按钮有两个文本视图,两个图像视图 - 均来自资源 - 并具有9个补丁的背景。

图像视图的大小,位置,文本和配置都是从数据库查询驱动的。

不幸的是,在HTC Desire上布局需要2-3秒,在HTC旧金山或HTC蓝宝石上需要3-5秒。

初始布局完成后,视图效果非常好。

我们已经尝试了许多没有区别的策略:

  • 数据库查询的时间 - 这不是延迟的重要部分。
  • 缓存按钮,以减少布局通胀量。
  • 在“实时”视图层次结构之外构建视图子树,然后在完成时连接它。
  • 在另一个线程上执行相同操作,但将子树连接到UI线程上的活动。

我们有一个无限期的进度指示器(spinner / throbber),当查询在另一个线程上运行时会旋转,但在布局开始时会冻结。

所以,我的问题是:

  • 如何使视图的布局看起来更具响应性
  • 如何在布局发生时避免陷入困境

感谢。

修改

滚动条设置为水平和垂直滚动。所以我们有一个网格,屏幕是一个视口。

这使得使用内置的ListView(乍一看)不适合该任务。

1 个答案:

答案 0 :(得分:0)

进度指示器在布局期间不会重绘,因为它都发生在UI线程中。

为了提高性能,您应该使用ListView,它是可滚动的,并且可以自定义项目(您可以重复使用基于RelativeLayout的“按钮”)和自定义适配器,并且它允许回收滚动时的项目。请参阅Recycling views in a listview, worth it?,最重要的是excerpt from CommonsWare's book on Android