複数のローダーを備えたLoaderManager:適切なカーソルローダーを取得する方法


116

複数のローダーがある場合、正しいカーソルを取得する方法はわかりません。次の2つの異なるローダーを定義するとします。

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

次に、onCreateLoader()で、IDに応じて異なる処理を行います。

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {

    if (id==0){
               CursorLoader loader = new CursorLoader(getActivity(),
            MaterialContentProvider.CONTENT_URI,null,null,null,null);
    }else{
               CursorLoader loader = new CursorLoader(getActivity(),
            CustomerContentProvider.CONTENT_URI,null,null,null,null);
            };
    return loader;
} 

ここまでは順調ですね。しかし、正しいCursoradapterの正しいCursorを識別するためのIDを取得しないため、onLoadFinished()で正しいカーソルを取得する方法。

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {


    mycursoradapter1.swapCursor(cursor);
    if(isResumed()){
        setListShown(true);
    }else {
        setListShownNoAnimation(true);
    }



}
//and where to get the cursor for mycursoradapter2

または私は間違っていますが、これは1つのフラグメントで2つの異なるカーソルアダプターの結果を取得するための間違った方法です。


これは本当に良い質問です!それはよく尋ねられており、かなり微妙な問題に触れています。非常に具体的です。
Kurtis Nusbaum、2011年

7
ローダーの戻り値の型がすべてのローダーで同じでない場合、別のハンドラークラスを使用する必要があることに注意してください。ジェネリック型の消去のため、JavaではLoaderCallbacks複数のインターフェース(この場合)を実装できません。タイプ。どちらの場合も結果はであるため、これは単にあなたのケースで機能しますCursor
Matthias

1
@マティアスグレートあなたはそれを言及しました!戻り値の型が異なる2つのローダーを使用する方法を検討しています。では、2つの異なる戻り値の型を持つ2つのローダーの場合はどうでしょうか。1つのローダーで1つのタスクを実行し、代わりにスレッドで別のタスクを実行しますか?
ロバート

@Robertスレッドを使用する必要はありません。2つLoaderのを使用できます。このstackoverflow.com/a/20839825/2818583
AnV

回答:


119

Loaderクラスには、getId()というメソッドがあります。ローダーに関連付けたIDが返されることを願っています。


ありがとう、カーティス!涼しい!試してみますが、うまくいくと思います。私は同じ考えを持っていますが、ローダーオブジェクトを見ていません。代わりにカーソルオブジェクトを確認しました...
Kay Gladen、2011年

Loader.getID()で動作します!今、これを再確認しました。すごい!
Kay Gladen、2011年

2
内部/匿名クラスを使用してこれを行うことを考えているので、各ローダーには、コールバックを取得する独自のオブジェクトがあります。
ジョーズ、2012年

@KurtisNusbaum、なぜそれが正しくないのですか?内部クラスは外部アクティビティと共に破壊されるため、メモリリークなどは発生しません。活動への強い参照して静的クラスが内部クラスと意味的に等価である(外側のクラスへの暗黙的な強参照を保持する。)
マティアス

6
@ジョーズそれは技術的に正しいです。私はそれについて議論していません。しかし、あなたが電話をかけることができるのに、なぜそのすべてのリガマロールが行われるのですgetId()か?
Kurtis Nusbaum

32

ローダーのgetId()メソッドを使用します

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    switch (loader.getId()) {
        case 0:
            // do some stuff here
            break;
        case 1:
            // do some other stuff here
            break;
        case 2:
            // do some more stuff here
            break;
        default:
            break;
    }
}    

8

ローダーに共通するものがない場合は、結果のクラスタイプ(ここではCursor)を使用する場合は、2つの別個のクラスを作成することをお勧めします。LoaderCallbacksインスタンスをます(単にアクティビティ/フラグメントの2つの内部クラスとして)。それぞれが1つのローダー処理専用です。リンゴとオレンジを混ぜるよりも。

あなたのケースでは、データソースと結果の処理の両方が異なるようですが、現在のシナリオを特定して適切なコードブロックにディスパッチするために追加のボイラープレートコードを書く必要があります。


一つ質問があります。Activity実装の目的LoaderCallbacksと通過thisにはgetLoaderManager().initLoader()ことを保証することであるLoaderManager間の通信チャネルとして機能Activityし、Loader経由LoaderCallbacksActivity実装されてLoaderCallbacksいない匿名の内部クラスを作成しているように、ここでその通信チャネルはどのように作成されていますか?
AnV 2016

3
通信チャネルはLoaderCallbacksです。Activityそれ自体をとして使用する必要はありませんLoaderCallbacks。必要なときに複数の通信チャネルを作成する方が簡単です。
BladeCoder 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.