【页面滑动】ViewPager的使用

具体使用思路

//第一步   新建一个view1.xml对象 
//第二步 配置好属性后 在layout文件夹下复制多几个view2,3,4

//第三步 在MainActivity中view1,2,3,4转为View对象、并作为数据源
List<View>viewList=new ArrayList<View>();

//第四步 把布局转成View对象
View view1 = View.inflate(this, R.layout.view1, null);

//第五步 放在数据源集合
viewList.add(view1);

//第六步 新建类MyPagerAdapter 继承PagerAdapter
getCount()//计数方法
return viewList.getSize();//返回页卡数量

isViewFromObject(View arg0,Object arg1);//View是否来自对象
return arg0==arg1;//官方用法

instantiateItem(ViewGroup container,int position);//实例化一个页卡
container.addView(viewList.get(position));//添加当前对象
return viewList.get(position);//返回当前对象

destroyItem(ViewGroup container,int position,Object object);//销毁一个页卡
contianer.removeView(viewList.get(position));//返回当前销毁对象

//第七步   回到MainActivity创建PagerAdapter适配器
//第八步   写好一个ViewPager 传到Activity 然后初始化  
//第九步   给ViewPager加载适配器

ViewPager:为ViewPager设置标题:

//1.在ViewPager容器xml文件中添加子标签
<android.support.v4.view.PagerTabStrip>
</android.support.v4.view.PagerTabStrip>

//2.创建集合并将标题添加入titleList集合
List<String>titleList=new ArrayList<String>();

//3.将titleList传到实例化适配器中的方法来,并在PagAdapter类构造函数中初始化

//4.在PageAdapter类中添加一个函数:
getPageTitle(int position),return titleList.get(position);

//5.初始化PagerTabStrip可以为PagerTabStrip设置一下属性:
tab.setBackgroundColor(Color.YELLOW);
tab.setTextColor(Color.RED);
tab.setDrawFullUnderline(false);
tab.setTabIndicator(Color.GREEN);

//6.与tabStrip类似,设置底部标题,两个同时使用前者有效,一般不一起使用
<android.support.v4.view.PagerTitleStrip>
</android.suppot.v4.view.PagerTitleStrip>

注:
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。

具体作用:
1、对于一个没有被载入或者想要动态载入的界面,都需要用 LayoutInflater.inflate() 来载入
2、对于一个已经载入的界面,就可以使用 Activiyt.findViewById() 方法来获得其中的界面元素。

获得 LayoutInflater 实例的三种方式
1. LayoutInflater inflater = getLayoutInflater(); //调用Activity的getLayoutInflater()
2. LayoutInflater localinflater =(LayoutInflater)context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
3. LayoutInflater inflater = LayoutInflater.from(context);
结论:所以这三种方式最终本质是都是调用的Context.getSystemService()。

ViewPager有三个适配器,适配不同的数据源
1、继承自PagerAdapter的适配器适配List< View>的数据
2、继承自FragmentAdapter的适配器适配List< Fragment>的数据
3、继承自FragmentStateAdapter的适配器适配List< Fragment>的数据
其中后两种的区别是:2没有创建和销毁的过程,3有

FragmentPagerAdater为适配器加载ViewPager
1. Activity布局文件中添加

<android.support.v4.view.ViewPager>
</android.suppot.v4.view.ViewPager>
  1. 初始化数据源
    (1)List< Fragment>数据源
fragList = new ArrayList< Fragment>();
fragList.add(new Fragment1());
fragList.add(new Fragment2());

(2)初始化Tab title数据源

titleList = new ArrayList< String>();
titleList.add("FirstFrag");
titleList.add("SecondFrag");

3.新建一个FragmentPagerAdapter适配器,并重写构造函数和其他的函数

public MyFragemntPagerAdapter(FragmentManager fm, List< Fragment> fragList, List< String> titleList) {
    super(fm);
    this.fragList = fragList;
    this.titleList = titleList;
}

4.在Activity中创建适配器,构造函数中将fragList、titleList都传递进去

MyFragemntPagerAdapter adapter = new MyFragemntPagerAdapter(getSupportFragmentManager(), fragList, titleList);

5.加载适配器

viewPager.setAdapter(adapter);

6.注意
(1)需要新建几个Fragment类来将Layout布局转换成View对象。最后再由List< Fragment>添加进来。
(2)在FragmentPagerAdapter中,所有的页卡是一次创建的,并不会销毁
(3)FragmentStatePagerAdapter,用法和FragmentPagerAdapter一样,只是需要添加
instantiateItem(),destroyItem(),且不需要改
(4)FragmentStatePagerAdapter的区别在于页卡是每次创建3个

OnPageChangeListener滑动事件监听器

//需要三个方法
public void onPageScrollStateChanged(int arg0) {
    //arg0 ==1是正在滑动,arg0==2是滑动完毕了,arg0==0是什么都没做,就是停在那。
    //onPageScrollStateChanged的参数 0表示滑动完毕 1表示按下状态 2表示手指抬起状态
}

public void onPageScrolled(int arg0, float arg1, int arg2) {

    //表示在前一个页面滑动到后一个页面的时候,在前一个页面滑动前调用的方法。
    onPageScrolled(int arg0,float arg1,int arg2);

    /**
     * 当页面在滑动的时候会调用此方法,在滑动被停止之前,
     * 此方法会一直得到调用。其中三个参数的含义分别为:
     * arg0 :当前页面,及你点击滑动的页面
     * arg1:当前页面偏移的百分比
     * arg2:当前页面偏移的像素位置
     */
}

public void onPageSelected(int arg0) {
    //arg0是表示你当前选中的页面,这事件是在你页面跳转完毕的时候调用的。
    //arg0是从0开始计数的
}

注:
1.OnPageChangeListener()——用来监控ViewPager滑动到第几页,position是从零开始计数;

Toast.makeText(this,"当前是第"+(arg0+1)+"个页面", Toast.LENGTH_SHORT).show();

2.在我们的工作中,使用 Fragment 填充 ViewPager 更加常见,即使用 FragmentPagerAdapter 或者 FragmentStatePagerAdapter ,因为Fragment比View拥有更加全面的生命周期,而如果我们使用PagerAdapter,就是直接使用View来填充ViewPager,这种做法不常用。

切换页卡的监听器:
1.OnPageChangListener,其中最常用的函数是onPageSelected(int arg0);
2.Fragment生命周期比较全,以fragment为资源的ViewPager比较好控制,适用于逻辑比较复杂的情况,如果只是为了展示则推荐以view为资源的viewPager比较好开发


下面奉上原始代码:
MainActivity.java :主函数

package com.example.viewpager;

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends FragmentActivity implements
        OnPageChangeListener {

    private List<View> viewList;// 新建数据源集合viewlist
    private ViewPager pager;
    private PagerTabStrip tab;// 附属于pager的子标签
    private List<String> titleList;// 标签名字集合
    private List<Fragment> fragList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 初始化viewList集合
        viewList = new ArrayList<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.add(view1);
        viewList.add(view2);
        viewList.add(view3);
        viewList.add(view4);

        /**
         * 通过Fragment作为ViewPager的数据源
         */
        fragList = new ArrayList<Fragment>();
        fragList.add(new Fragment1());
        fragList.add(new Fragment2());
        fragList.add(new Fragment3());
        fragList.add(new Fragment4());

        // 为ViewPager页卡设置标题
        titleList = new ArrayList<String>();
        titleList.add("第一页");
        titleList.add("第二页");
        titleList.add("第三页");
        titleList.add("第四页");

        // 为PagerTabStrip设置一些属性
        tab = (PagerTabStrip) findViewById(R.id.tab);
        tab.setBackgroundColor(Color.YELLOW);
        tab.setTextColor(Color.RED);
        tab.setDrawFullUnderline(false);// 把长线去掉
        tab.setTabIndicatorColor(Color.BLACK);// 长线上面的小粗线

        // 初始化ViewPager
        pager = (ViewPager) findViewById(R.id.pager);

        // 创建PagerAdapter的适配器
        MyPagerAdapter adapter = new MyPagerAdapter(viewList, titleList);

        // viewPager加载适配器
        // pager.setAdapter(adapter);

        //第二个适配器
        MyFragmentPagerAdapter adapter2 = new MyFragmentPagerAdapter(
            getSupportFragmentManager(), fragList, titleList);
        pager.setAdapter(adapter2);

        pager.setOnPageChangeListener(this);//OnPageChangeListener滑动事件监听器
    }

    /**
     * OnPageChangeListener滑动事件监听器三大方法
     */

    @Override
    public void onPageScrollStateChanged(int arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onPageSelected(int arg0) {
        // TODO Auto-generated method stub
        Toast.makeText(this, "当前是第" + (arg0 + 1) + "个页面", Toast.LENGTH_SHORT).show();
    }
}

MyPagerAdapter.java

package com.example.viewpager;

import java.util.List;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;

public class MyPagerAdapter extends PagerAdapter {

    private List<View> viewList;
    private List<String> titleList;

    public MyPagerAdapter(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));
        // 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));
    }

    /**
     * 设置viewpager页卡的标题
     */
    @Override
    public CharSequence getPageTitle(int position) {
        // TODO Auto-generated method stub
        return titleList.get(position);
    }
}

MyFragmentPagerAdapter.java

package com.example.viewpager;

import java.util.List;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

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;
    }

    /**
     * 得到当前页卡的序号 从0开始
     */
    @Override
    public Fragment getItem(int arg0) {
        // TODO Auto-generated method stub
        return fragList.get(arg0);
    }

    /**
     * 设置viewpager页卡的标题
     */
    @Override
    public CharSequence getPageTitle(int position) {
        // TODO Auto-generated method stub
        return titleList.get(position);
    }

    /**
     * 返回的是页卡的数量
     */
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return fragList.size();
    }
}

xml文件

<?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:layout_gravity="top" >
        </android.support.v4.view.PagerTabStrip>

        <!-- 
        <android.support.v4.view.PagerTitleStrip
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom" >
        </android.support.v4.view.PagerTitleStrip>
         -->
    </android.support.v4.view.ViewPager>

</LinearLayout>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值