4

私は、ViewPagerとFragmentPagerAdapterでFragmentActivityを持っています。Android FragmentPagerAdapter with LoaderManager

ViewPagerの各フラグメントは、Webサービスからデータをロードする必要があります。私はLoaderManager /カスタムローダを記述してWebサービス呼び出しを実行し、XMLなどを解析し、これらはうまく動作しています。

ロードとフラグメントの管理には2つの可能な設計があります。

1)フラグメントの代わりにローディングを管理する主なアクティビティ。

フラグメントは、データを要求するメインのFragmentActivityにコールバックします。アクティビティーは、そのデータのローダーがすでに実行中であるかどうかをチェックし、ローダーが作成されていない場合はロードを実行します。

この場合、データがロードされ、ペイントの準備ができていることをどのようにフラグメントに伝えますか。私はカスタムローダーをsimplecursorsではなく使用しています。そのため、フラグメントはオブジェクトインスタンスからtextviewsなどを移入するので、オブジェクトが移入されたときにそれを伝える必要があります。

FragmentPagerAdapterは、getItemでインスタンス化するときにフラグメントにタグまたはIDを割り当てることはできません。 FragmentActivityからフラグメントを見つけてデータにペイントするように指示するにはどうすればよいですか?

2)各フラグメントは、独自のローディングを管理します。

フラグメントは、独自のローダを初期化し、各フラグメントは、独自のonCreateLoader/onLoaderFinishなどがあり

そのページオフユーザーページ場合ローダーはフラグメントを実行している間、私はここに渡って来て問題があるように思われます破壊される(時々)。その結果、onLoaderFinishedは呼び出されておらず、フラグメントは主アクティビティに終了したことを伝えることができません。主なアクティビティは、アクションバーの進行状況インジケータ(setProgressBarIndeterminateVisibility)を制御しています。

FragmentPagerAdapter、独自のローダーを必要とするいくつかのページを持つViewPagerを持っているときに最も良いデザインパターンは何ですか?

私が遭遇したもう1つの問題は、getSupportLoaderManagerを使用してローダーが実行されているかどうかを確認することです。私はonLoadFinishedからこれを呼び出します。実行中のローダーがない場合は、進行状況インジケーターを非表示にすることができます。しかし、すべてのローダーが完了していても、hasRunningLoadersはtrueを返すことがあります。何かアドバイスやいくつかのまともなサンプルの方向に私を指しているため

 LoaderManager lm = getSupportLoaderManager(); 

    // If the loader is not already running, start it... 
    if (! lm.hasRunningLoaders()) { 
     setProgressBarIndeterminateVisibility(Boolean.FALSE); 
    } 

感謝します。

Ta Martin。

答えて

0

デザイン1に関しては、私が作成するフラグメントに参照変数を保持することによって、このようなことをしました。 FragmentPagerAdapterのgetItemメソッドでは、作成したフラグメントを返す前にその変数に割り当てることができます。これにより、メインアクティビティからのフラグメントへのアクセスが許可されます。

+0

ありがとうございます。ユーザーが別のページに移動したときにFragmentPagerAdapterがフラグメントを解放すると、destroyItemをオーバーライドして参照を削除する必要があると思います。次に、getItemが再度呼び出されたときに新しく作成されたフラグメントに新しい参照を再追加します。 Shame FragmentPagerAdapterは、管理しているフラグメントの検索をサポートしていません。 私は、各断片がかなり愚かではなく、それが与えられたデータを表示する方法を知っている方が良いかどうか、または各断片が独自のデータを読み込むほうが良いかどうかという2つの考えがあります。 – MartinS

0

これは完全に正しいかわかりませんが、ローダーがバックグラウンドでデータを取得しているときにフラグメントが破棄されると、メソッドが呼び出されます(onLoaderFinishedではなく)。これにより、進捗インジケータを適切にリセットすることができます。