コードの一部を調べていたところ、CursorLoader
とLoaderManager
の組み合わせをCursorAdapter
接続でどのように使用するかが実際にはわからないことに気付きました。これが私が混乱している部分です。
_agendaAdapter = new MyAgendaAdapter(this, null);
makeProviderBundle(new String[] {"_id", "event_name", "start_date", "start_time",
"end_date", "end_time", "location"}, "date(?) >= start_date and date(?) <= end_date",
new String[]{getChosenDate(), getChosenDate()}, null);
getLoaderManager().initLoader(0, myBundle, MainDisplayActivity.this);
list.setAdapter(agendaAdapter);
_
では、カスタムContentProvider
のquery()
メソッドは、それをその特定のCursorAdapter
に送信することをどのように知っているのでしょうか?接続が表示されません。私はその中の他のすべてを理解していますが、この質問は何ですか。ああ、私が言及する必要があります、コードは正常に動作します。
そして今、あなたの質問に答えるために...
カスタム
ContentProvider
...のquery()メソッドはどのようになっていますか?
まず、getContentResolver().query()
はコンテンツプロバイダーのquery
メソッドを直接呼び出さないことを覚えておいてください。 Uri
を解析し、呼び出すプロバイダーを決定し、次にプロバイダーのquery
を呼び出すコンテンツリゾルバーのクエリメソッドを呼び出しています。メソッド 。
クエリはどのようにしてその特定の
CursorAdapter
に送信されますか?
例として APIデモ を使用してプロセスを説明します。 APIデモでは、ListFragment
の代わりにListActivity
を使用することに注意してください(この質問のコンテキストでは、違いは重要ではありません)。
まず、CursorAdapter
を作成(および設定)します。
_mAdapter = new SimpleCursorAdapter(
getActivity(),
Android.R.layout.simple_list_item_2,
null,
new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS },
new int[] { Android.R.id.text1, Android.R.id.text2 },
0);
_
このステートメントが実行された後、SimpleCursorAdapter
は、カーソルデータをビューに関連付ける方法を認識します。カーソルの_Contacts.DISPLAY_NAME
_列にあるデータはすべて、ID _Android.R.id.text1
_などのビューに関連付けられます。
コンストラクターの3番目の引数としてnull
カーソルを渡したことに注意してください。これは非常に重要です。まだデータを照会していないためです(これはLoaderManager
とCursorLoader
の仕事です)。
次に、ローダーを初期化します。
_getLoaderManager().initLoader(0, null, this);
_
これは、ID _0
_に対応するLoaderManager
を作成して開始するようにLoader
に指示します。
LoaderManager
はonCreateLoader(int id, Bundle args)
を呼び出します。
onCreateloader
は、_Loader<Cursor>
_インターフェースのサブクラス(つまり、この場合はCursorLoader
)を返します。このCursorLoader
は最初のクエリを実行し、データが変更されると自動的に更新されます。
アクティビティ/フラグメントに複数のローダーがある場合は、switch(id)
を使用して、読み込みプロセスを開始するように指示された特定のローダーを判別します。
照会されたカーソルはonLoadFinished()
に渡されます。
ステップ3でCursorLoader
がインスタンス化されて返されるとすぐに、CursorLoader
は別のスレッドで初期クエリを実行し、カーソルが返されます。 CursorLoader
がクエリを終了すると、新しくクエリされたカーソルがLoaderManager
に返され、onLoadFinished
メソッドにカーソルが渡されます。ドキュメントによると、「以前に作成されたローダーがロードを終了すると、onLoadFinished
メソッドが呼び出されます。」
クエリされたデータはCursorAdapter
に関連付けられています。
_mAdapter.swapCursor(data);
_
onLoadFinished
は通常、クエリされたデータでアクティビティ/フラグメントのUIを更新する場所でもあることに注意してください。以前にsetListAdapter(mAdapter)
を呼び出したので、この場合、これは必要ありません。 ListFragment
はCursorAdapter
の使用方法を知っています(ステップ1を参照)...必要なのは、アダプターにswapCursor
とListFragment
が画面にデータを表示します。
ご不明な点がございましたら(またはタイプミスなどがありましたら)お知らせください。
クエリされたデータを含むカーソルは、CursorAdapter
のonLoadFinished
に関連付けられています。これは通常、mAdapter.swapCursor(data)
を呼び出すことによって行われます。