使用多个数据源填充Android ListView(使用加载程序)

时间:2012-12-30 20:29:37

标签: android android-contentprovider listadapter android-cursorloader

我有三个数据库表:StacksDatesZ,其中Stacks是我的主表,Dates和{{1}是'子'表,带有外键列,链接到Z的主键列。 (请原谅我的术语,如果需要,我可以提供架构。)

此后我将仅提及StacksStacks,以减少我的解释的复杂性,但如果相关,Dates的使用方式与Z完全相同Dates

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

我查询Stacks表(使用URI,因为我的数据库是使用Content Provider library实现的Simple Content Provider前面的,因为我想要的值绑定到适配器中getView()中的每个列表项,主要在这里找到,这很好。

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

是否有标准的方法来实现这一点,使用多个数据源填充列表视图(理想情况下使用加载程序)?

编辑:

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

1 个答案:

答案 0 :(得分:1)

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

  1. ContentProvider中预先做好所有事情,例如使用子查询或更复杂的查询。
  2. getView()的{​​{1}}中执行查询异步。这类似于加载远程图像的方式。
  3. 这两种方法都有其优点。 #1可能更简单,但如果您的列表中有很多项目可能不够快。 #2很快,因为您只会查询相关日期,但滚动时取消(或避免制作)查询可能会很痛苦。

    当您必须进行未知数量的装载时,装载机没有意义。