java - 具有许多不同 View 的 ListView 适配器

标签 java android performance

这个问题更多的是关于效率而不是任何错误,因为我已经用几种不同的方式构建了这个,但无法全面减少延迟,因为我尝试的每种策略都有其自身的缺点。

所以我的要求是我有一个 ListView,其中包含未知但可能非常大(数万)的数据量。当我提取数据时,我需要按传入项目发生的日期以及其所属游戏的变体对传入项目进行排序。例如。

List
    List Item 1
        Date header
        Game 1
            Item
        Game 2
            Item
            Item
            Item
    List Item 2
        Date Header
        Game x 
etc...

由于每个 ListItem 可以有不同数量的游戏,每个游戏的项目数量也不同,因此我无法(或尚未找到一种方法)使用适配器有效地重用 View 来创建平滑的滚动效果。

这就是我尝试过的:

  1. 膨胀容器布局,然后在调用其 getView() 方法时在适配器内膨胀/构建游戏。显然,每次调用时都会夸大变化,这会给系统带来沉重负担,并且即使数据量很小,也无法提供流畅的体验。但是,无论列表中的数据量有多少,波动性都非常一致。

  2. 在添加到 ListView 之前构建所有 View ,并让 Adapter 的 getView() 方法简单地返回预构建的 View 。这对于少量数据来说效果很好,但随着添加更多数据就开始变得困难。

我的问题是,我是否缺少更好的方法或优化任一策略的方法?

最佳答案

听起来你可能需要一种叫做“持有人模式”的东西。

这看起来是一个不错的教程:http://www.codeofaninja.com/2013/09/android-viewholder-pattern-example.html

沃盖拉在这里也触及了这个主题:http://www.vogella.com/tutorials/AndroidListView/article.html#adapterperformance_holder

为了避免滚动浏览所有列表,您还可以添加分页,像这个库这样的东西可能会有所帮助:https://github.com/nicolasjafelle/PagingListView

关于java - 具有许多不同 View 的 ListView 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23303089/

相关文章:

c# - 为什么 LZMA SDK (7-zip) 这么慢

java - RabbitMqListener 没有正确监听相同的路由键

java - 从 Java 调用 Python 函数(不使用 Jython,因为它太慢了。)

android - CursorAdapter getCount 0 on back press

android - 以编程方式检测调试 keystore 或发布 keystore

android - 无法在内部目录中保存文件

Java+docker RSS 调整 glibc bug

java - settHeader ("content type"、 "") - 困惑

java - 根据我们需要调用多少页来并行化 while 循环?

python - 与迭代两个大型 Pandas Dataframes 相比提高了效率