У меня есть пользовательский ContentProvider, который управляет доступом к базе данных SQLite. Чтобы загрузить содержимое таблицы базы данных в ListFragment, я использую LoaderManager с CursorLoader и 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);
}
}
База данных SQLite обновляется с помощью фоновой задачи, которая извлекает несколько элементов из веб-службы и вставляет эти элементы в базу данных с помощью ContentProvider пакетных операций (ContentResolver#applyBatch()).
Даже если это пакетная операция, вызывает вызов ContentProvider#insert() для каждой строки, которая вставляется в базу данных, а в текущей реализации ContentProvider вызывает setNotificationUri() для каждой команды вставки.
В результате CursorAdapter получает всплески уведомлений, в результате чего пользовательский интерфейс часто обновляется с последующим раздражающим мерцающим эффектом.
В идеале, когда выполняется пакетная операция, должен быть способ оповестить ContentObserver только в конце любой пакетной операции, а не с каждой командой вставки.
Кто-нибудь знает, возможно ли это? Обратите внимание, что я могу изменить реализацию ContentProvider и переопределить любые его методы.