android - 原生 Android 4.0 应用程序如何具有快速滚动的 ListViews?

标签 android performance listview

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

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

假设我错误地使用了 ListView(我没有 - 我已经遵循了此处所述的所有内容:http://www.youtube.com/watch?v=wDBM6wVEO70),我决定创建一个虚拟 ListView 只返回十几个几乎为空的 LinearLayout View ,因为它是行(是的,我正确使用了 convertView)。令人不安的是,我几乎空白的 ListView 的滚动性能比任何 native 应用程序(Gmail、Gtalk、联系人等)都慢。

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

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

最佳答案

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

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

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

希望对您有所帮助!

关于android - 原生 Android 4.0 应用程序如何具有快速滚动的 ListViews?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8784050/

相关文章:

Android gradle 在每次构建时上传 NDK 符号

android - Mvvmcross:与安卓服务交互

Java foreach 效率

c# - 通过按钮在 ListView 中进行单选

java - Android 预览中的空白屏幕

android - 如何检测使用STREAM_VOICE_CALL或Android中的音频扬声器?

java - 在 Java 中检测偶数的最有效方法是什么?

mysql - 提高 MySQL 中的 count() 性能

listview - 对 ListView<> 中的项目进行排序

java - 填充 ListView 组件时出现 NullPointerException