一、前言:
我们在fragemnt大于2个时,有时会出现页面销毁的情况,我们通过以下方式解决。
class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
mFragments.clear();
mFragments.add(new MyLessonGoingFragment());
mFragments.add(new MyLessonStartFragment());
mFragments.add(new MyLessonFinishFragment());
mFragments.add(new MyLessonCancelFragment());
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//如果注释这行,那么不管怎么切换,page都不会被销毁
//super.destroyItem(container, position, object);
}
}
二、解决:
方法一:
由于FragmentPagerAdapter 默认支持2个Fragment页面切换,大于2个页面,第一个页面就会销毁,所以我们要设置屏幕外保存几个Fragment。
//有几个Fragment,设置屏幕外保存几个Fragment不销毁
contentViewPage.setOffscreenPageLimit(4);
代码如下:
MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
contentViewPage.setAdapter(adapter);
//有几个Fragment,设置屏幕外保存几个Fragment不销毁
contentViewPage.setOffscreenPageLimit(4);
contentViewPage.setOnPageChangeListener(this);
contentViewPage.setSelected(true);
方法二:
1、继承FragmentPagerAdapter 类;
2、重写destroyItem()方法;
3、如果注释这行,那么不管怎么切换,page都不会被销毁
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//如果注释这行,那么不管怎么切换,page都不会被销毁
//super.destroyItem(container, position, object);
}
- 方案三(推荐):复用Fragment的RootView
此方案适用通用场景,推荐使用。
步骤1:在onDestroyView方法内把Fragment的RootView从ViewPager中remove
@Override
public void onDestroyView() {
LogUtils.d(TAG , "-->onDestroyView");
super .onDestroyView();
if (null != FragmentView) {
((ViewGroup) mFragmentView.getParent()).removeView(mFragmentView);
}
}
步骤2:在onCreateView方法内复用RootView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
LogUtils.d (TAG, "-->onCreateView");
if (null == mFragmentView) {
mFragmentView = inflater.inflate(R.layout.fragment, container, false);
mListView = (ListView) mFragmentView .findViewById(R.id.mm_listview);
mListView.setAdapter(mAdapter);
mPbar = (ProgressBar) mFragmentView.findViewById(R.id.pbar_mm_loading);
mPbar.setVisibility(View.VISIBLE);
}
return mFragmentView ;
}