AndroidでのViewPager+Fragment

17743 ワード

AndroidのViewpagerのいろいろなよくある使い方を友人に聞かれたので、ちょっとまとめてみましたが、
ViewPager+Fragmentでよく使われるコードはactionbarsherlockから抽出され、この効果はスライドで切り替えられていることがわかります.直接コードをつけました
ここで簡単にFragmentStatePagerAdapterとFragmentPagerAdapterについて説明します
2台のadapter
第1のfragmentステータスadapter-現在存在する前のfragmentの現在のfragmentと次のfragmentの他の破棄のみで、マルチデータのロードに適しています.
2つ目のFragmentPagerAdapter-はすべて存在するので、画像などの大量のデータをロードするのにはあまり適していません.メモリが溢れやすいです.
エンジニアリング構造:
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();   
        }          
    }  
}  

直接コピーすれば効果を見ることができますV 4パッケージを忘れないで、xmlレイアウトファイルは自分で勝手に全体を見ましょう.3ページ目にスライドすると、1ページ目は4つ目の生成を破棄し、現在は2 3 4が存在します.