ViewPager

来源:互联网 发布:手机监听监控定位软件 编辑:程序博客网 时间:2024/05/16 11:15
<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;@Overrideprotected 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);//初始化ViewPagerpager=(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;}//返回所有视图的数量,页卡的数量@Overridepublic int getCount() {// TODO Auto-generated method stubreturn viewList.size();}  //判断视图view是否由对象产生@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stubreturn 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 stubthis.fragList=fragList;this.titleList=titleList;}@Overridepublic Fragment getItem(int arg0) {// TODO Auto-generated method stubreturn fragList.get(arg0);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn fragList.size();}@Overridepublic CharSequence getPageTitle(int position) {// TODO Auto-generated method stubreturn titleList.get(position);}}

ViewPagerAdapter和FragmentPagerAdapter的区别:

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

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

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

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

解决办法:使用FragmentStatePagerAdapte

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

@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {// TODO Auto-generated method stubsuper.destroyItem(container, position, object);}@Overridepublic Object instantiateItem(ViewGroup arg0, int arg1) {// TODO Auto-generated method stubreturn 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 stubthis.fragList=fragList;this.titleList=titleList;}@Overridepublic Fragment getItem(int arg0) {// TODO Auto-generated method stubreturn fragList.get(arg0);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn fragList.size();}@Overridepublic CharSequence getPageTitle(int position) {// TODO Auto-generated method stubreturn titleList.get(position);}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {// TODO Auto-generated method stubsuper.destroyItem(container, position, object);}@Overridepublic Object instantiateItem(ViewGroup arg0, int arg1) {// TODO Auto-generated method stubreturn super.instantiateItem(arg0, arg1);}}
总结:

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

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

0 0
原创粉丝点击