FragmentPagerAdapter相比之前的PagerAdapter,并不是需要得到4个view对象,而是通过4个Fragment类来对应4个布局文
件。
FragmentPagerAdapter 继承自 PagerAdapter。相比通用的 PagerAdapter,该类更专注于每一页均为 Fragment 的情况。
该类内的每一个生成的 Fragment 都将保存在内存之中,注意是全部的Fragment,因此适用于那些相对静态的页,数量也比较少
的那种;如果需要处理有很多页,并且数据动态性较大、占用内存较多的情况,应该使用FragmentStatePagerAdapter。
先来看FragmentPagerAdapter:
在上一个项目中需要改几项:
1、创建4个Fragment,加载对应的布局view。
public class Fragment1 extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.view1, container, false);
}
}
2、在Mainactivity中添加Fragment容器list。
private List<Fragment> fraglist;//上面声明
fraglist=new ArrayList<Fragment>();
fraglist.add(new Fragment1());
fraglist.add(new Fragment2());
fraglist.add(new Fragment3());
fraglist.add(new Fragment4());
3、创建适配器MyFragmentPagerAdapter:
package com.example.viewpagertest;
import java.util.List;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fraglist;
private List<String> tablist;
public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> fraglist, List<String> tablist) {
super(fm);
// TODO Auto-generated constructor stub
this.fraglist = fraglist;
this.tablist = tablist;
}
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
return fraglist.get(arg0);
}
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return tablist.get(position);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return fraglist.size();
}
}
4、加载适配器
// 创建FragmentPagerAdapter
MyFragmentPagerAdapter adapter1=new MyFragmentPagerAdapter(getSupportFragmentManager(), fraglist, tablist);
pager.setAdapter(adapter1);
FragmentStatePagerAdapter,该 PagerAdapter 的实现将只保留当前页面,当页面离开视线后,就会被消除,释放其资源;而
在页面需要显示时,生成新的页面(就像 ListView 的实现一样)。这么实现的好处就是当拥有大量的页面时,不必在内存中占用大
量的内存。
只需要替换下代码即可验证:
FragmentStatePagerAdapter:
package com.example.viewpagertest;
import java.util.List;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.view.ViewGroup;
public class MyFragmentStatePagerAdapter extends FragmentStatePagerAdapter{
private List<Fragment> fraglist;
private List<String> tablist;
public MyFragmentStatePagerAdapter(FragmentManager fm,List<Fragment> fraglist,List<String> tablist) {
super(fm);
// TODO Auto-generated constructor stub
this.fraglist=fraglist;
this.tablist=tablist;
}
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
return fraglist.get(arg0);
}
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return tablist.get(position);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return fraglist.size();
}
//创建
@Override
public Object instantiateItem(ViewGroup arg0, int arg1) {
// TODO Auto-generated method stub
return super.instantiateItem(arg0, arg1);
}
//销毁
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
super.destroyItem(container, position, object);
}
}
我们在第四个Fragment类中添加destroy方法,销毁时log打印一下:
package com.example.viewpagertest;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class Fragment4 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.view4, container, false);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i("lpl", "我被销毁了");
}
}
返回第二个页面,第四个已经被销毁。
创建FragmentStatePagerAdapter类:
// 创建FragmentStatePagerAdapter
MyFragmentStatePagerAdapter adapter2=new MyFragmentStatePagerAdapter(getSupportFragmentManager(), fraglist, tablist);
pager.setAdapter(adapter2);