- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 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/
我需要使用view.getWidth(),但我不能,因为我还没有膨胀 View 。在使用 view.getWidth() 之前如何膨胀 View ? MainActivity 类: p
这个问题很难尝试和表述,但我会尽力而为。 基本上,我有一个应用程序,我想将代码拆分得更多。为了尝试解释这一点,我将举一个我的屏幕示例。 在我的主屏幕上,我有一个标题、用户详细信息、余额、下一个账单详细
我有一个 TableLayout,我在其中动态添加行,一开始是空的,我想在用户单击它时在该行中加载一个 xml。 我已经给行赋值了OnClick方法,但是不知道在onclick方法中进入时如何加载xm
我使用的是 C++ 中的 libcurl 库,这是一个相当大的库(.lib 文件大约 2MB),项目是用 CURL_STATICLIB 编译的 至于现在我只有一个 .cpp 文件,其中包含 heade
背景: 我正在努力使一堆 PNG 尽可能小。我正在使用诸如 PngOut、PngCrush 和 OptiPng 之类的工具。 问题: 我遇到了一个大小为 1434 KB 但只有 230 x 230 像
我一直在努力找出我的应用程序使用的内存不断增长的原因,直到在 heroku 上的生产中它失败并下降。 经过一些相当广泛的研究,使用 Top 观察 RSIZE 在本地增长并使用 Oink 尝试查明我只是
我有一个使用 C++ 版本的 zlibs deflate 压缩的数据 ArrayBuffer(使用默认值)。由于没有服务器,我现在需要在客户端中增加这些数据。我已经使用 C++ 中的默认 inflat
我的代码有问题: @Override public View getView(int position, View convertView, ViewGroup parent) {
我有一个 fragment ,我像下面一样对其进行膨胀,但它给出了运行时错误: public View onCreateView(LayoutInflater inflater, ViewGroup
我正在学习 Fragment,并且我是通过在 Fragment 中使用 FB Login 来学习的。但我不断收到异常 Error inflateing class com.facebook.login
第一种方法: LinearLayout parent = ...; View child = LayoutInflator.inflate(context, parent, true); 第二种方法:
我刚刚完成了一个站点构建,在该站点构建中,我们必须将文件提供给第 3 方以与他们的系统集成。构建必须是独立的,因为会有多方部署它们,能力水平各不相同。 我遇到的问题是,在下载我的 Javascript
我正在寻找一种方法来“扩充”Android XML 布局,这在编译时是未知的。我已经搜索了几个小时,总能找到答案,这是不可能的,因为 LayoutInflater 不能使用简单的 XML 文件。好的,
我有一个从 Faragment 扩展而来的类,叫做 Agenda。它的布局有一个 listView,但是当这个类返回到主 Activity 时,我得到了一个错误。这是错误和代码: > 03-11 13
我的应用程序一启动就崩溃了。我收到以下错误: android.view.InflateException: Binary XML file line #34: Error inflating clas
我想膨胀 R.id.catText,但如果我自己膨胀它,它永远不会显示。如果我inflate R.id.assets(容器),那么两个元素都会正常显示。我只是不想要容器。如何在不膨胀 R.id.ass
我尝试创建自定义 ViewGroup 类,但是当我使用方法 findViewById() 时它返回 null,但展开 View 是可以的。 代码是: public class HorizontalLi
我正在尝试创建一个在屏幕上滑动的 textView,但它会产生错误,但我不知道为什么。这是我的 xml: 还有我的 Activity 课: package com.exampl
我正在构建一个应用程序,我在其中使用了 glomadrain 的动画切换按钮。完成编码后出现以下错误: at com.android.internal.os.ZygoteInit.main(Zygot
我只是想按照 android dev 上的示例代码来膨胀 Activity 中的 fragment 。我有一个更复杂的项目正在工作,但我遇到了与这里的简单项目相同的错误。谁能指出我正确的方向? 扩展
我是一名优秀的程序员,十分优秀!