天天看點

Android 中的 ViewPager+ Fragment

android的Viewpager 的各種經常的用法,朋友問我要過,是以就稍微總結一下,

ViewPager + Fragment 經常用到 代碼是從 actionbarsherlock 中提取出來的,這個效果都知道是 滑動來切換的。直接上代碼了

在這裡簡單說明一下 FragmentStatePagerAdapter 和 FragmentPagerAdapter

2個adapter

第一種 fragment狀态adapter - 在目前隻會存在 前1個fragment 目前 fragment 和 下1個 fragment 其他銷毀 ,适合加載多資料

第二種 FragmentPagerAdapter - 全部存在,是以不太适合加載 大量的資料 如圖檔什麼的,很容易記憶體溢出。

工程結構:

Android 中的 ViewPager+ Fragment

activity adapter 在一起 (static類型的 Fragment)

public class ViewPageFragment extends FragmentActivity {  
      
    //這個是有多少個 fragment頁面  
    static final int NUM_ITEMS = 5;  
    private MyAdapter    mAdapter;  
    private ViewPager    mPager;      
    private int  nowPage;  
       
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.pagers_fragment_main);  
        mAdapter = new MyAdapter(getSupportFragmentManager() );  
        mPager = (ViewPager)findViewById(R.id.mypagers_pager);  
        mPager.setAdapter(mAdapter);  
    }  
  
  
    /** 
     *  有狀态的 ,隻會有前3個存在 其他銷毀,  前1個, 中間, 下一個 
     */  
    public static class MyAdapter extends   FragmentStatePagerAdapter {  
        public MyAdapter(FragmentManager fm) {  
            super(fm);  
        }  
  
        @Override  
        public int getCount() {  
            return NUM_ITEMS;  
        }  
  
        //得到每個item  
        @Override  
        public Fragment getItem(int position) {  
            return ArrayFragment.newInstance(position);  
        }  
  
          
        // 初始化每個頁卡選項  
        @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) {  
            System.out.println( "position Destory" + position);  
            super.destroyItem(container, position, object);  
        }  
          
    }  
  
      
    /** 
     * 無狀态的 會全部加載着, 這個适合少量的 特别多的圖檔啊啥的 還是用  FragmentStatePagerAdapter 
     * @author lilei 
     */  
//    public static class MyAdapter extends  FragmentPagerAdapter  {  
//      public MyAdapter(FragmentManager fm ) {  
//            super(fm);  
//         
//        }  
//  
//        @Override  
//        public int getCount() {  
//            return NUM_ITEMS;  
//        }  
//  
//        @Override  
//        public Fragment getItem(int position) {  
//          // 傳回相應的  fragment  
//            return ArrayFragment.newInstance(position);  
//        }  
//          
//        @Override  
//        public void destroyItem(ViewGroup container, int position, Object object) {  
//          System.out.println( "position Destory" + position);  
//          super.destroyItem(container, position, object);  
//        }  
//    }  
      
      
    /** 
     * 所有的  每個Fragment 
     */  
    public static class ArrayFragment extends Fragment {  
         
        int mNum;  
        static ArrayFragment newInstance(int num) {  
            ArrayFragment  array= new ArrayFragment();  
            Bundle args = new Bundle();  
            args.putInt("num", num);  
            array.setArguments(args);  
            return array;  
        }  
  
          
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            mNum = getArguments() != null ? getArguments().getInt("num") : 1;  
            System.out.println("mNum Fragment create ="+ mNum);  
        }  
  
          
        @Override  
        public View onCreateView(LayoutInflater inflater, ViewGroup container,  
                Bundle savedInstanceState) {  
             System.out.println("onCreateView = ");  
             //在這裡加載每個 fragment的顯示的 View  
             View v = null;  
               
             if(mNum == 0){  
                  v = inflater.inflate(R.layout.pagers_fragment1, container, false);  
                 ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");                          
             }else if(mNum == 1){  
                 v = inflater.inflate(R.layout.pagers_fragment1, container, false);  
                 ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");  
             }else  if(mNum == 2){  
                 v = inflater.inflate(R.layout.pagers_fragment1, container, false);  
                 ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");  
             }else{  
                 v = inflater.inflate(R.layout.pagers_fragment1, container, false);  
                 ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");  
             }       
            return v;  
        }  
  
        @Override  
        public void onActivityCreated(Bundle savedInstanceState) {  
            System.out.println("onActivityCreated = ");  
            super.onActivityCreated(savedInstanceState);     
        }  
          
        @Override  
        public void onDestroyView(){  
            System.out.println(mNum + "mNumDestory");  
            super.onDestroyView();  
        }  
          
        @Override  
        public void onDestroy(){  
            super.onDestroy();   
        }  
          
    }  
}        

和 1也沒什麼太大差別( 個中用處 看個人了 )

public class ViewPageFragmentCS extends FragmentActivity {  
      
    //這個是有多少個 fragment頁面  
    private MyAdapter    mAdapter;  
    private ViewPager    mPager;   
    private List<Entity> list =  new ArrayList<ViewPageFragmentCS.Entity>();;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.pagers_fragment_main);  
          
        for (int i = 0; i < 7 ; i++) {  
            Entity ee = new Entity();  
            ee.name = "ll"+ i;  
            ee.age  = ""+ i;  
            list.add(ee);  
        }  
        mAdapter = new MyAdapter(getSupportFragmentManager(),list);  
        mPager = (ViewPager)findViewById(R.id.mypagers_pager);  
        mPager.setAdapter(mAdapter);  
    }  
  
  
      
    private class Entity{  
        public String name;  
        public String age;  
    }  
      
      
    // 在這裡你可以傳 list<Fragment>  也可以傳遞  list<Object>資料  
    public class MyAdapter extends FragmentStatePagerAdapter {  
        List<Entity> list_ee;  
          
        public MyAdapter(FragmentManager fm, List<Entity> ee) {  
            super(fm);  
            this.list_ee = ee ;  
        }  
  
        @Override  
        public int getCount() {  
            return list_ee.size();  
        }  
  
        // 初始化每個頁卡選項  
        @Override  
        public Object instantiateItem(ViewGroup arg0, int position) {  
              
            ArrayFragment ff  = (ArrayFragment)super.instantiateItem(arg0, position);  
            ff.setThings(list_ee.get(position),position);  
            return  ff;  
        }  
          
        @Override  
        public void destroyItem(ViewGroup container, int position, Object object) {  
            System.out.println( "position Destory" + position);  
            super.destroyItem(container, position, object);  
        }  
  
          
        @Override  
        public Fragment getItem(int arg0) {  
            // TODO Auto-generated method stub  
            return new ArrayFragment();  
        }  
          
    }  
  
      
      
    /** 
     * 所有的  每個Fragment 
     */  
    public  class ArrayFragment extends Fragment {  
        private  Entity ee;  
        private int position;  
         
        public void setThings(Entity ee,int position){  
            this.ee =ee ;     
            this.position = position;  
        }  
  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
        }  
  
        @Override  
        public View onCreateView(LayoutInflater inflater, ViewGroup container,  
                Bundle savedInstanceState) {  
             System.out.println("onCreateView = ");  
             //在這裡加載每個 fragment的顯示的 View  
             View  v = inflater.inflate(R.layout.pagers_fragment1, container, false);  
            ((TextView)v.findViewById(R.id.textView1)).setText(ee.name+ "= ee.Name -=age"+ ee.age);   
            return v;  
        }  
  
        @Override  
        public void onActivityCreated(Bundle savedInstanceState) {  
            System.out.println("onActivityCreated = ");  
            super.onActivityCreated(savedInstanceState);     
        }  
          
        @Override  
        public void onDestroyView(){  
            System.out.println("onDestroyView = "+ position);  
            super.onDestroyView();  
        }  
          
        @Override  
        public void onDestroy(){  
            System.out.println("onDestroy = "+ position);  
            super.onDestroy();   
        }          
    }  
}        

直接複制過去就可以看效果了 别忘記 V4包,xml 布局檔案 自己随便整個吧。