ViewPagerにおけるフラグメントのキャッシュ
ViewPager#setOffScreenPageLimitなるものがあることを知らなかった。
ViewPagerのキャッシュする画面数を変更する - outcesticide
こいつを使うと起動時にキャッシュしてくれるみたい。
上記を知らなかったので、こういうFragmentPagerAdapterを実装してキャッシュしてた。ページがない初回だけはgetItemが呼ばれる。ページを切り替えるタイミングで何かをしたい場合は、OnPageChangeListenerを実装していた。
getItemで新しいインスタンスを生成してしまうとActivityのライフサイクルでonCreate系のメソッドがコールされた(うろ覚え)記憶があり、下記のようにキャッシュしてる。
public class OrderPagerAdapter extends FragmentPagerAdapter { FragmentManager fragmentManager; public OrderPagerAdapter(FragmentManager fm) { super(fm); fragmentManager = fm; } List<Fragment> cachedFragment = new LinkedList<Fragment>() { { add(FragmentA.newInstance()); add(FragmentB.newInstance()); add(FragmentC.newInstance()); add(FragmentD.newInstance()); add(FragmentE.newInstance()); } }; @Override public Fragment getItem(int position) { // Check if this Fragment already exists. String name = makeFragmentName(R.id.pager, position); Fragment f = fragmentManager.findFragmentByTag(name); if(f == null) { f = cachedFragment.get(position); } return f; } @Override public CharSequence getPageTitle(int position) { switch (position){ case 0: return "A".toUpperCase(); case 1: return "B".toUpperCase(); case 2: return "C".toUpperCase(); case 3: return "D".toUpperCase(); case 4: return "E".toUpperCase(); } return ""; } @Override public int getCount() { // Show 5 total pages. return 5; } private static String makeFragmentName(int viewId, int index) { return "android:switcher:" + viewId + ":" + index; } }