CursorLoader
returns its query results to your implementation ofLoaderCallbacks.onLoadFinished()
, in the form of a Cursor
. In the callback, you can update your data display, do further processing on theCursor
data, and so forth. http://blog.csdn.net/sergeycao
When the loader framework detects changes to data associated with the query, it resets theCursorLoader
, closes the current Cursor
, and then invokes your implementation ofonLoaderReset()
. Use this callback to delete references to the currentCursor
; when the loader framework destroys the Cursor
, you won't have outstanding references that cause memory leaks.
Handle Query Results
The following two snippets are an example of displaying the results of a query, using aListView
backed by a SimpleCursorAdapter
.
The first snippet shows the ListView
and SimpleCursorAdapter
:
// Gets a handle to the Android built-in ListView widget mListView = ((ListView) findViewById(android.R.id.list)); // Creates a CursorAdapter mAdapter = new SimpleCursorAdapter( this, // Current context R.layout.logitem, // View for each item in the list null, // Don't provide the cursor yet FROM_COLUMNS, // List of cursor columns to display TO_FIELDS, // List of TextViews in each line 0 // flags ); // Links the adapter to the ListView mListView.setAdapter(mAdapter);
The next snippet shows an implementation of onLoadFinished()
that moves the query results in the returnedCursor
to the SimpleCursorAdapter
. Changing theCursor
in the SimpleCursorAdapter
triggers a refresh of theListView
with the new data:
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { /* * Move the results into the adapter. This * triggers the ListView to re-display. */ mAdapter.swapCursor(cursor); }
Handle a Loader Reset
The loader framework resets the CursorLoader
whenever theCursor
becomes invalid. This usually occurs because the data associated with theCursor
has changed. Before re-running the query, the framework calls your implementation ofonLoaderReset()
. In this callback, make sure to prevent memory leaks by deleting all references to the currentCursor
. Once you return from onLoaderReset()
, the loader framework re-runs the query.
For example:
public void onLoaderReset(Loader<Cursor> loader) { // Remove the reference to the current Cursor mAdapter.swapCursor(null); }