android 中的 ViewPager+ Fragment


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

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

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

2個adapter 

第一種 fragment狀態adapter -  在當前只會存在   前1個fragment  當前 fragment 和 下1個 fragment   其他銷毀 ,適合加載多數據

第二種 FragmentPagerAdapter  - 全部存在,所以不太適合加載 大量的數據 如圖片什么的,很容易內存溢出。

工程結構:

 

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

  1. public class ViewPageFragment extends FragmentActivity {  
  2.       
  3.     //這個是有多少個 fragment頁面  
  4.     static final int NUM_ITEMS = 5;  
  5.     private MyAdapter    mAdapter;  
  6.     private ViewPager    mPager;      
  7.     private int  nowPage;  
  8.        
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.pagers_fragment_main);  
  13.         mAdapter = new MyAdapter(getSupportFragmentManager() );  
  14.         mPager = (ViewPager)findViewById(R.id.mypagers_pager);  
  15.         mPager.setAdapter(mAdapter);  
  16.     }  
  17.   
  18.   
  19.     /** 
  20.      *  有狀態的 ,只會有前3個存在 其他銷毀,  前1個, 中間, 下一個 
  21.      */  
  22.     public static class MyAdapter extends   FragmentStatePagerAdapter {  
  23.         public MyAdapter(FragmentManager fm) {  
  24.             super(fm);  
  25.         }  
  26.   
  27.         @Override  
  28.         public int getCount() {  
  29.             return NUM_ITEMS;  
  30.         }  
  31.   
  32.         //得到每個item  
  33.         @Override  
  34.         public Fragment getItem(int position) {  
  35.             return ArrayFragment.newInstance(position);  
  36.         }  
  37.   
  38.           
  39.         // 初始化每個頁卡選項  
  40.         @Override  
  41.         public Object instantiateItem(ViewGroup arg0, int arg1) {  
  42.             // TODO Auto-generated method stub  
  43.             return super.instantiateItem(arg0, arg1);  
  44.         }  
  45.           
  46.         @Override  
  47.         public void destroyItem(ViewGroup container, int position, Object object) {  
  48.             System.out.println( "position Destory" + position);  
  49.             super.destroyItem(container, position, object);  
  50.         }  
  51.           
  52.     }  
  53.   
  54.       
  55.     /** 
  56.      * 無狀態的 會全部加載着, 這個適合少量的 特別多的圖片啊啥的 還是用  FragmentStatePagerAdapter 
  57.      * @author lilei 
  58.      */  
  59. //    public static class MyAdapter extends  FragmentPagerAdapter  {  
  60. //      public MyAdapter(FragmentManager fm ) {  
  61. //            super(fm);  
  62. //         
  63. //        }  
  64. //  
  65. //        @Override  
  66. //        public int getCount() {  
  67. //            return NUM_ITEMS;  
  68. //        }  
  69. //  
  70. //        @Override  
  71. //        public Fragment getItem(int position) {  
  72. //          // 返回相應的  fragment  
  73. //            return ArrayFragment.newInstance(position);  
  74. //        }  
  75. //          
  76. //        @Override  
  77. //        public void destroyItem(ViewGroup container, int position, Object object) {  
  78. //          System.out.println( "position Destory" + position);  
  79. //          super.destroyItem(container, position, object);  
  80. //        }  
  81. //    }  
  82.       
  83.       
  84.     /** 
  85.      * 所有的  每個Fragment 
  86.      */  
  87.     public static class ArrayFragment extends Fragment {  
  88.          
  89.         int mNum;  
  90.         static ArrayFragment newInstance(int num) {  
  91.             ArrayFragment  array= new ArrayFragment();  
  92.             Bundle args = new Bundle();  
  93.             args.putInt("num", num);  
  94.             array.setArguments(args);  
  95.             return array;  
  96.         }  
  97.   
  98.           
  99.         @Override  
  100.         public void onCreate(Bundle savedInstanceState) {  
  101.             super.onCreate(savedInstanceState);  
  102.             mNum = getArguments() != null ? getArguments().getInt("num") : 1;  
  103.             System.out.println("mNum Fragment create ="+ mNum);  
  104.         }  
  105.   
  106.           
  107.         @Override  
  108.         public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  109.                 Bundle savedInstanceState) {  
  110.              System.out.println("onCreateView = ");  
  111.              //在這里加載每個 fragment的顯示的 View  
  112.              View v = null;  
  113.                
  114.              if(mNum == 0){  
  115.                   v = inflater.inflate(R.layout.pagers_fragment1, container, false);  
  116.                  ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");                          
  117.              }else if(mNum == 1){  
  118.                  v = inflater.inflate(R.layout.pagers_fragment1, container, false);  
  119.                  ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");  
  120.              }else  if(mNum == 2){  
  121.                  v = inflater.inflate(R.layout.pagers_fragment1, container, false);  
  122.                  ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");  
  123.              }else{  
  124.                  v = inflater.inflate(R.layout.pagers_fragment1, container, false);  
  125.                  ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");  
  126.              }       
  127.             return v;  
  128.         }  
  129.   
  130.         @Override  
  131.         public void onActivityCreated(Bundle savedInstanceState) {  
  132.             System.out.println("onActivityCreated = ");  
  133.             super.onActivityCreated(savedInstanceState);     
  134.         }  
  135.           
  136.         @Override  
  137.         public void onDestroyView(){  
  138.             System.out.println(mNum + "mNumDestory");  
  139.             super.onDestroyView();  
  140.         }  
  141.           
  142.         @Override  
  143.         public void onDestroy(){  
  144.             super.onDestroy();   
  145.         }  
  146.           
  147.     }  
  148. }  



 

2. 和 1也沒什么太大區別( 個中用處 看個人了 )

 
  1. public class ViewPageFragmentCS extends FragmentActivity {  
  2.       
  3.     //這個是有多少個 fragment頁面  
  4.     private MyAdapter    mAdapter;  
  5.     private ViewPager    mPager;   
  6.     private List<Entity> list =  new ArrayList<ViewPageFragmentCS.Entity>();;  
  7.   
  8.     @Override  
  9.     protected void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.pagers_fragment_main);  
  12.           
  13.         for (int i = 0; i < 7 ; i++) {  
  14.             Entity ee = new Entity();  
  15.             ee.name = "ll"+ i;  
  16.             ee.age  = ""+ i;  
  17.             list.add(ee);  
  18.         }  
  19.         mAdapter = new MyAdapter(getSupportFragmentManager(),list);  
  20.         mPager = (ViewPager)findViewById(R.id.mypagers_pager);  
  21.         mPager.setAdapter(mAdapter);  
  22.     }  
  23.   
  24.   
  25.       
  26.     private class Entity{  
  27.         public String name;  
  28.         public String age;  
  29.     }  
  30.       
  31.       
  32.     // 在這里你可以傳 list<Fragment>  也可以傳遞  list<Object>數據  
  33.     public class MyAdapter extends FragmentStatePagerAdapter {  
  34.         List<Entity> list_ee;  
  35.           
  36.         public MyAdapter(FragmentManager fm, List<Entity> ee) {  
  37.             super(fm);  
  38.             this.list_ee = ee ;  
  39.         }  
  40.   
  41.         @Override  
  42.         public int getCount() {  
  43.             return list_ee.size();  
  44.         }  
  45.   
  46.         // 初始化每個頁卡選項  
  47.         @Override  
  48.         public Object instantiateItem(ViewGroup arg0, int position) {  
  49.               
  50.             ArrayFragment ff  = (ArrayFragment)super.instantiateItem(arg0, position);  
  51.             ff.setThings(list_ee.get(position),position);  
  52.             return  ff;  
  53.         }  
  54.           
  55.         @Override  
  56.         public void destroyItem(ViewGroup container, int position, Object object) {  
  57.             System.out.println( "position Destory" + position);  
  58.             super.destroyItem(container, position, object);  
  59.         }  
  60.   
  61.           
  62.         @Override  
  63.         public Fragment getItem(int arg0) {  
  64.             // TODO Auto-generated method stub  
  65.             return new ArrayFragment();  
  66.         }  
  67.           
  68.     }  
  69.   
  70.       
  71.       
  72.     /** 
  73.      * 所有的  每個Fragment 
  74.      */  
  75.     public  class ArrayFragment extends Fragment {  
  76.         private  Entity ee;  
  77.         private int position;  
  78.          
  79.         public void setThings(Entity ee,int position){  
  80.             this.ee =ee ;     
  81.             this.position = position;  
  82.         }  
  83.   
  84.         @Override  
  85.         public void onCreate(Bundle savedInstanceState) {  
  86.             super.onCreate(savedInstanceState);  
  87.         }  
  88.   
  89.         @Override  
  90.         public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  91.                 Bundle savedInstanceState) {  
  92.              System.out.println("onCreateView = ");  
  93.              //在這里加載每個 fragment的顯示的 View  
  94.              View  v = inflater.inflate(R.layout.pagers_fragment1, container, false);  
  95.             ((TextView)v.findViewById(R.id.textView1)).setText(ee.name+ "= ee.Name -=age"+ ee.age);   
  96.             return v;  
  97.         }  
  98.   
  99.         @Override  
  100.         public void onActivityCreated(Bundle savedInstanceState) {  
  101.             System.out.println("onActivityCreated = ");  
  102.             super.onActivityCreated(savedInstanceState);     
  103.         }  
  104.           
  105.         @Override  
  106.         public void onDestroyView(){  
  107.             System.out.println("onDestroyView = "+ position);  
  108.             super.onDestroyView();  
  109.         }  
  110.           
  111.         @Override  
  112.         public void onDestroy(){  
  113.             System.out.println("onDestroy = "+ position);  
  114.             super.onDestroy();   
  115.         }          
  116.     }  
  117. }  


直接復制過去就可以看效果了   別忘記  V4包,xml 布局文件 自己隨便整個吧。

 

滑動到第3個頁面的時候可以看到     第1個頁面銷毀   第4個生成,    當前存在   2  3   4

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM