我正在检查一些代码,但我意识到我实际上并不知道如何将CursorLoaderLoaderManager组合与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呢?我只是看不到连接。我理解其中的所有其他内容,但这个问题是关于什么的。哦,我应该提一下,该代码可以正常工作。

最佳答案

首先,请查看this postthis post上的代码示例,以更深入地了解该过程的工作方式。

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



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



我将以API Demos为例向您介绍整个过程。请注意,API演示使用的是ListFragment而不是ListActivity(在此问题中,区别并不重要)。

  • 首先,创建(并设置)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知道如何将光标数据与您的 View 关联。光标的Contacts.DISPLAY_NAME列中的任何数据都将与ID为android.R.id.text1等的 View 相关联。

    请注意,您已将null游标作为构造函数的第三个参数传递。这非常重要,因为我们尚未查询任何数据(这是LoaderManagerCursorLoader的工作)。
  • 接下来,初始化加载程序。
    getLoaderManager().initLoader(0, null, this);
    

    这告诉LoaderManager创建并启动与id Loader对应的0
  • LoaderManager称为onCreateLoader(int id, Bundle args)
    onCreateloader返回Loader<Cursor>接口(interface)的子类(在本例中为CursorLoader)。此CursorLoader将执行初始查询,并在数据更改时自动更新。

    如果您的 Activity /片段有多个加载程序,则可以使用switch(id)来确定已被指示开始加载过程的特定加载程序。
  • 所查询的光标被传递给onLoadFinished()

    在第3步中实例化CursorLoader并返回之后,CursorLoader立即在单独的线程上执行初始查询,并返回一个游标。 CursorLoader完成查询后,它将新查询的游标返回到LoaderManager,然后将其传递给onLoadFinished方法。在文档中,“当先前创建的加载器完成加载时,将调用onLoadFinished方法。”
  • 查询的数据与CursorAdapter 相关联。
    mAdapter.swapCursor(data);
    

    请注意,通常还使用onLoadFinished用查询的数据更新 Activity /片段的UI。在这种情况下,这是没有必要的,因为我们之前已将其称为setListAdapter(mAdapter)ListFragment知道如何使用CursorAdapter(请参阅第1步)...我们要做的就是将适配器的光标传递给swapCursor,并且ListFragment将负责为我们在屏幕上显示数据。

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

    TL; DR

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

    关于android - 带有LoaderManager的CursorLoader如何知道将光标发送到CursorAdapter?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11150527/

    10-10 13:38