22

我正在浏览我的一些代码,我意识到我实际上并不知道 aCursorLoaderLoaderManager组合如何与CursorAdapter连接一起使用。这是我感到困惑的部分。

agendaAdapter = new MyAgendaAdapter(this, null);

makeProviderBundle(new String[] {"_id", "event_name", "start_date", "start_time",
    "end_date", "end_time", "location"}, "date(?) >= start_date and date(?) <= end_date", 
new String[]{getChosenDate(), getChosenDate()}, null);

getLoaderManager().initLoader(0, myBundle, MainDisplayActivity.this);
list.setAdapter(agendaAdapter);

query()那么我自定义的方法如何ContentProvider知道将其发送到特定的CursorAdapter?我只是没有看到联系。我了解其中的所有其他内容,但这个问题是关于什么的。哦,我应该提一下,代码工作正常。

4

1 回答 1

84

首先,查看这篇文章这篇文章中的代码示例,以更深入地了解该过程的工作原理。

现在,回答你的问题...

我自定义的 query() 方法如何ContentProvider...?

好吧,首先要记住,getContentResolver().query()它不会query直接调用内容提供者的方法。您正在调用内容解析器的查询方法,该方法解析Uri,确定您希望调用的提供者,然后调用您的提供者的query方法

查询如何发送到特定的CursorAdapter

我将使用API 演示作为示例,引导您完成整个过程。请注意,API 演示使用 aListFragment而不是 a ListActivity(在此问题的上下文中差异并不重要)。


  1. 首先,创建(并设置)CursorAdapter .

    mAdapter = new SimpleCursorAdapter(
            getActivity(),
            android.R.layout.simple_list_item_2, 
            null,
            new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS },
            new int[] { android.R.id.text1, android.R.id.text2 }, 
            0);
    

    执行此语句后,SimpleCursorAdapter知道它应该如何将游标数据与您的视图相关联。光标Contacts.DISPLAY_NAME列中的任何数据都将与具有 idandroid.R.id.text1等的视图相关联。

    请注意,您已将null游标作为第三个参数传递给构造函数。这非常重要,因为我们还没有查询任何数据(这是LoaderManagerandCursorLoader的工作)。

  2. 接下来,初始化加载器。

    getLoaderManager().initLoader(0, null, this);
    

    这告诉LoaderManager创建和启动Loader对应的 id 0

  3. LoaderManager来电onCreateLoader(int id, Bundle args)。_

    onCreateloader返回Loader<Cursor>接口的子类(即 a CursorLoader,在这种情况下)。这CursorLoader将执行初始查询,并在数据更改时自行更新。

    如果您的活动/片段有多个加载器,那么您将使用switch(id)来确定已指示开始加载过程的特定加载器。

  4. 查询的游标被传递给onLoadFinished().

    CursorLoader在步骤 3 中实例化并返回后,立即在CursorLoader单独的线程上执行初始查询并返回游标。当CursorLoader完成查询时,它将新查询的游标返回给LoaderManager,然后将游标传递给onLoadFinished方法。从文档中,“onLoadFinished当先前创建的加载器完成加载时调用该方法。”

  5. 查询的数据与CursorAdapter.

    mAdapter.swapCursor(data);
    

    请注意,这onLoadFinished通常也是您使用查询数据更新活动/片段的 UI 的地方。在这种情况下,这不是必需的,正如我们之前所说的那样setListAdapter(mAdapter)ListFragment知道如何使用(见第CursorAdapter1 步)... 我们需要做的就是将光标传递给适配器swapCursor,然后我们ListFragment将负责在屏幕上显示数据。

如果您有任何问题(或者是否有任何错别字等),请告诉我。


TL;博士

包含查询数据的游标与CursorAdapterin相关联onLoadFinished。这通常通过调用来完成mAdapter.swapCursor(data)

于 2012-06-22T15:04:38.917 回答