​CursorLoader​​​ returns its query results to your implementation of​​LoaderCallbacks.onLoadFinished()​​​, in the form of a ​​Cursor​​​. In the callback, you can update your data display, do further processing on the​​Cursor​​ data, and so fort

When the loader framework detects changes to data associated with the query, it resets the​​CursorLoader​​​, closes the current ​​Cursor​​​, and then invokes your implementation of​​onLoaderReset()​​​. Use this callback to delete references to the current​​Cursor​​​; 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 a​​ListView​​​ 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 returned​​Cursor​​​ to the ​​SimpleCursorAdapter​​​. Changing the​​Cursor​​​ in the ​​SimpleCursorAdapter​​​ triggers a refresh of the​​ListView​​ 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 the​​Cursor​​​ becomes invalid. This usually occurs because the data associated with the​​Cursor​​​ has changed. Before re-running the query, the framework calls your implementation of​​onLoaderReset()​​​. In this callback, make sure to prevent memory leaks by deleting all references to the current​​Cursor​​​. 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); }