【问题标题】:Populating an Android ListView with multiple data sources (using Loaders)使用多个数据源填充 Android ListView(使用加载器)
【发布时间】:2012-12-31 05:48:49
【问题描述】:

我有三个数据库表:StacksDatesZ,其中Stacks 是我的主表,DatesZ 是“子”表,带有一个外键列,链接到Stacks 的主键列。 (请原谅我的术语,如果需要,我可以提供架构。)

以后我将只提及StacksDates,以降低我解释的复杂性,但如果相关,Z 的使用方式将与Dates 完全相同。

在典型的ListFragment 中,我使用LoaderManager reference page 上讨论的实现构造了一个ListView - 创建一个空适配器,然后在我的查询完成时将Cursor 换出(查询在@ 987654338@ 并换成onLoadFinished())。

我查询Stacks 表(使用URI,因为我的数据库前面是Content Provider,使用Simple Content Provider library 实现),作为我想绑定到@ 中每个列表项的值适配器中的 987654343@ 大部分都在这里找到,并且工作正常。

不过,我还希望绑定Dates 表中的一些值,尽管我不确定如何执行此操作。在使用加载器之前,我会在适配器中创建一个新的SQLiteOpenHelper,并直接在getView() 方法中访问辅助项,即从Dates 表中返回Cursors。这很慢,我很确定事后看来这是个坏主意:P

是否有标准的方法来实现这一点,使用多个数据源(最好使用加载器)填充列表视图?

编辑:

  • Dates 表可能有多个记录(具有不同的值) 对于每个关联的Stack
  • 我有一个 ContentProvider 可以访问所有三个表,具体取决于 URI
  • 我也很乐意使用多个加载器,因为我怀疑无论如何我都必须这样做,因为我需要在片段中显示与ListView 中的内容无关的其他信息。

【问题讨论】:

    标签: android android-contentprovider listadapter android-cursorloader


    【解决方案1】:

    如果您需要逐行执行此操作,您基本上有两种选择:

    1. 在您的 ContentProvider 中预先完成所有操作,例如使用子查询或更复杂的查询。
    2. getView()Adapter 中执行异步查询。这类似于加载远程图像的工作方式。

    这两种方法各有千秋。 #1 可能更简单,但如果您的列表中有很多项目,则可能不够快。 #2 速度很快,因为您只会查询相关日期,但是在滚动时取消(或避免进行)查询可能会很痛苦。

    当您必须执行未知数量的加载时,加载器没有意义。

    【讨论】:

    • 谢谢亚历克斯,我会在接下来的几天里探索这些
    • 我已经决定了第二个选项,然后缓存结果,因此取消是不必要的,就像重新查询一样。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    相关资源
    最近更新 更多