ViewPager と FragmentPagerAdapter を持つ FragmentActivity があります。
ViewPager の各フラグメントは、Web サービスからデータをロードする必要があります。Web サービス呼び出しを実行したり、XML を解析したりするために LoaderManager/カスタム ローダーを作成しましたが、これらは正常に動作しています。
ローディングとフラグメントを管理するための 2 つの可能な設計があります。
1) フラグメントに代わってロードを管理するメイン アクティビティ。
フラグメントは、そのデータを要求するメインの FragmentActivity にコールバックします。アクティビティは、そのデータのローダーがすでに実行されているかどうかを確認し、実行されていない場合は、ローダーを作成してロードを実行します。
この場合、データがロードされ、ペイントの準備ができていることをフラグメントにどのように伝えますか。シンプルカーソルではなくカスタムローダーを使用しているため、フラグメントはオブジェクトインスタンスからテキストビューなどを設定するため、オブジェクトが設定されたときに通知する必要があります。
FragmentPagerAdapter では、getItem でフラグメントをインスタンス化するときにタグまたは ID をフラグメントに割り当てることができないようです。FragmentActivity からフラグメントを見つけて、そのデータを描画するように指示するにはどうすればよいですか?
2) 各フラグメントは独自の読み込みを管理します。
フラグメントは独自のローダーを初期化し、各フラグメントには独自の onCreateLoader/onLoaderFinish などがあります。
私がここで遭遇した問題は、ローダーがフラグメントを実行している間にユーザーがそのページからページを離れた場合、(時々) フラグメントが破壊されているように見える場合です。その結果、onLoaderFinished は呼び出されず、フラグメントはメイン アクティビティに終了したことを伝えることができません。メイン アクティビティは、アクションバーで進行状況インジケーター (setProgressBarIndeterminateVisibility) を制御しています。
FragmentPagerAdapter (独自のローダーを必要とする複数のページを持つ ViewPager) がある場合、最適なデザイン パターンは何でしょうか?
私が遭遇した別の問題は、 getSupportLoaderManager を使用してローダーが実行されているかどうかを確認することです。これを onLoadFinished から呼び出します。ローダーが実行されていない場合は、進行状況インジケーターを非表示にできます。ただし、すべてのローダーが完了していても、hasRunningLoaders が true を返すことがあります。
LoaderManager lm = getSupportLoaderManager();
// If the loader is not already running, start it...
if (! lm.hasRunningLoaders()) {
setProgressBarIndeterminateVisibility(Boolean.FALSE);
}
アドバイスや、まともなサンプルの方向性を教えてくれてありがとう。
タ・マーティン。