viewpager 简介及大量页面加载的方法推荐

先介绍下父类PagerAdapter,包含主要方法 instantiateItem初始化每个页面的view,这个用的比较少

viewPager = (ViewPager) findViewById(R.id.viewpager);  
LayoutInflater inflater=getLayoutInflater();  
view1 = inflater.inflate(R.layout.layout1, null);  
view2 = inflater.inflate(R.layout.layout2,null);  
view3 = inflater.inflate(R.layout.layout3, null);  
          
viewList = new ArrayList<View>();// 将要分页显示的View装入数组中  
viewList.add(view1);  
viewList.add(view2);  
viewList.add(view3);  
          
          
PagerAdapter pagerAdapter = new PagerAdapter() {  
              
     @Override  
     public boolean isViewFromObject(View arg0, Object arg1) {  
         return arg0 == arg1;  
   }  
              
     @Override  
     public int getCount() {  
         return viewList.size();  //界面总的个数
     }  
              
     @Override  
      public void destroyItem(ViewGroup container, int position,  
                    Object object) {  
         container.removeView(viewList.get(position));  //移除view
      }  
              
            @Override  
       public Object instantiateItem(ViewGroup container, int position) {  
                // TODO Auto-generated method stub  
         container.addView(viewList.get(position));  
                  
         return viewList.get(position);  
     }  
};  
          
          
viewPager.setAdapter(pagerAdapter);

2类FragmentPagerAdapter用于保存少量的view,因为内存不会自行回收

 List<Fragment> fragments=new ArrayList<Fragment>();  
 fragments.add(new Fragment1());      //不同布局的
 fragments.add(new Fragment2());  
 FragAdapter adapter = new FragAdapter(getSupportFragmentManager(), fragments);  
 ViewPager vp = (ViewPager)findViewById(R.id.viewpager);  
 vp.setAdapter(adapter);  
  
public class Fragment1 extends Fragment {  
      
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  
            Bundle savedInstanceState) {  
        // 布局初始化 数据加载之类的操作  
        View view=inflater.inflate(R.layout.layout2, container, false);  
        return view;  
    }  
  
}   

 
public class FragAdapter extends FragmentPagerAdapter {  
  
    private List<Fragment> mFragments;  
      
    public FragAdapter(FragmentManager fm,List<Fragment> fragments) {  
        super(fm);  
        // TODO Auto-generated constructor stub  
        mFragments=fragments;  
    }  
  
    @Override  
    public Fragment getItem(int arg0) {  
        // TODO Auto-generated method stub  
        return mFragments.get(arg0);  
    }  
  
    @Override  
    public int getCount() {  
        // TODO Auto-generated method stub  
        return mFragments.size();  
    }  
  
}

3,FragmentStatePagerAdapter用于页面多的内存只保留3个界面

ArrayList<Fragment> fragmentList = new ArrayList<Fragment>();
  
for (int i = 0; i < 280; i++) {
MainFragment first = new MainFragment();
fragmentList.add(first);   //布局一样数据不一样的界面
}
wikiAdapter = new MyFrageStatePagerAdapter(getSupportFragmentManager());
wikipediaPager.setAdapter(wikiAdapter);

public class MyFrageStatePagerAdapter extends FragmentStatePagerAdapter {
 public MyFrageStatePagerAdapter(FragmentManager fm) {
  super(fm);
 }
 @Override
 public Fragment getItem(int position) {
  return MainFragment.newInstance(position);  //为了传递当前界面index便于进行初始化
 }
 @Override
 public int getCount() {
  return fragmentList.size();    //总的界面数
 }

} 

//自定义获得界面及传入当前界面的值,初始化界面
public class MainFragment extends Fragment {
 private int mNum;
 public static MainFragment newInstance(int num) {
  MainFragment f = new MainFragment();
  Bundle args = new Bundle();
  args.putInt("num", num);
  f.setArguments(args);
  return f;
 }
 
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  mNum = getArguments() != null ? getArguments().getInt("num") : 1;
  
 }
 
 View view;
 @Override
 public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  
  view = inflater.inflate(R.layout.wikipedia_pager_item, container,false);
  initView(view,MainActivity.wikiList.get(mNum));
  
  return view;
 }
}

 

FragmentPagerAdapter 继承自 PagerAdapter。相比通用的 PagerAdapter,该类更专注于每一页均为 Fragment 的情况。如文档所述,该类内的每一个生成的 Fragment 都将保存在内存之中因此适用于那些相对静态的页,数量也比较少的那种;

如需要处理很多页,数据动态性较大,占用内存多的情况,使用FragmentStatePagerAdapter

当然PagerAdapter也可以处理很多页面的,用循环队列来节省内存,例子如下

viewpager总是会预加载后面的界面,所以要让控件本身去找到对于的view和数据 date.index让对应view加载对应数据

package cn.new1.cloudnurse.pregnancy.main.adapter;
public class WikipediaPagerAdapter extends PagerAdapter{
 
    //布局的view
 private List<ScrollView> contentViewList = new LinkedList<ScrollView>();
 private int pagerCount;    //循环的个数
 Context context;
 
 public WikipediaPagerAdapter(Context context, int pagerCount) {
  this.context = context;
  this.pagerCount = pagerCount;// * 2;
  for (int i = 0; i < pagerCount; i++) {
   ScrollView scrollView =  (ScrollView) View.inflate(context, R.layout.wikipedia_pager_item, null);
   contentViewList.add(scrollView);
  }
 }
 
 WikiPediaData date;
 @Override
 public void draw(int arg0, Object arg1) {
//  WikiPediaData date;
  try {
   JSONObject jsonObject = new JSONObject((String)arg1);
   date = new WikiPediaData();
   date.date = jsonObject.optString("currentDate");
   date.babychange = jsonObject.optString("v_baby_changes");
   date.momchange = jsonObject.optString("v_mom_changes");
   
   showView(date);
  } catch (JSONException e) {
   e.printStackTrace();
  }
  
 }
 
 private void showView(final WikiPediaData date){
  //获取对应数据的view然后加载数据显示
  ScrollView scrollView = contentViewList.get(date.index%pagerCount);
  
  dateTv = (TextView) scrollView.findViewById(R.id.wikipedia_date);
  babyChangeTv = FindView.byId(scrollView, R.id.wikipedia_baby_change);
 });
  
  dateTv.setText(date.date);
  babyChangeTv.setText(date.babychange);
 }



 
 @Override
 public int getCount() {
  return PregnancyParam.GESTATIONAL_DAY_COUNT;    //无数个确保viewpager的数量可以一直累计
 }
 @Override
 public boolean isViewFromObject(View view, Object obj) {
  return view == obj;
 }
 private TextView dateTv;   //日期
 private TextView babyChangeTv; //宝贝变化

 
 public static int indexCurrent = 0;
 @Override
 public Object instantiateItem(View view, int index) {
  //要初始化的view
  ViewGroup parent = (ViewGroup) contentViewList.get(index%pagerCount).getParent();
          
  WikiPediaDb db = new WikiPediaDb(context);
  WikiPediaData tmpData = db.getContactList(index+"");
  
  if (parent != null) {    //循环队列加载 部分内存会相同 最好确保不能相邻 viewpager内存实时缓存3个界面
   
  } else {
   ((ViewPager) view).addView(contentViewList.get(index%pagerCount),0);
  }
  
  indexCurrent = index%pagerCount;
  
  return contentViewList.get(index%pagerCount);
 }
 @Override
 public void destroyItem(View view, int index, Object obj) {
  ((ViewPager) view).removeView(contentViewList.get(index%pagerCount));  //移除view
 }
 
 @Override
 public int getItemPosition(Object object) {
  // TODO Auto-generated method stub
  return POSITION_UNCHANGED;
 }

 
}
综合多页面数据变化大的推荐使用FragmentStatePagerAdapter

转载于:https://my.oschina.net/u/274829/blog/501590

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值