简介:
在应用中我们经常会用到ViewPager的情况,实现多tab滑动的效果,内部的实现可以是Fragment,也可以是View,可以根据实际情况来实现。因为ViewPager和ListView相似,使用的是适配器模式设计,因此对应的就有***Adapter。
PagerAdapter是ViewPager最基本的标配,FragmentPagerAdapter和FragmentStatePagerAdapter是内部使用Fragment的Adapter。
PagerAdapter:
使用PagerAdapter需要继承它,并实现内部的方法,一般我们会实现以下几个方法:
@Override
public int getCount() {
return 0;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return false;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
return super.instantiateItem(container, position);
}
getCount():获取页数
isViewFromObject():判断是否是View对象
destroyItem():销毁当前item
instantiateItem():添加当前item
在添加和销毁的方法里,一般我们使用container.addView()方式添加,使用removeView()方式销毁,即ViewGroup添加子View和销毁子View。一般适用于ViewPager内部的实现是View。
FragmentPagerAdapter:
继承自PagerAdapter。需要继承FragmentPagerAdapter并实现内部的方法,一般实现的方法如下:
//构造方法
public MyAdapter(FragmentManager fm, List<Fragment> list) {
super(fm);
this.list = list;
}
@Override
public Fragment getItem(int position) {
return list.get(position);
}
@Override
public int getCount() {
return list.size();
}
使用FragmentPagerAdapter用来管理ViewPager内部为Fragment的实现。
FragmentStatePagerAdapter:
继承自PagerAdapter,功能与FragmentPagerAdapter类似。需要继承FragmentStatePagerAdapter,并实现内部的方法,一般实现的方法如下:
//构造方法
public StateAdapter(FragmentManager fm, List<Fragment> list) {
super(fm);
this.list = list;
}
@Override
public Fragment getItem(int position) {
return list.get(position);
}
@Override
public int getCount() {
return list.size();
}
使用FragmentStatePagerAdapter用来管理ViewPager内部为Fragment的实现。
FragmentPagerAdapter和FragmentStatePagerAdapter的相同点和区别:
相同点: 两者都会保持当前item和前后的一个item状态
就是说Adapter会提前初始化后一个item,并把当前item的前一个item保存在内存中,主要是为了在滑动时页面流畅。
不同点:对滑动过去的页面是否销毁
FragmentPagerAdapter处理时,在滑动到第三个item时,第一个item会依次调用
onPause、onStop、onDestroyView,当滑动到第二个item时,第一个item会调用onCreateView、onActivityCreated、onStart、onResume。因此FragmentPagerAdapter会保留页面的状态,并不会完全销毁掉。FragmentStatePagerAdapter处理时,在滑动到第三个item时,第一个item会依次调用onPause、onStop、onDestroyView、onDestroy、onDetach方法,当滑动到第二个item时,第一个item会调用onAttach、onCreate、onCreateView、onActivityCreated、onStart、onResume。因此FragmentStatePagerAdapter会完全销毁滑动过去的item,当需要初始化的时候,会重新初始化页面。
viewPager.setOffscreenPageLimit(int)设置,前提五个页面
viewPager.setOffscreenPageLimit(4)在FragmentPagerAdapter和FragmentStatePagerAdapter的情况下是一致的,系统会直接将五个页面全部加载到内存中,即全部执行到onResume方法,在切换页面时,不会再调用其他生命周期方法。