【问题标题】:How do native Android 4.0 apps have very fast scrolling ListViews?原生 Android 4.0 应用程序如何具有非常快速的滚动 ListViews?
【发布时间】:2012-01-09 04:49:03
【问题描述】:

我正在比较性能,特别是我创建的应用程序 ListView 的滚动速度与原生 Android 4.0 应用程序(Gmail、Gtalk 等)。

我注意到的一件事是,ListView 在原生 Android 应用程序上的滚动帧速率非常高——接近 60fps。在我的应用程序中,ListView 的滚动速度几乎没有。

假设我错误地使用了ListView(我没有——我已经按照这里所说的一切:http://www.youtube.com/watch?v=wDBM6wVEO70),我决定创建一个虚拟的ListView,它只返回一打几乎是空的@987654327 @ 视图,因为它是行(是的,我正确使用了 convertView )。令人不安的是,我几乎空白的ListView 的滚动性能比任何本机应用程序(Gmail、Gtalk、联系人等)都慢。

附带说明一下,简单的ScrollView 具有非常好的滚动性能,但不建议将ScrollView 用于大型列表。

显然,本机应用程序正在做一些我不理解的事情(或可以访问一些事情)。不幸的是,这些原生应用程序不是开源的。有没有人了解这些原生应用如何实现如此出色的性能?

【问题讨论】:

    标签: android performance listview


    【解决方案1】:

    查看原生邮件应用的源码后发现,消息列表中的列表项是单个View,而不是LinearLayout这样的ViewGroup。这使得视图层次结构非常平坦,从而在滚动列表时产生更好的帧速率。我想我记得看过 Romain Guy(主要 Android UI 工程师之一)的演讲视频,其中提到 Gmail 团队做了类似的事情来提高性能。 要自己实现这一点,您必须继承 View 并在 onDraw() 方法中自己绘制 View 中的所有内容。

    Here 是当前电子邮件应用程序中消息列表项的来源。

    他们做了一个很酷的技巧,你膨胀一个视图(但不附加它),根据它所在的 ViewGroup 获取项目所在位置的坐标,并将坐标缓存在地图中,这样当视图在列表中回收,您不必再次夸大该视图。我可能会在我未来的项目中尝试这个!

    我希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      有一些技术可以使ListView 更快:缓存并使用消失的列表项作为新的列表项,以避免创建它们的长时间操作。您需要基于ListView 创建自己的类来实现这些技术。阅读更多here

      【讨论】:

      【解决方案3】:

      我还关注了该视频来构建我的列表视图。在我的应用程序中,项目(行)不多。但我认为,如果我们按照视频所说的那样做,我们就在正确的道路上,至少在理论上是这样?

      【讨论】:

      • 我同意理论上只要我们跟着视频走,我们就在正确的轨道上。但将结果与本机应用程序进行比较证明并非如此。
      猜你喜欢
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      相关资源
      最近更新 更多