4

ViewPager を使用して 3 つのフラグメントをスワイプする Android アプリを作成しました (3 つのフラグメントのそれぞれにグリッドビューが含まれています)。

私は最近フラグメントについて学び始め、グリッドビューがフラグメントで作成された後、各フラグメントはメモリ内にあり、再度ロードする必要はないと想定しました。

最近、左のフラグメントから中央のフラグメント、次に右のフラグメントにスワイプすると、一番左のフラグメントのグリッドビューがアダプターで再び満たされる必要があることに気付きました。

一番左のフラグメントから一番右のフラグメントに移動すると、なぜこれが発生するのか疑問に思っていましたが、横に並んだフラグメント間を移動するときはそうではありません。最新のフラグメントのみをメモリに保持し、他のフラグメントを強制終了しますか? それとも、アプリが 3 つのフラグメントすべてをメモリに保持しない理由が他にあるのでしょうか? フラグメント間をすばやく移動すると、私のアプリは少し遅延して遅くなるため、可能であれば各グリッドビューを 1 回だけ描画する必要があると便利です。

onCreate() で arraylist (アダプターの入力に使用) を入力し、onActivityCreated(Bundle savedInstanceState) でアダプターをグリッドビューに入力します。

4

3 に答える 3

6

ViewPager一定量のオフスクリーン タブ (Fragmentもちろん ) をメモリに保持します。デフォルトは、すべてのデバイスで 1 だと思います。したがって、右端までスクロールすると、その左の 1 つだけがメモリに保持されます。

すべてのタブをメモリに保持したい場合ViewPager(注意 - これは、デバイスや実行中の他のアプリでは難しい場合があります)、メモリに保持するオフスクリーン タブの数を設定できます。これを行うには、オブジェクトsetOffscreenPageLimitでメソッドを使用ViewPagerしますViewPager

例:

ViewPager pager = (ViewPager) findViewById(R.id.pager); // Your pager's ID
pager.setOffscreenPageLimit(2); // Will retain 2 off-screen tabs + your selected tab

お役に立てれば!

于 2012-07-16T20:38:57.923 に答える
2

FragmentPagerAdapterそれはとがどのように機能するかという性質ですFragmentPagerStateAdapter。Google のサイトから:

The fragment of each page the user visits will be kept in memory, though its view hierarchy may be destroyed when not visible.

つまり、ビューを殺して再構築する必要があるGridViewため、補充しています。ViewPager

編集: 3 つすべてのフラグメントをメモリに保持して高速化する必要がある場合は、何らかのビューを内部に格納Viewsする独自のフラグメントを作成する必要があります。PagerAdapterinstantiateItem(ViewGroup, int)Collection

または、Google の例を逐語的に使用している場合は、次のようなことをしている可能性があります。

@Override
public Fragment getItem(int position) {
  return ArrayListFragment.newInstance(position);
}

その場合、ViewPager がリクエストするたびに新しいフラグメントを再構築します。

于 2012-07-16T20:37:59.450 に答える
1

デフォルトViewPagerでは、現在のページの左から 1 つ、右から 1 つのフラグメントをアイドル状態に保ちます。この動作は で変更できますViewPager.setOffscreenPageLimit()ドキュメントを見る

于 2012-07-16T20:40:16.147 に答える