viewPager中嵌套着fragment有预加载功能你知道吗?我开始也是不知道的,后来发现了这个问题,下面来说明一下。首先简单介绍一下viewPager的使用。
viewPager
首先在一个Activity中创建一个viewPager,在viewPager中加入三个fragment
public class MainActivity extends AppCompatActivity {
private ViewPager viewPager;
private ArrayList<Fragment> list;
private ViewPagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = findViewById(R.id.viewPager);
initViewPager();
}
private void initViewPager() {
list = new ArrayList<Fragment>();
Fragment1 fragment1 = new Fragment1();
Fragment2 fragment2 = new Fragment2();
Fragment3 fragment3 = new Fragment3();
list.add(fragment1);
list.add(fragment2);
list.add(fragment3);
FragmentManager fragmentManager = getSupportFragmentManager();
adapter = new ViewPagerAdapter(fragmentManager, list);
viewPager.setAdapter(adapter);
viewPager.setCurrentItem(0);
viewPager.setOffscreenPageLimit(2);//viewPager预加载,从0开始
viewPager.addOnPageChangeListener(new
ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
//在这里可以做一些改变按钮的操作。
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
}
接下来是重要的adapter:
public class ViewPagerAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> fragmentList;
private FragmentManager fragmentManager;
public ViewPagerAdapter(FragmentManager fm,ArrayList<Fragment> list) {
super(fm);
this.fragmentManager = fm;
this.fragmentList = list;
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
}
ok,来看一下mainActivity中的xml文件,很简单只有一个viewPager。
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.wangrui.viewpagertest.MainActivity">
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
</android.support.constraint.ConstraintLayout>
接下来看一下定义的fragment,因为这里只是demo,fragment中只有一个TextView,所以就只贴出一个了。
public class Fragment1 extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment1_layout,null);
return view;
}
}
ok,接下来是Fragment1的xml文件。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="1"
android:gravity="center"
android:textSize="150dp"
/>
</LinearLayout>
其他,两个Fragment的代码和布局文件基本是一毛一样的,所以就不重复贴了。然后运行效果是这样的:
ViewPager效果.gif
ViewPager预加载
接下来说一下本节的重点,viewPager的预加载。机智的小伙伴相信已经看到了在设置viewPager的时候有这样一行代码
viewPager.setOffscreenPageLimit(2);
然后我在三个Fragment的生命周期中都打上log。运行时的log是这样的
log效果图.png
可以看到,在运行demo的时候三个fragment全部被创建了。
当手机屏幕息屏的时候,三个fragment的生命周期是这样的:
image1.png
ok,现在把这句代码设置成这样
viewPager.setOffscreenPageLimit(1);
效果是这样的
image.png
当滑动到第二个fragment的时候,可以看到fragment3才开始创建:
image.png
当滑动到第三个fragment3的时候,第一个fragment1已经被销毁了
image.png
接着测试,把值设置为0试试。
viewPager.setOffscreenPageLimit(0);
image.png
可以看到设置为0和1的效果是一样。
所以可以通过设置n的值来改变预加载fragment的个数
viewPager.setOffscreenPageLimit(n);
网友评论