我正在检查一些代码,但我意识到我实际上并不知道如何将CursorLoader
和LoaderManager
组合与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 post和this 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
游标作为构造函数的第三个参数传递。这非常重要,因为我们尚未查询任何数据(这是LoaderManager
和CursorLoader
的工作)。 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/