Стратегия отображения индикатора прогресса при загрузке данных в базу данных SQLite?

Мое приложение состоит из следующих компонентов:

  • поставщик контента для данных, хранящихся в базе данных SQLite
  • ListFragment, который использует CursorAdapter для отображения данных от поставщика контента
  • служба, работающая в фоновом режиме, периодически опрашивающая удаленный URI на наличие новых данных и добавляющая их в базу данных через контент-провайдера.

Вот вызов. Когда ListFragment отображается впервые, база данных пуста. Я использую LoaderManager/CursorLoader для получения данных от провайдера, а ListFragment отображает индикатор выполнения. Проблема в том, что это всегда будет приводить к пустой таблице, так как служба еще не успела опросить удаленный URI.

Пользователь наблюдает примерно следующее:

  • ListFragment отображает индикатор выполнения
  • индикатор прогресса исчезает и отображается пустой список
  • примерно через 3 или 4 секунды служба завершает обновление данных, и они отображаются

Это не интуитивно понятно. Я хотел бы, чтобы индикатор выполнения отображался во время загрузки данных.


Вот обзор того, что у меня есть прямо сейчас.

public class ArticleListFragment extends ListFragment
        implements LoaderManager.LoaderCallbacks<Cursor> {

    //...

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        //...
        mAdapter = new SimpleCursorAdapter(...);
        setListAdapter(mAdapter);
        setListShown(false);
        getLoaderManager().initLoader(0, null, this);
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        return new CursorLoader(...);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        mAdapter.swapCursor(data);
        setListShown(true);
    }

    //...
}

person Nathan Osman    schedule 07.06.2013    source источник


Ответы (1)


Используйте технику ContentObserver и загружайте курсор при изменении данных. Таким образом, вы можете скрыть прогресс, когда вам нужно, например. когда Cursor.getCount() > 0.

person matreshkin    schedule 07.06.2013