ビューペーカーが画面外ビューを破壊するのを防ぎます
-
27-10-2019 - |
質問
3つのフラグメントを表示しているFragmentPageRadapterにフックアップされたビューペーカーがあります。 ViewPagerは、現在の位置から複数のスワイプである場合、ホストされたフラグメントのビューを破壊するように見えます。
これらのビューはすべて簡単なリストであり、この最適化は完全に不要なので、無効にしたいと思います。リストにはレイアウトアニメーションが適用され、それらのアニメーションが破壊されて再現された後にリプレイされているため、視覚的な問題が発生しています。また、毎回Scrollbar Introアニメーション(スクロールバーが一時的に見えるようにスクロールが可能であることを示すことができる)が表示され、ユーザーの現在のスクロール位置はプロセスで失われます。
また、最初のスワイプが発生するまで3番目のフラグメントをロードしません。これは、各フラグメントが独自のサービスコールを処理し、アクティビティがロードされると同時に3つすべての火をオフにすることを好むため、問題です。 3回目のサービスコールが遅れていることは理想的ではありません。
ViewPagerにこの動作を止めて、すべての断片をメモリに保つように説得する方法はありますか?
解決
の リビジョン4 サポートパッケージのうち、ViewPagerにメソッドが追加され、デフォルトではなく、使用するオフスクリーンページの数を指定できます。
あなたの場合、2を指定する必要があります。これにより、3番目のページにあるときに最初のページが破壊されず、その逆も同様です。
mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
他のヒント
デフォルトでは、ページをスワイプするときにViewPagerがフラグメントを再作成します。これを防ぐために、2つのことのいずれかを試すことができます。
1. フラグメントのoncreate()で、setretaininstance(true)を呼び出します。
2. フラグメントの数が固定され、比較的小さい場合は、oncreate()で次のコードを追加します。
ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(3);
私が正しく覚えていれば、2番目のオプションはより有望です。しかし、私はあなたに両方を試して、それらのどれが機能するかを確認することをお勧めします。
「アイドル状態のビュー階層の現在のページの両側に保持するページの数を設定します。この制限を超えるページは、必要に応じてアダプターから再作成されます。」