22

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);

query()それで、私のカスタムからのメソッドは、ContentProviderそれをその特定のものに送信することをどのように知っていますCursorAdapterか?接続が表示されません。私はその中の他のすべてを理解していますが、この質問は何ですか。ああ、私が言及する必要があります、コードは正常に動作します。

4

1 に答える 1

84

まず、この投稿この投稿のコードサンプルをチェックして、プロセスがどのように機能するかをさらに詳しく調べてください。

そして今、あなたの質問に答えるために...

私のカスタムからのquery()メソッドはどのようにContentProvider...?

まずgetContentResolver().query()、コンテンツプロバイダーのqueryメソッドを直接呼び出さないことを覚えておいてください。コンテンツリゾルバーのクエリメソッドを呼び出しています。このメソッドは、を解析し、Uri呼び出すプロバイダーを決定してから、プロバイダーのメソッドを呼び出しますquery

クエリはどのようにしてその特定のものに送信されますCursorAdapterか?

例としてAPIデモを使用してプロセスを説明します。APIデモでは、のListFragment代わりにを使用していることに注意してくださいListActivity(この質問のコンテキストでは違いは重要ではありません)。


  1. まず、を作成(および設定)し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、カーソルデータをビューに関連付ける方法がわかります。カーソルの列にあるデータはすべて、idなどContacts.DISPLAY_NAMEのビューに関連付けられます。android.R.id.text1

    nullコンストラクターに3番目の引数としてカーソルを渡したことに注意してください。まだデータを照会していないため、これは非常に重要LoaderManagerです(これはとCursorLoaderの仕事です)。

  2. 次に、ローダーを初期化します。

    getLoaderManager().initLoader(0, null, this);
    

    これは、に対応するidLoaderManagerを作成して開始するように指示します。Loader0

  3. LoaderManager呼び出しonCreateLoader(int id, Bundle args)。_

    onCreateloaderLoader<Cursor>インターフェイスのサブクラス(つまりCursorLoader、この場合はa)を返します。これCursorLoaderにより、最初のクエリが実行され、データが変更されると自動的に更新されます。

    アクティビティ/フラグメントに複数のローダーがある場合switch(id)は、ロードプロセスを開始するように指示された特定のローダーを決定するために使用します。

  4. 照会されたカーソルはに渡されonLoadFinished()ます。

    CursorLoaderステップ3でインスタンス化されて返された直後に、はCursorLoader別のスレッドで初期クエリを実行し、カーソルが返されます。クエリがCursorLoader終了すると、新しくクエリされたカーソルがに戻り、メソッドLoaderManagerにカーソルが渡されます。onLoadFinishedドキュメントから、「onLoadFinished以前に作成されたローダーがロードを終了したときにメソッドが呼び出されます。」

  5. クエリされたデータはに関連付けられていCursorAdapterます。

    mAdapter.swapCursor(data);
    

    これonLoadFinishedは通常、クエリされたデータでアクティビティ/フラグメントのUIを更新する場所でもあることに注意してください。以前に呼び出したように、この場合、これは必要ありませんsetListAdapter(mAdapter)。使用ListFragment方法を知っていますCursorAdapter(手順1を参照)...必要なのは、アダプタにカーソルを渡すだけです。これによりswapCursorListFragment画面にデータが表示されます。

ご不明な点がございましたら(またはタイプミスなどがございましたら)お知らせください。


TL; DR

CursorAdapterクエリされたデータを含むカーソルは、 inに関連付けられていますonLoadFinished。これは通常、を呼び出すことによって行われmAdapter.swapCursor(data)ます。

于 2012-06-22T15:04:38.917 に答える