I have a custom ContentProvider
which manages the access to a SQLite database. To load the content of a database table in a ListFragment
, I use the LoaderManager
with a CursorLoader
and a CursorAdapter
:
public class MyListFragment extends ListFragment implements LoaderCallbacks<Cursor> {
// ...
CursorAdapter mAdapter;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAdapter = new CursorAdapter(getActivity(), null, 0);
setListAdapter(mAdapter);
getLoaderManager().initLoader(LOADER_ID, null, this);
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(getActivity(), CONTENT_URI, PROJECTION, null, null, null);
}
public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
mAdapter.swapCursor(c);
}
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
}
The SQLite database gets updated by a background task which fetches a number of items from a web service and inserts these items into the database through ContentProvider
batch operations (ContentResolver#applyBatch()
).
Even if this is a batch operation, ContentProvider#insert()
gets called for each row is inserted into the database and, in the current implementation, the ContentProvider
calls setNotificationUri()
for each insert command.
The result is that the CursorAdapter
receives bursts of notifications, resulting in the UI being updated too often with consequent annoying flickering effect.
Ideally, when a batch operation is in progress, there should be a way to notify ContentObserver
only at the end of any batch operation and not with each insert command.
Does anybody know if this is possible? Please note I can change the ContentProvider
implementation and override any of its methods.
ContentProvider
implementations of their own. – Hydrodynamic