読者です 読者をやめる 読者になる 読者になる

Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

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;
    }
}