android viewpager+fragment與利用viewpager滑動分頁小技巧

一:簡單的實現viewpage進行fragment的滑動切換

[java] view plain copy
  1. public class LcVpFragment extends Fragment{  
  2.   
  3.     @Override  
  4.     public void onActivityCreated(Bundle savedInstanceState) {  
  5.         // TODO Auto-generated method stub        
  6.         super.onActivityCreated(savedInstanceState);  
  7.           
  8.         List<Fragment> listviews  = new ArrayList<Fragment>();  
  9.           
  10.         TransFragment trs = new TransFragment();  
  11.         trs.setArguments(getArguments());//傳參數  
  12.           
  13.         listviews.add(new NextPagerFragment());   
  14.         listviews.add(trs);   
  15.         listviews.add(new NextPagerFragment());  
  16.               
  17.          ViewPager myviewpage = (ViewPager)getActivity().findViewById(R.id.trans_page);        
  18.          TransFragmentPagerAdapter mypagetadapter = new TransFragmentPagerAdapter(getActivity().getSupportFragmentManager(),listviews);    
  19.          myviewpage.setAdapter(mypagetadapter);    
  20.     }  
  21.   
  22.     @Override  
  23.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  24.             Bundle savedInstanceState) {  
  25.         // TODO Auto-generated method stub  
  26.         return inflater.inflate(R.layout.myviewpager, container, false);  
  27.         //return super.onCreateView(inflater, container, savedInstanceState);  
  28.     }  
  29. }  

繼承Fragment適配器FragmentPagerAdapter,Fragment的適配器比較簡單

[java] view plain copy
  1. public class TransFragmentPagerAdapter extends FragmentPagerAdapter {  
  2.   
  3.     List<Fragment> fragments;   
  4.     public TransFragmentPagerAdapter(FragmentManager fm,List<Fragment> _fragments)  
  5.     {  
  6.         super(fm);  
  7.         this.fragments = _fragments;  
  8.     }  
  9.       
  10.     public TransFragmentPagerAdapter(FragmentManager fm) {  
  11.         super(fm);  
  12.         // TODO Auto-generated constructor stub  
  13.     }  
  14.   
  15.     @Override  
  16.     public Fragment getItem(int arg0) {  
  17.         // TODO Auto-generated method stub  
  18.         return fragments.get(arg0);  
  19.     }  
  20.   
  21.     @Override  
  22.     public int getCount() {  
  23.         // TODO Auto-generated method stub  
  24.         return fragments.size();  
  25.     }  
  26. }  


二:利用viewpager滑動分頁1(不推薦,使用setCurrentItem(1)始終效果不理想,而且滑動後需要重新加載數據)

滑動分頁技巧,viewpager裏邊添加三個fragment,其中兩個先顯示進度條,

 有三個fragment就可以向右向左滑動,以模擬上一頁下一頁,當滑動到其他頁就加載數據,加載完後設置myviewpage.setCurrentItem(1),

 就又可以進行左右滑動了,由於設置myviewpage.setCurrentItem(1)不要有滑動效果不然用戶不友好,可以反射改變etCurrentItem(1)

 的速度http://blog.csdn.NET/aojiancc2/article/details/40427207


這裏要主要幾點,viewpager進行fragment管理時生命週期是比如ViewPager有5個page,剛打開的時候,會加載page1和page2.....,我們手動切換到page2的時候,會加載page3,切換到page3的時候,加載page4的同時會destory掉page1

所以不要想到滑動到下一頁的時候會執行分頁fragment的創建方法,應該自己寫數據獲得方法,自己在滑動結束事件裏邊調用


1:創建分頁滑動viewpager主容器,這裏也是一個fragment

[java] view plain copy
  1. public class LcVpFragment extends Fragment{  
  2.   
  3.     @Override  
  4.     public void onActivityCreated(Bundle savedInstanceState) {  
  5.         // TODO Auto-generated method stub        
  6.         super.onActivityCreated(savedInstanceState);  
  7.           
  8.         List<Fragment> listviews  = new ArrayList<Fragment>();  
  9.           
  10.               
  11.          ViewPager myviewpage = (ViewPager)getActivity().findViewById(R.id.trans_page);   
  12.                    
  13.             TransFragment trs = new TransFragment();  
  14.             trs.setArguments(getArguments());//傳參數  
  15.             NextPagerFragment next =new NextPagerFragment(myviewpage,trs);  
  16.             next.setArguments(getArguments());  
  17.             NextPagerFragment previous =new NextPagerFragment(myviewpage,trs);  
  18.             previous.setArguments(getArguments());  
  19.               
  20.             listviews.add(previous);   
  21.             listviews.add(trs);   
  22.             listviews.add(next);  
  23.            
  24.            
  25.          TransFragmentPagerAdapter mypagetadapter = new TransFragmentPagerAdapter(getActivity().getSupportFragmentManager(),listviews);    
  26.          myviewpage.setAdapter(mypagetadapter);    
  27.            
  28.          myviewpage.setCurrentItem(1);  
  29.            
  30.          MyOnPageChangeListener mo = new MyOnPageChangeListener(myviewpage,listviews);  
  31.          myviewpage.setOnPageChangeListener(mo);  
  32.     }  
  33.   
  34.     @Override  
  35.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  36.             Bundle savedInstanceState) {  
  37.         // TODO Auto-generated method stub  
  38.         return inflater.inflate(R.layout.myviewpager, container, false);  
  39.     }     
  40. }  

2:爲viewpager設置滑動事件這裏很關鍵

[java] view plain copy
  1. class MyOnPageChangeListener implements OnPageChangeListener  
  2. {  
  3.       
  4.     int currentpage = 1;  
  5.     ViewPager myviewpage;  
  6.     List<Fragment> listviews;  
  7.       
  8.     public MyOnPageChangeListener(ViewPager _myviewpage,List<Fragment> _listviews)  
  9.     {  
  10.         listviews = _listviews;  
  11.         myviewpage = _myviewpage;  
  12.     }  
  13.       
  14.     public void onPageScrollStateChanged(int arg0) {  
  15.         // TODO Auto-generated method stub  
  16.           
  17.     }  
  18.   
  19.     public void onPageScrolled(int _current, float arg1, int arg2) {  
  20.           
  21.     }  
  22.   
  23.     public void onPageSelected(int _current) {  
  24.         if(_current == 1)  
  25.             return;  
  26.           
  27.         // TODO Auto-generated method stub  
  28.         if(_current==0)//上一頁  
  29.         {  
  30.             if(currentpage == 1)//已經是第一頁了  
  31.             {  
  32.                 myviewpage.setCurrentItem(1);  
  33.                 return;  
  34.             }  
  35.             currentpage--;  
  36.         }  
  37.         else if(_current==2)//下一頁  
  38.         {  
  39.             currentpage++;    
  40.         }  
  41.           
  42.         //獲取到分頁fragment執行GetData查詢當前頁數據,然後把數據傳遞到展示數據的fragment在進行切換即可  
  43.         NextPagerFragment nex = (NextPagerFragment)listviews.get(_current);  
  44.         nex.GetData(currentpage);  
  45.     }             
  46. }  

3:分頁fragment

[java] view plain copy
  1. public class NextPagerFragment extends Fragment{  
  2.   
  3.     ViewPager myviewpage;  
  4.     TransFragment trs;  
  5.     public NextPagerFragment(ViewPager _myviewpage,TransFragment _trs)  
  6.     {  
  7.         myviewpage = _myviewpage;  
  8.         trs = _trs;  
  9.     }  
  10.       
  11.     @Override  
  12.     public void onActivityCreated(Bundle savedInstanceState) {  
  13.         // TODO Auto-generated method stub  
  14.         super.onActivityCreated(savedInstanceState);                  
  15.     }     
  16.       
  17.     public void GetData(int current)  
  18.     {  
  19.          System.out.println("當前第幾頁:"+current);  
  20.          String phpsession = getArguments().getString("laravel_session");  
  21.          new TransportationData().getData_hp(phpsession,new Action()  
  22.          {  
  23.             public void action(String _data) {     
  24.                  Message message = new Message();        
  25.                  message.obj = _data;        
  26.                  handler.sendMessage(message);    
  27.             }          
  28.          },current);  
  29.     }  
  30.       
  31.     @SuppressLint("HandlerLeak")  
  32.     final Handler handler = new Handler(){   
  33.         public void handleMessage(Message msg) {              
  34.             trs.SetPageData(String.valueOf(msg.obj));//爲數據展示的fragment加載數據  
  35.             myviewpage.setCurrentItem(1);//然後進行切換  
  36.         }  
  37.     };  
  38.       
  39.     @Override  
  40.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  41.             Bundle savedInstanceState) {  
  42.         // TODO Auto-generated method stub  
  43.         return inflater.inflate(R.layout.nextpager, container, false);  
  44.     }     
  45. }  


4:負責數據顯示的frament這裏給出簡單的展示

[java] view plain copy
  1. public class TransFragment extends Fragment{  
  2.   
  3.     @Override  
  4.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  5.             Bundle savedInstanceState) {  
  6.         // TODO Auto-generated method stub  
  7.         return inflater.inflate(R.layout.mytable_trans, container, false);  
  8.         //return super.onCreateView(inflater, container, savedInstanceState);  
  9.     }  
  10.   
  11.     public void SetPageData(String _pagedata)  
  12.     {  
  13.         setData(String.valueOf(_pagedata));  
  14.     }  
  15.       
  16.     public void setData(String _data)  
  17.     {  
  18.         //加載數據即可  
  19.     }  
  20.       
  21.     @Override  
  22.     public void onActivityCreated(Bundle savedInstanceState) {  
  23.         // TODO Auto-generated method stub  
  24.         super.onActivityCreated(savedInstanceState);  
  25.         GetData();  
  26.     }     
  27. }  



http://www.cnblogs.com/tiantianbyconan/p/3364728.html

http://www.360doc.com/content/13/1115/23/14218823_329558883.shtml

http://www.2cto.com/kf/201404/292031.html


三:利用viewpager滑動分頁2


其實viewpager添加多個fragment,利用他的加載方式可以很輕鬆的實現滑動分頁

1:加載需要分頁的fragment

[java] view plain copy
  1. for(int i=0;i<4;i++)  
  2.        {  
  3.            Bundle bu = new Bundle();    
  4.            bu.putInt("cpage",i+1);  
  5.            TransFragment trs = new TransFragment();  
  6.            trs.setArguments(bu);  
  7.            listviews.add(trs);   
  8.        }  


2:fragment

注意這裏fragment所有的控件都要後臺新生成,因爲都是用的同一個類,如果加載同一個佈局文件會有衝突

[java] view plain copy
  1. LinearLayout layout;  
  2.     @Override  
  3.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  4.             Bundle savedInstanceState) {  
  5.         // TODO Auto-generated method stub  
  6.         layout=new LinearLayout(getActivity());  
  7.           ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(  
  8.                     ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);  
  9.         layout.setOrientation(LinearLayout.VERTICAL);//顯示方向  
  10.         layout.setLayoutParams(params);  
  11.                   
  12.         return layout;  
  13.         //return inflater.inflate(R.layout.mytable_trans, container, false);  
  14.         //return super.onCreateView(inflater, container, savedInstanceState);  
  15.     }  

[java] view plain copy
  1. @Override  
  2.     public void onActivityCreated(Bundle savedInstanceState) {  
  3.         // TODO Auto-generated method stub  
  4.         super.onActivityCreated(savedInstanceState);  
  5.         int cpage = getArguments().getInt("cpage");  
  6.         GetData(cpage);  
  7.     }     

當然在需要的時候可以調用fragment集合,取出需要的fragment調用getdata方法,實現刷新,例如

[java] view plain copy
  1. public void onPageSelected(int _current) {        
  2.         ((CargoinfoFragment) listviews.get(_current)).GetData(_current);  
  3.     }   

當刪除了需要刷新時,可以在FragmentActivity類重新加載一次分頁的fragemt,但是要注意先把以前的刪除掉,不能數據可能會錯亂

[java] view plain copy
  1. public void switchContent(Fragment fragment,boolean isdelete) {  
  2.           
  3.         if(isdelete){  
  4.             List<Fragment> li = getSupportFragmentManager().getFragments();         
  5.             for(int i=0;i<li.size();i++)  
  6.             {  
  7.                 Fragment f=li.get(i);  
  8.                 System.out.println("類型:"+f.getClass());  
  9.                 getSupportFragmentManager().beginTransaction().remove(f).commit();  
  10.             }  
  11.         }  
  12.         try{              
  13.         getSupportFragmentManager()  
  14.         .beginTransaction()  
  15.         .replace(R.id.bt,fragment)  
  16.         .addToBackStack("msg_fragment")//返回鍵不回來  
  17.         .commit();     
  18.         }  
  19.         catch(Exception e)  
  20.         {  
  21.             System.out.println("主類調用異常:"+e);  
  22.         }  
  23.     }
發佈了0 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章