399

FragmentPagerAdapterとはどう違いFragmentStatePagerAdapterますか?

FragmentPagerAdapterGoogle のガイドについては次のように述べています。

このバージョンのページャーは、一連のタブなど、通常はより静的なフラグメントをページングする必要がある場合に使用するのに最適です。ユーザーがアクセスする各ページのフラグメントはメモリに保持されますが、ビュー階層が表示されない場合は破棄される可能性があります。フラグメントインスタンスは任意の量の状態を保持できるため、これにより大量のメモリが使用される可能性があります。より大きなページのセットについては、 を検討してFragmentStatePagerAdapterください。

そして約FragmentStatePagerAdapter

このバージョンのページャーは、多数のページがある場合に便利で、リスト ビューのように機能します。ページがユーザーに表示されない場合、フラグメント全体が破棄され、そのフラグメントの保存された状態のみが保持されます。FragmentPagerAdapterこれにより、ページ間の切り替え時に潜在的に多くのオーバーヘッドが発生するのと比較して、ページャーは訪問した各ページに関連付けられたメモリをはるかに少なく保持でき ます。

だから私は3つの断片しか持っていません。しかし、それらはすべて、大量のデータを含む個別のモジュールです。

Fragment1一部のデータ (ユーザーが入力する) を処理し、アクティビティを介して に渡します。Fragment2これは単純なListFragmentです。Fragment3ListFragmentです。

私の質問は次のとおりです。どのアダプターを使用すればよいですか? FragmentPagerAdapterまたはFragmentStatePagerAdapter

4

8 に答える 8

313

ドキュメントが言うように、このように考えてください。ブック リーダーのようなアプリケーションを実行する場合、すべてのフラグメントを一度にメモリにロードする必要はありません。Fragmentsユーザーが読み取るときに、ロードして破棄したいと考えています。この場合、 を使用しますFragmentStatePagerAdapterBitmaps大量のデータ ( など)を含まない 3 つの「タブ」のみを表示している場合は、適切なFragmentPagerAdapter場合があります。また、ViewPagerデフォルトでは 3 つのフラグメントがメモリにロードされることに注意してください。最初Adapterに言及したものはView階層を破棄し、必要に応じて再ロードする可能性があります.2番目Adapterのものはの状態のみを保存しFragment、完全に破棄します.ユーザーがそのページに戻った場合、状態が取得されます.

于 2013-09-11T17:57:12.570 に答える
39

ドキュメントまたはこのページの回答で明示的に述べられていないこと (@Naruto によって暗示されている場合でも) はFragmentPagerAdapter、フラグメントをメモリに保持するため、フラグメント内のデータが変更された場合にフラグメントが更新されないことです。

したがって、表示するフラグメントの数が限られている場合でも、フラグメントを更新できるようにする場合 (たとえば、クエリを再実行してフラグメントの listView を更新する場合など) は、FragmentStatePagerAdapter を使用する必要があります。

ここで私が言いたいのは、フラグメントの数と、それらが類似しているかどうかは、常に考慮すべき重要な側面ではないということです。フラグメントが動的かどうかも重要です。

于 2015-06-20T04:43:47.943 に答える
0

ドキュメントによると:

各フラグメントのライフサイクルを管理する標準 PagerAdapter には、FragmentPagerAdapter と FragmentStatePagerAdapter の 2 種類があります。どちらもフラグメントでうまく機能しますが、さまざまなシナリオにより適しています。

  • FragmentPagerAdapter は、ユーザーがフラグメント間を移動できる限り、フラグメントをメモリに格納します。フラグメントが表示されない場合、PagerAdapter はフラグメントをデタッチしますが、破棄しないため、フラグメント インスタンスは FragmentManager 内で存続します。アクティビティがシャットダウンしたときにのみメモリから解放されます。これにより、ページ間の移行が高速かつスムーズになりますが、多くのフラグメントが必要な場合、アプリでメモリの問題が発生する可能性があります。

  • FragmentStatePagerAdapter は、ユーザーに表示されないすべてのフラグメントを確実に破棄し、保存された状態のみを FragmentManager に保持するようにするため、この名前が付けられました。ユーザーがフラグメントに戻ると、保存された状態を使用してフラグメントが復元されます。この PagerAdapter に必要なメモリははるかに少なくなりますが、ページを切り替えるプロセスは遅くなる可能性があります。

于 2021-12-09T10:26:58.077 に答える