And*_*ndy 22 android android-contentprovider android-loadermanager android-cursorloader
我正在浏览一些代码,我意识到我实际上并不知道如何使用连接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);
Run Code Online (Sandbox Code Playgroud)
那么query()
我的自定义方法如何ContentProvider
将其发送到特定的方法CursorAdapter
呢?我只是没有看到连接.我理解其他一切,但这个问题是什么.哦,我应该提一下,代码工作正常.
Ale*_*ood 84
现在,回答你的问题......
query()方法是如何从我的自定义
ContentProvider
...?
好吧,首先要记住,getContentResolver().query()
不直接调用内容提供者的query
方法.您正在调用内容解析程序的查询方法,该方法解析Uri
,确定您要调用的提供程序,然后调用提供程序的query
方法.
如何将查询发送到该特定的
CursorAdapter
?
我将以API演示为例,引导您完成整个过程.请注意,API演示使用的是a ListFragment
而不是a 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);
Run Code Online (Sandbox Code Playgroud)
执行此语句后,它SimpleCursorAdapter
知道如何将游标数据与您的视图相关联.光标Contacts.DISPLAY_NAME
列中的任何数据都将与具有id android.R.id.text1
等的视图相关联.
请注意,您已将null
游标作为构造函数的第三个参数传递.这非常重要,因为我们还没有查询任何数据(这是LoaderManager
和CursorLoader
工作).
接下来,初始化加载器.
getLoaderManager().initLoader(0, null, this);
Run Code Online (Sandbox Code Playgroud)
这告诉LoaderManager
创建并启动Loader
对应的id 0
.
该LoaderManager
电话onCreateLoader(int id, Bundle args)
.
onCreateloader
返回Loader<Cursor>
接口的子类(CursorLoader
在本例中为a).这CursorLoader
将执行初始查询,并在数据更改时自行更新.
如果您的活动/片段有多个加载器,那么您将用于switch(id)
确定已指示开始加载过程的特定加载器.
查询的游标传递给onLoadFinished()
.
在CursorLoader
实例化并在步骤3中返回之后,立即在CursorLoader
单独的线程上执行初始查询并返回游标.当CursorLoader
结束该查询时,它返回新查询光标移动到LoaderManager
,这随后将光标移动到onLoadFinished
方法.从文档中,"在onLoadFinished
先前创建的加载器完成其加载时调用该方法."
查询的数据与CursorAdapter
.
mAdapter.swapCursor(data);
Run Code Online (Sandbox Code Playgroud)
请注意,onLoadFinished
通常也会使用查询的数据更新活动/片段的UI.在这种情况下,这不是必要的,正如我们之前所说的那样setListAdapter(mAdapter)
.该ListFragment
知道如何使用CursorAdapter
(见步骤1)......我们需要做的是通过适配器的光标swapCursor
,而ListFragment
将采取的屏幕为我们上显示数据的照顾.
如果您有任何疑问(或者有任何拼写错误等),请告诉我.
包含查询数据的游标与CursorAdapter
in 关联onLoadFinished
.这通常通过调用来完成mAdapter.swapCursor(data)
.
归档时间: |
|
查看次数: |
20782 次 |
最近记录: |