处理查询的结果
最后更新于:2022-04-01 01:46:23
> 编写:[kesenhoo](https://github.com/kesenhoo) - 原文:[http://developer.android.com/training/load-data-background/handle-results.html](http://developer.android.com/training/load-data-background/handle-results.html)
正如前面一节课讲到的,你应该在 [onCreateLoader()](#)的回调里面使用CursorLoader执行加载数据的操作。Loader查询完后会调用[Activity](# "An activity represents a single screen with a user interface.")或者FragmentActivity的[LoaderCallbacks.onLoadFinished()](#)将结果回调回来。这个回调方法的参数之一是[Cursor](#),它包含了查询的数据。你可以使用Cursor对象来更新需要显示的数据或者进行下一步的处理。
除了[onCreateLoader()](#)与[onLoadFinished()](#),你也需要实现[onLoaderReset()](#)。这个方法在CursorLoader检测到[Cursor](#)上的数据发生变化的时候会被触发。当数据发生变化时,系统会触发重新查询的操作。
### Handle Query Results
为了显示CursorLoader返回的Cursor数据,需要使用实现AdapterView的类,并为这个类绑定一个实现了CursorAdapter的Adapter。系统会自动把Cursor中的数据显示到View上。
你可以在显示数据之前建立View与Adapter的关联。然后在[onLoadFinished()](#)的时候把Cursor与Adapter进行绑定。一旦你把Cursor与Adapter进行绑定之后,系统会自动更新View。当Cursor上的内容发生改变的时候,也会触发这些操作。
例如:
~~~
public String[] mFromColumns = {
DataProviderContract.IMAGE_PICTURENAME_COLUMN
};
public int[] mToFields = {
R.id.PictureName
};
// 取得ListView的引用[原词是句柄handle]
ListView mListView = (ListView) findViewById(R.id.dataList);
/*
* 为ListView定义一个SimpleCursorAdapter
*/
SimpleCursorAdapter mAdapter =
new SimpleCursorAdapter(
this, // 当前上下文
R.layout.list_item, // 一个只有单行的文本的布局
null, // 暂时还没有Cursor游标
mFromColumns, // 要使用游标的列
mToFields, // Layout fields to use
0 // No flags
);
// 为View设置适配器
mListView.setAdapter(mAdapter);
...
/*
* 定义CursorLoader完成查询时候的回调
*/
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
...
/*
* 转移查询结果给适配器,并激发适配器更新前端的ListView数据
*/
mAdapter.changeCursor(cursor);
}
~~~
### Delete Old Cursor References
当Cursor失效的时候,CursorLoader会被重置。这通常发生在Cursor相关的数据改变的时候。在重新执行查询操作之前,系统会执行你的[onLoaderReset()](#)回调方法。在这个回调方法中,你应该删除当前Cursor上的所有数据,避免发生内存泄露。一旦onLoaderReset()执行结束,CursorLoader就会重新执行查询操作。
例如:
~~~
/*
* CursorLoader被重置时调用。举个栗子,当提供者中的数据发生变动Cursor变得陈旧
* 时会被调用。
*/
@Override
public void onLoaderReset(Loader<Cursor> loader) {
/*
* 清除适配器里对Cursor的引用,可以防止内存泄漏。
*/
mAdapter.changeCursor(null);
}
~~~