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 中显示的当前条目
希望您明白我的意思,我正在尝试感受一下“昂贵”的操作。也许,作为最后的回答动机,我会写下一些案例,你可以就它们的成本发表意见:
- 从数据库中选择 N 个项目(仅 ID),标题为“LIKE”
- 使用“title.contains()”迭代包含 200 个项目的列表并仅使用匹配项
- 从 ListView 显示的数组列表中删除 100 项
- 从未显示的数组列表中删除 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/