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.     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值