大家都知道,viewpager是默认预加载下一页的界面的。viewpager提供了一个设置预加载页面数量的方法,那就是setOffscreenPageLimit()。默认不设置数量的情况下预加载下一页。设置0和1是同样的效果。不多说,上代码。
布局为一个ViewPager
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<android.support.v4.view.ViewPager
android:id="@+id/vp"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
</RelativeLayout>
为了测试我就创建了5个Fragment界面,简单的在onCreateView中返回一个 TextView。
每个界面都类似,只是设置的文字不一样。只贴个第一页:
public class FragmentOne extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
TextView textView = new TextView(getContext());
textView.setText("第一页");
Log.e("createView","第一页创建了");
return textView;
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.e("onDestroyView", "第一页销毁了 ");
}
}
使用FragmentFactory来管理这5个Fragment界面
public class FragmentFactory {
private static HashMap<Integer, Fragment> mSavedFragment = new HashMap<Integer, Fragment>();
//根据position得到对应的fragment
public static Fragment getFragment(int position) {
Fragment fragment = mSavedFragment.get(position);
if(fragment == null) {
switch (position) {
case 0:
fragment = new FragmentOne();
break;
case 1:
fragment = new FragmentTwo();
break;
case 2:
fragment = new FragmentThree();
break;
case 3:
fragment = new FragmentFour();
break;
case 4:
fragment = new FragmentFive();
break;
}
//创建完成fragment之后,别忘了存起来
mSavedFragment.put(position, fragment);
}
return fragment;
}
}
给viewpager设置adapter。代码很简单。并设置预加载页数为1,当然也可以不设置,因为默认就是预加载一页。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_pager);
ViewPager viewPager = (ViewPager) findViewById(R.id.vp);
viewPager.setAdapter(new myAdapter(getSupportFragmentManager()));
viewPager.setOffscreenPageLimit(1);
}
class myAdapter extends FragmentPagerAdapter{
public myAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return FragmentFactory.getFragment(position);
}
@Override
public int getCount() {
return 5;
}
}
运行程序,可以看到第一个界面和第二个界面都创建了
然后往右滑动,滑到第二个界面,log显示第三页创建了,再往右滑,第一个界面销毁,第四个界面创建了。
同理修改setOffscreenPageLimit的值为2,运行程序。显示第一页第二页第三页都创建了
然后往右滑到第二页,第四个界面创建了,滑到第三页,第五个界面创建了。再往右滑到第四页,第一个界面销毁。