私のアプリは次のコンポーネントで構成されています。
- 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);
}
//...
}