android - 多个 ListAdapter 或单个 ListAdapter,使用过滤(Android 性能)

标签 android performance android-listview

Try to focus on general "dos and donts" regarding lists, e.g. is adding and removing 30 items of a 200 item list better then clearing and repopulating? Or any other tips in this area - I cant really try on my phone, to fast for that :-)

有没有什么办法可以计算出列表操作的内存开销/计算能力。背景如下:

我在页面上有一个 ListView ,该页面有例如底部有 3 个选项卡(全部、搜索、最近)。现在,如果您单击一个选项卡, ListView 应该会显示相应的项目。

现在有两种不同的做法,一种是:

使用单个 ListAdapter,相应地过滤项目
- 如果你点击全部,只需将数据库中的所有项目放入其中
- 如果点击最近,就把符合要求的项目放上

使用两(三..)个 ListAdapter,每个类别一个
- 如果点击全部,将列表的 setAdapter() 设置为合适的
- 如果你点击 Recent,setAdapter() 到适当的一个

我们讨论的是包含 200 个项目的列表,这些项目是从数据库中创建的复杂对象。当例如搜索一个项目,输入部分标题,列表应该只显示适当的项目。这些项目不会被重新创建,我只会查询 ID,并使用缓冲的项目(请参阅稍后的数据结构)。

我也不确定的是“在哪里过滤”,我可以在数据库中完成(从标题 LIKE abc 中选择)然后 EITHER:

  • 从列表中删除不匹配的项目并添加所有匹配(但不包括)的项目
  • 清除整个列表,添加所有匹配的项目

再次说明App数据的结构:

  • 数据库,带有简单的原始条目(带有 ID + 标题 + ...)
  • HashSet 具有复杂条目,从数据库创建一次,只读 + 总是所有条目
  • ArrayList ListView 中显示的当前条目

希望您明白我的意思,我正在尝试感受一下“昂贵”的操作。也许,作为最后的回答动机,我会写下一些案例,你可以就它们的成本发表意见:

  1. 从数据库中选择 N 个项目(仅 ID),标题为“LIKE”
  2. 使用“title.contains()”迭代包含 200 个项目的列表并仅使用匹配项
  3. 从 ListView 显示的数组列表中删除 100 项
  4. 从未显示的数组列表中删除 100 项,然后连接并显示

感谢您的任何反馈,或对不良做法的任何提示。通过处理可见的列表元素,特别是可能的事件触发问题,而不是先“在后台”执行,然后设置一个新的 ListAdapter

最佳答案

我看到你已经接受了一个答案,但我想我不同意,因为 ArrayList 必须复制所有元素,如果在中间添加或删除了一个元素。

我知道您已经有了包含所有条目的 HashSet

在那种情况下,我认为最高效的适配器是自定义 ListAdapter,灵感来自 ArrayAdapter

  • 您的适配器存储所有条目的 ArrayList mAllObjects(对于“所有”选项卡)。
  • 您的适配器存储最近条目的 ArrayList mRecentObject(对于“最近”选项卡)
  • 您的适配器存储匹配条目的 ArrayList mMatchObject(用于“搜索”选项卡)
  • 你的适配器有两个过滤器
    • 最近的过滤器返回 mRecentObject 列表(如果它不存在则创建它)
    • 匹配过滤器创建一个新的 mMatchObject 列表并添加匹配元素。这里没有要进行的优化。 ArrayList 上的 delete() 方法是 O(n)。

关于android - 多个 ListAdapter 或单个 ListAdapter,使用过滤(Android 性能),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8378459/

相关文章:

java - 如何缩短类似按钮的 findViewById 和 setOnClickListener ?

android - 如何在不同页面之间的 webview android 中保持缩放和位置级别?

c# - 在 Azure 缓存中存储大于 8MB 的对象的技术

performance - mongodb 的索引

Android - CustomCursorAdapter 和 ListView 中的 getView()?

android - 简单的颜色选择器

android - 使用 swipeRefreshLayout 更新自定义适配器中的数据

javascript - 在 javascript 中,访问 'window.Math' 比访问没有 'Math' 的 'window.' 对象慢还是快?

Android:Listview 的 onItemClick() 事件未被调用

android - 如何在特定索引处获取 ListView 的 subview