gpt4 book ai didi

android - 膨胀 ListView/RecyclerView 项目时查询数据库的最佳实践

转载 作者:搜寻专家 更新时间:2023-11-01 09:32:53 25 4
gpt4 key购买 nike

我有一个 ListView/RecyclerView。现在,我想为每个项目添加更多信息,并且可以根据项目值在数据库中找到这些信息。你们将如何实现它??

为了最佳实践,我应该在后台线程中查询数据库吗?如果用户快速滚动,我应该取消查询吗?

最佳答案

没有“最佳实践”AFAIK,但以下是您的选项的简短摘要:

在用户滚动时查询 UI 线程

一般而言,在 UI 线程上执行查询通常是一种非常糟糕的做法。在 ListView 中这样做是一种罪过。

也就是说,有一些 ORM 库可以在 UI 线程上执行嵌套对象的延迟加载(例如 GreenDAO)。人们在具有 ListViews 的应用程序中使用这些库,它甚至对其中一些应用程序工作正常。

我强烈反对这种方法。

提前查询所有项目

正如@CommonsWare 提到的,对于中小型集合,您只需将整个数据集加载到后台线程的内存中,然后将其绑定(bind)到 ListView。您需要在加载数据时显示某种进度指示。

“小”和“中”的定义非常模糊,但我想说,如果您确定数据集不会大于几 MB,那么这种方法可以很好地工作。

此方法的缺点是用户需要等待整个数据集加载并绑定(bind)到 ListView。根据数据集的大小和数据库方案的复杂性,这可能需要一段时间。

最初查询预定义数量的项目,然后在用户滚动时执行其他查询

这是所有方案中最复杂的方案,但在某些情况下是不可避免的(例如“无限列表”)。

想法是将一些预定义数量的项目放入 ListView,然后跟踪用户的交互以提供额外的项目。

例如,您最初可以获取 100 个项目,然后当用户滚动到列表末尾时再获取 100 个。

此方案的优化是在用户到达列表末尾之前获取其他项目(假设他滚动浏览 50 个项目时)。这允许创建真正的“无限列表”行为。

请注意,如果您的收藏非常大,您不仅需要注意在用户滚动时添加新项目,还需要注意删除“先前”项目以避免内存不足崩溃。

查询已展示商品的附加信息

有时您希望在项目已经显示后执行一些额外的查询。

在这种情况下,只需在后台执行查询并将数据绑定(bind)到项目即可。

此任务的一个警告是,如果项目的 View 被回收(默认情况下在 RecyclerView 中就是这种情况),那么当您的后台提取完成时,目标 View 可能会显示完全不同的项目。将返回的数据绑定(bind)到此 View 将是一个错误。

处理此问题的一种方法是取消提取。然而,这在实践中很麻烦且容易出错。

更简单的方法是在查询开始时设置transientState标志,并在查询完成时清除它。

关于android - 膨胀 ListView/RecyclerView 项目时查询数据库的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45619169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com