FragmentPagerAdapter 會保留所有 Fragment 實例,導致記憶體壓力大。改用 FragmentStatePagerAdapter 自動銷毀不在視野的 Fragment,並以 List<Fragment> 管理。
public class MyPagerAdapter extends FragmentStatePagerAdapter {
private final List fragments = new ArrayList<>();
public MyPagerAdapter(FragmentManager fm) { super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); }
public void addFragment(Fragment f) { fragments.add(f); }
@Override public Fragment getItem(int position) { return fragments.get(position); }
@Override public int getCount() { return fragments.size(); }
}
MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new Fragment1());
adapter.addFragment(new Fragment2());
// ... 加入 20 個 Fragment
viewPager.setAdapter(adapter);
FragmentStatePagerAdapter 僅保留當前及鄰近 Fragment,其餘銷毀並儲存狀態。switch-case,程式碼簡潔易擴充。Fragment 內需正確實作 onSaveInstanceState 保存狀態,銷毀後重建時自動恢復。