0

ユーザーインタラクションまたはOSイベントによってアクティビティの存続期間中に変更される可能性のある同種のアイテムのリストがあるとします。には、の数を示すActivityが含まれています。FragmentPagerListFragment

これらのフラグメントは前述のデータを共有しますが、さまざまな方法で表示します。たとえば、並べ替え順序が異なる場合や、データのサブセットのみが表示される場合などです。現在、各フラグメントは、データのそれぞれの部分をそれぞれの順序で含む個別のリストを保持しています。

データが変更されると、基本的にすべてのフラグメントを更新する必要があります。これは、一部のフラグメントからアイテムを再利用または追加/削除することを意味します。さまざまなフラグメントのデータの一貫性を保つためのベストプラクティスは何ですか?

現在、ある種のオブザーバーオブジェクトがあります。これは、何かが変更されたときに通知され、その後、接続されたフラグメントに通知されます。しかし、いくつかの問題があります。

  • アプリが起動したばかりのとき、一部のフラグメントはFragmentPagerによって作成されていないため、通知することはできません。
  • フラグメントをスワイプすると、一部が一時停止します。この状態では、リストを更新できません。この場合、オブザーバーから切断する必要がありますか?これはにつながります:
  • 変更が発生すると、フラグメントが切断されている間、基本的にそれを見逃します。
  • 等々...
4

3 に答える 3

0

データを Application クラスに保持し、データが変更されたときに表示されるフラグメントのみを更新し、フラグメントの onResume() で常に新しいデータを要求することができます。

于 2012-10-07T19:00:20.593 に答える
0

私が理解していれば、あなたのViewPagerショーは同じデータ (またはその一部) ですが、ビューは異なります。したがって、ViewPagerデータが変更されたときに何らかの行動をとるべきではないと私は信じています。それはアダプターの責任です。

あなたが言った以下の点について:a)内部のフラグメントの作成はViewPagerあなたが管理できます。ViewPager::setOffscreenPageLimit(int limit)メソッドのjavadocを参照してください。b) データが変更されたがフラグメントが一時停止状態の場合、UI で何もしないでください。更新したい場合は onResume() で行います。または、DB の一部のフィールド (ある場合) を「updates present」状態に設定し、Activity( Fragment) が表示されたら確認することをお勧めします。c) 前のオプションと同様 - フラグメントが切断された場合は、更新を無視します。または、その更新に本当に興味がある場合は、スティッキーを使用しますBroadcastReciver(スティッキー BR は高価なものであることに注意してください) 。

于 2012-02-26T22:56:35.027 に答える
0

私がすることは、それぞれListFragmentに a を使用しLoaderてデータをロードさせることです。次に、オブザーバーにFragment(強制終了された可能性がある) にデータを更新するよう通知させる代わりに、それぞれのオブザーバーを登録してLoader、データ ソースがいつ変更されたかを認識し、データ ソースが検出されたときに再クエリを実行するようにします。(データ ソースが SQLite データベースで、 を使用しているContentProvider場合、CursorLoaderがすべての処理を行います)。

これは私が推奨する実装です。

  1. Fragments の動作は自己完結型のままです (つまり、各 s は、特定のViewPagerやに関連付けられていない再利用可能なコンポーネントですActivity)。

  2. 内で破壊される可能性のある を処理しなければならないという複雑さを回避しFragmentますViewPager

Fragment迅速な修正が必要な場合は、Ivan が提案するようにs を強制的にメモリに残すことでおそらく回避できますViewPager#setOffScreenPageLimit(int limit)...ただし、これは私の意見では解決策としてはクリーンではありません。

于 2012-10-07T20:15:26.027 に答える