ViewPager

<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;"><android.support.v4.view.ViewPager</span>
        android:id="@+id/vp_viewpage"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
   </android.support.v4.view.ViewPager>

v4是兼容包,解决向下兼容问题

转载请注明出处:http://blog.csdn.net/wei_chong_chong/article/details/50935578

加载显示的页卡

将Layout布局转换为View对象的两种方式

 (1)LayoutInflater lf = getLayoutInflater().from(this);

      lf.inflate(resource,root);

   (2)View.inflate(context,resource,root);

ViewPager相当于一个容器,里面可以装两种东西:(1)Fragment,(2)view对象

配置Adapter

(1)ViewPagerAdapter数据源:List<View>

(2)FragmentPagerAdapter数据源:List<Fragment>

  (3)FragmentStatePagerAdapter数据源:List<Fragment>

先来学习ViewPagerAdapter

如下所示先来说一下PageTabStrip和PagerTitleStrip

这两个是ViewPager的子级标签

是用来显示页面的标题的,一般使用其中一个就行了,如果两个同时写,这上面那个将会失效,实际开发过程中,我们只使用其中一个

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" >

        <android.support.v4.view.PagerTabStrip
            android:id="@+id/tab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
        </android.support.v4.view.PagerTabStrip>

        <android.support.v4.view.PagerTitleStrip
            android:id="@+id/pagertitle"
            android:layout_width="fill_parent"
            android:layout_height="45dp"
            android:layout_gravity="bottom" />
    </android.support.v4.view.ViewPager>

</LinearLayout>


首先在MainActivity中

private ViewPager pager;
	private List<View>viewList;
	private List<String>titleList;
	private PagerTabStrip tab;
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		/**
		 * 将Layout布局转换为View对象
		 * 通过View对象去作为ViewPager的数据源
		 */
		View view1 = View.inflate(this, R.layout.view1, null);
		View view2 = View.inflate(this, R.layout.view2, null);
		View view3 = View.inflate(this, R.layout.view3, null);
		View view4 = View.inflate(this, R.layout.view4, null);

		viewList=new ArrayList<View>();
		viewList.add(view1);
		viewList.add(view2);
		viewList.add(view3);
		viewList.add(view4);

		titleList=new ArrayList<String>();
		titleList.add("第一页");
		titleList.add("第二页");
		titleList.add("第三页");
		titleList.add("第四页");


		tab=(PagerTabStrip) findViewById(R.id.tab);
		//为PagerTabStrip设置一些属性
		tab.setBackgroundColor(Color.YELLOW);//设置背景颜色
		tab.setTabIndicatorColor(Color.BLUE);//设置下面短粗线的颜色
		tab.setDrawFullUnderline(false);//消去下面的长线
		//设置文字颜色
		tab.setTextColor(Color.RED);

		//初始化ViewPager
		pager=(ViewPager) findViewById(R.id.pager);
		//创建PagerAdapter的适配器
		MyViewPagerAdapter adapter=new MyViewPagerAdapter(viewList, titleList);
		//加载适配器
		pager.setAdapter(adapter);


新建类创建适配器MayPagerAdapter,这里为每个页面添加了title

public class MyViewPagerAdapter extends PagerAdapter{

	private List<View>viewList;
	private List<String>titleList;
	
	public MyViewPagerAdapter(List<View>viewList,List<String>titleList)
	{
		this.viewList=viewList;
		this.titleList=titleList;
	}
	
	//返回所有视图的数量,页卡的数量
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return viewList.size();
	}
  
	//判断视图view是否由对象产生
	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		// TODO Auto-generated method stub
		return arg0==arg1;
	}
	
	//实例化一个页面
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
    	// TODO Auto-generated method stub
    	container.addView(viewList.get(position));
    	return viewList.get(position);
    }
    
    //删除销毁页面
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
    	// TODO Auto-generated method stub
    	container.removeView(viewList.get(position));
    }
    
    @Override
    public CharSequence getPageTitle(int position) {
    	// TODO Auto-generated method stub
    	return titleList.get(position);
    }

}

Adapter里面的常用方法

(1)getCount()需要返回所有页面的shul

(2)isViewFromObject(View arg0,Object arg1)判断视图是否由对象产生

(3)instantiateItem(ViewGroup containter,int position)实例化界面

(4)destroyItem(ViewGroup container,int position,Object object)销毁页面

(5

getPageTitle(int postiton)返回页面标题信息

下面学习FragmentPagerAdapter

首先写四个myFragment类继承Fragment.,需要导入v4包下的Fragment

在MainActivity中初始化,注意:下面在使用MyFragmentPagerAdapter时

构造方法的第一个参数必须使用getSupportFragmentManager()方法获取Fragment管理者而不是getFragmentManager()方法,因为创建Fragment时使用的是v4兼容包,(为了配合v4兼容包)并且必须让MainActivity继承自FragmentActivity而不是Activity

fragList=new ArrayList<Fragment>();
		fragList.add(new Fragment1());
		fragList.add(new Fragment2());
		fragList.add(new Fragment3());
		fragList.add(new Fragment4());
<span style="white-space:pre">	</span>MyFragmentPagerAdapter adapter2=new MyFragmentPagerAdapter(getSupportFragmentManager(), fragList, titleList);
<span style="white-space:pre">	</span>pager.setAdapter(adapter2);<span style="white-space:pre">		</span>
创建myFragmentPagerAdapter

package com.example.android_viewpager;

import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.ViewGroup;

public class MyFragmentPagerAdapter extends FragmentPagerAdapter{

	private List<Fragment>fragList;
	private List<String>titleList;
	public MyFragmentPagerAdapter(FragmentManager fm,List<Fragment> fragList,List<String>titleList) {
		super(fm);
		// TODO Auto-generated constructor stub
		this.fragList=fragList;
		this.titleList=titleList;
	}

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

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return fragList.size();
	}
	
	@Override
	public CharSequence getPageTitle(int position) {
		// TODO Auto-generated method stub
		return titleList.get(position);
	}
	

}

ViewPagerAdapter和FragmentPagerAdapter的区别:

ViewPagerAdapter是动态加载和销毁页面的:

ViewPagerAdapter当页面超过三个时,一次加载3个页面(1,2,3)当显示第三个页面时,第一个页面将被销毁,第四个页面会提前被加载

FragmentPageAdapter不会动态加载和销毁,它是一次性加载完所有的页面,当页面超过3个时不推荐使用

FragmentStatePagerAdapter 和前面的 FragmentPagerAdapter 一样,是继承子 PagerAdapter。但是,和 FragmentPagerAdapter 不一样的是,正如其类名中的 'State' 所表明的含义一样,该 PagerAdapter 的实现将只保留当前页面,当页面离开视线后,就会被消除,释放其资源;而在页面需要显示时,生成新的页面(就像 ListView 的实现一样)。这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存。

解决办法:使用FragmentStatePagerAdapte

让MyFragmentPagerAdapter继承自FragmentStatePagerAdapter,并另外重写其中的两个方法就可以实现动态加载和销毁页面了

@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		// TODO Auto-generated method stub
		super.destroyItem(container, position, object);
	}
	
	@Override
	public Object instantiateItem(ViewGroup arg0, int arg1) {
		// TODO Auto-generated method stub
		return super.instantiateItem(arg0, arg1);
	}


package com.example.android_viewpager;

import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.view.ViewGroup;

public class MyFragmentPagerAdapter2 extends FragmentStatePagerAdapter{

	private List<Fragment>fragList;
	private List<String>titleList;
	public MyFragmentPagerAdapter2(FragmentManager fm,List<Fragment> fragList,List<String>titleList) {
		super(fm);
		// TODO Auto-generated constructor stub
		this.fragList=fragList;
		this.titleList=titleList;
	}

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

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return fragList.size();
	}
	
	@Override
	public CharSequence getPageTitle(int position) {
		// TODO Auto-generated method stub
		return titleList.get(position);
	}
	
	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		// TODO Auto-generated method stub
		super.destroyItem(container, position, object);
	}
	
	@Override
	public Object instantiateItem(ViewGroup arg0, int arg1) {
		// TODO Auto-generated method stub
		return super.instantiateItem(arg0, arg1);
	}
	

}
总结:

Fragment的生命周期比较全,它的创建销毁等比View好控制

所有在做交互界面时使用Fragment,如果界面只是为了展示可以使用ViewPagerAdapter

你可能感兴趣的:(ViewPager)