android viewpager+fragment与利用viewpager滑动分页小技巧


一:简单的实现viewpage进行fragment的滑动切换

public class LcVpFragment extends Fragment{

	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		// TODO Auto-generated method stub		
		super.onActivityCreated(savedInstanceState);
		
		List<Fragment> listviews  = new ArrayList<Fragment>();
		
		TransFragment trs = new TransFragment();
		trs.setArguments(getArguments());//传参数
		
		listviews.add(new NextPagerFragment()); 
		listviews.add(trs); 
		listviews.add(new NextPagerFragment());
			
		 ViewPager myviewpage = (ViewPager)getActivity().findViewById(R.id.trans_page);  	 
		 TransFragmentPagerAdapter mypagetadapter = new TransFragmentPagerAdapter(getActivity().getSupportFragmentManager(),listviews);  
	     myviewpage.setAdapter(mypagetadapter);  
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		return inflater.inflate(R.layout.myviewpager, container, false);
		//return super.onCreateView(inflater, container, savedInstanceState);
	}
}

继承Fragment适配器FragmentPagerAdapter,Fragment的适配器比较简单

public class TransFragmentPagerAdapter extends FragmentPagerAdapter {

	List<Fragment> fragments; 
	public TransFragmentPagerAdapter(FragmentManager fm,List<Fragment> _fragments)
	{
		super(fm);
		this.fragments = _fragments;
	}
	
	public TransFragmentPagerAdapter(FragmentManager fm) {
		super(fm);
		// TODO Auto-generated constructor stub
	}

	@Override
	public Fragment getItem(int arg0) {
		// TODO Auto-generated method stub
		return fragments.get(arg0);
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return fragments.size();
	}
}


二:利用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

public class LcVpFragment extends Fragment{

	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		// TODO Auto-generated method stub		
		super.onActivityCreated(savedInstanceState);
		
		List<Fragment> listviews  = new ArrayList<Fragment>();
		
			
		 ViewPager myviewpage = (ViewPager)getActivity().findViewById(R.id.trans_page); 
		 		 
			TransFragment trs = new TransFragment();
			trs.setArguments(getArguments());//传参数
			NextPagerFragment next =new NextPagerFragment(myviewpage,trs);
			next.setArguments(getArguments());
			NextPagerFragment previous =new NextPagerFragment(myviewpage,trs);
			previous.setArguments(getArguments());
			
			listviews.add(previous); 
			listviews.add(trs); 
			listviews.add(next);
		 
		 
		 TransFragmentPagerAdapter mypagetadapter = new TransFragmentPagerAdapter(getActivity().getSupportFragmentManager(),listviews);  
	     myviewpage.setAdapter(mypagetadapter);  
	     
	     myviewpage.setCurrentItem(1);
	     
	     MyOnPageChangeListener mo = new MyOnPageChangeListener(myviewpage,listviews);
	     myviewpage.setOnPageChangeListener(mo);
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		return inflater.inflate(R.layout.myviewpager, container, false);
	}	
}

2:为viewpager设置滑动事件这里很关键

class MyOnPageChangeListener implements OnPageChangeListener
{
	
	int currentpage = 1;
	ViewPager myviewpage;
	List<Fragment> listviews;
	
	public MyOnPageChangeListener(ViewPager _myviewpage,List<Fragment> _listviews)
	{
		listviews = _listviews;
		myviewpage = _myviewpage;
	}
	
	public void onPageScrollStateChanged(int arg0) {
		// TODO Auto-generated method stub
		
	}

	public void onPageScrolled(int _current, float arg1, int arg2) {
		
	}

	public void onPageSelected(int _current) {
		if(_current == 1)
			return;
		
		// TODO Auto-generated method stub
		if(_current==0)//上一页
		{
			if(currentpage == 1)//已经是第一页了
			{
				myviewpage.setCurrentItem(1);
				return;
			}
			currentpage--;
		}
		else if(_current==2)//下一页
		{
			currentpage++;	
		}
		
		//获取到分页fragment执行GetData查询当前页数据,然后把数据传递到展示数据的fragment在进行切换即可
		NextPagerFragment nex = (NextPagerFragment)listviews.get(_current);
		nex.GetData(currentpage);
	}   		
}

3:分页fragment

public class NextPagerFragment extends Fragment{

	ViewPager myviewpage;
	TransFragment trs;
	public NextPagerFragment(ViewPager _myviewpage,TransFragment _trs)
	{
		myviewpage = _myviewpage;
		trs = _trs;
	}
	
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onActivityCreated(savedInstanceState);				
	}	
	
	public void GetData(int current)
	{
		 System.out.println("当前第几页:"+current);
		 String phpsession = getArguments().getString("laravel_session");
		 new TransportationData().getData_hp(phpsession,new Action()
		 {
			public void action(String _data) {	 
				 Message message = new Message();      
			     message.obj = _data;      
			     handler.sendMessage(message);  
			}		 
		 },current);
	}
	
	@SuppressLint("HandlerLeak")
	final Handler handler = new Handler(){ 
	    public void handleMessage(Message msg) { 	        
	    	trs.SetPageData(String.valueOf(msg.obj));//为数据展示的fragment加载数据
			myviewpage.setCurrentItem(1);//然后进行切换
	    }
	};
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		return inflater.inflate(R.layout.nextpager, container, false);
	}	
}


4:负责数据显示的frament这里给出简单的展示

public class TransFragment extends Fragment{

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		return inflater.inflate(R.layout.mytable_trans, container, false);
		//return super.onCreateView(inflater, container, savedInstanceState);
	}

	public void SetPageData(String _pagedata)
	{
		setData(String.valueOf(_pagedata));
	}
	
	public void setData(String _data)
	{
		//加载数据即可
	}
	
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onActivityCreated(savedInstanceState);
		GetData();
	}	
}



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

for(int i=0;i<4;i++)
	   {
		   Bundle bu = new Bundle();  
	       bu.putInt("cpage",i+1);
		   TransFragment trs = new TransFragment();
		   trs.setArguments(bu);
		   listviews.add(trs); 
	   }


2:fragment

注意这里fragment所有的控件都要后台新生成,因为都是用的同一个类,如果加载同一个布局文件会有冲突

LinearLayout layout;
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		layout=new LinearLayout(getActivity());
		  ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
	                ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
	    layout.setOrientation(LinearLayout.VERTICAL);//显示方向
	    layout.setLayoutParams(params);
	    	    
	    return layout;
		//return inflater.inflate(R.layout.mytable_trans, container, false);
		//return super.onCreateView(inflater, container, savedInstanceState);
	}

@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onActivityCreated(savedInstanceState);
		int cpage = getArguments().getInt("cpage");
		GetData(cpage);
	}	

当然在需要的时候可以调用fragment集合,取出需要的fragment调用getdata方法,实现刷新,例如

public void onPageSelected(int _current) {		
		((CargoinfoFragment) listviews.get(_current)).GetData(_current);
	} 

当删除了需要刷新时,可以在FragmentActivity类重新加载一次分页的fragemt,但是要注意先把以前的删除掉,不能数据可能会错乱

public void switchContent(Fragment fragment,boolean isdelete) {
		
		if(isdelete){
			List<Fragment> li = getSupportFragmentManager().getFragments();	    
		    for(int i=0;i<li.size();i++)
		    {
		    	Fragment f=li.get(i);
		    	System.out.println("类型:"+f.getClass());
		    	getSupportFragmentManager().beginTransaction().remove(f).commit();
		    }
		}
		try{			
        getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.bt,fragment)
        .addToBackStack("msg_fragment")//返回键不回来
        .commit();   
        }
		catch(Exception e)
		{
			System.out.println("主类调用异常:"+e);
		}
    } 



  








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值