誰かが同様の状況に陥った場合、私が行ったことは次のとおりです。
- 必要なすべてのクエリを実装
LoaderCallbacks
して処理するクラスを作成しました。
- これに a
Context
とAdapter
問題の を指定します。
- 使用するクエリごとに一意の ID を作成します ( を使用する場合は
UriMatcher
、同じ ID を使用することもできます)。
- に必要なバンドルにクエリを転送する便利なメソッドを作成します。
LoaderCallbacks
- それだけです:)私がしたことを正確に示すために、コードの一部を以下に示します
私のGlobalCallbacks
クラスでは:
public static final String PROJECTION = "projection";
public static final String SELECTION = "select";
public static final String SELECTARGS = "sargs";
public static final String SORT = "sort";
Context mContext;
SimpleCursorAdapter mAdapter;
public GlobalCallbacks(Context context, SimpleCursorAdapter adapter) {
mContext = context;
mAdapter = adapter;
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri contentUri = AbsProvider.customIntMatch(id);
if (contentUri != null) {
return new CursorLoader(mContext, contentUri, args.getStringArray(PROJECTION), args.getString(SELECTION),
args.getStringArray(SELECTARGS), args.getString(SORT));
} else return null;
}
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
mAdapter.swapCursor(arg1);
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
mAdapter.swapCursor(null);
}
CursorLoader
そして、 (Helper.bundleArgs()
は便利なバンドル方法です)を使用したい場合:
scAdapt = new Adapters.NewIndexedAdapter(mHost, getMenuType(),
null, new String[] { "name" }, new int[] { android.R.id.text1 });
getLoaderManager().initLoader(
GlobalCallbacks.GROUP,
Helper.bundleArgs(new String[] { "_id", "name" }),
new GlobalCallbacks(mHost, scAdapt));
setListAdapter(scAdapt);
そしてヘルパーで:
public static Bundle bundleArgs(String[] projection, String selection, String[] selectionArgs) {
Bundle b = new Bundle();
b.putStringArray(GlobalCallbacks.PROJECTION, projection);
b.putString(GlobalCallbacks.SELECTION, selection);
b.putStringArray(GlobalCallbacks.SELECTARGS, selectionArgs);
return b;
}
これが他の誰かに役立つことを願っています:)
編集
より徹底的に説明するには:
- 最初に、null を持つアダプター
Cursor
が初期化されます。アダプターに正しい入力を与えるCursor
ため、GlobalCallbacks
Cursor
onLoadFinished(..)
- 次に、
LoaderManager
新しい を初期化したいことを伝えますCursorLoader
。カーソルの読み込みを監視する新しいGlobalCallbacks
インスタンス ( を実装) を提供します。Loader.Callbacks
アダプターも提供する必要があるため、Cursor
ロードが完了したら新しいものに交換できます。ある時点で、LoaderManager
(OS に組み込まれている) が呼び出され、onCreateLoader(..)
データのGlobalCallbacks
非同期ロードが開始されます。
Helper.bundleArgs(..)
Bundle
クエリの引数を(列の射影、並べ替え順序、WHERE 句など)に入れるだけです。
- 次に、 を設定し
Fragment
ますListAdapter
。この時点ではカーソルはまだ null のままであるため、onLoadFinished()
が呼び出されるまで読み込み中のサインまたは空のメッセージが表示されます。