【问题标题】:Coping with complex layouts on Android应对 Android 上的复杂布局
【发布时间】:2011-05-25 21:58:24
【问题描述】:

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

图像视图的大小、位置、文本和配置均由数据库查询驱动。

不幸的是,在 HTC Desire 上布局需要 2-3 秒,在 HTC San Francisco 或 HTC Sapphire 上需要 3-5 秒。

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

我们尝试了许多策略,但没有任何区别:

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

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

所以,我的问题是:

  • 如何使视图的布局看起来更具响应性
  • 如何避免在布局发生时锁定 thobber

谢谢。

编辑

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

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

【问题讨论】:

标签: android performance layout android-layout


【解决方案1】:

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

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

【讨论】:

  • 列表视图不适合数据,因为网格需要水平和垂直滚动。
猜你喜欢
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多