ViewPager使用方式

一开始接触ViewPager有一种懵逼的感觉,不是很清楚ViewPager是如何工作的,后来嘛。。。还是看下去吧

  1. 适配器:

    `ViewPager` 对应的适配器:`PagerAdapter`
    
  2. 滑动监听

    ①滑动方向:左右滑动
    ②滑动监听:addOnPageChangeListener

  3. 代码设置选中项

    setCurrentItem

下面就开始正式讲一下ViewPager 的使用了


PagerAdapterPageView的适配器)

PagerAdapter有四大函数,如想实现正常界面滑动,那么在Adapter 里就必须实现这四大函数

下面结合demo讲解:

        PagerAdapter mPagerAdapter = new PagerAdapter() {
            @Override
            public int getCount() {
                //View的count
                return mViewList.size();
            }

            @Override
            public boolean isViewFromObject(View view, Object object) {
                //object为instantiateItem  return的Object对象

                return view == object;
            }

            @Override
            public Object instantiateItem(ViewGroup container, int position) {

                container.addView(mViewList.get(position));
                return mViewList.get(position);
            }

            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {

                container.removeView(mViewList.get(position));

            }

        };
  • 函数一:getCount()

    这个方法在 ListViewAdapter 中我们也见过,返回的是item的总数量,在PagerAdapter 也是一样,返回的是要滑动的View的总数量

  • 函数二:isViewFromObject

    这个函数通过比较View来判断显示的是否是同一张图片,此函数的object 参数为instantiateItem 函数的返回值

  • 函数三:instantiateItem

    这个函数主要用了两件事,①将当前视图添加到container中,②返回当前View

  • 函数四:destroyItem

    这个函数从当前container中删除指定位置(position)的View

拓展:PagerTitleStripPagerTabStrip

这两个控件的主要作用是给滑动的界面添加标题,如下图所示:

这里写图片描述

demo:以 PagerTitleStrip 为例:在xml中,控件嵌套位置

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="300dp">

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

    </android.support.v4.view.ViewPager>

展示标题 : 除重写四个必要函数外,还需重写getPageTitle( )方法

        PagerAdapter mPagerAdapter = new PagerAdapter() {
            @Override
            public int getCount() {
                //View的count
                return mViewList.size();
            }

            @Override
            public boolean isViewFromObject(View view, Object object) {
                //object为instantiateItem  return的Object对象

                return view == object;

            }

            @Override
            public Object instantiateItem(ViewGroup container, int position) {

                container.addView(mViewList.get(position));
                return mViewList.get(position);

            }

            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {

                container.removeView(mViewList.get(position));

            }

            @Override
            public CharSequence getPageTitle(int position) {  //只是显示标题,非必须实现方法
                return mTitleList.get(position);
            }
        };

PagerTabStripPagerTitleStrip 的实现代码是一样的,同样需要重写getPageTitle( )方法

除此之外,两者的主要区别为PagerTabStrip 可点击tab标题进行切换页面

下面还有两个方法,可用于优化界面UI:
①每个界面只显示一个标题

   mTitleStrip = (PagerTitleStrip) findViewById(R.id.pager_strip);
   mTitleStrip.getChildAt(0).setVisibility(View.GONE);
   mTitleStrip.getChildAt(2).setVisibility(View.GONE);

②改变PagerTabStrip 下划线颜色

 mTabStrip.setTabIndicatorColorResource(R.color.green);  //改变标题下划线颜色

以上,基础已经了解了,下面我们就该来看看ViewPager 最常用的方式,即和Fragment 结合使用

ViewPagerFragment

ViewPagerFragment 结合使用时,常用的适配器:FragmentPagerAdapter

public class FragmentAdapter extends FragmentPagerAdapter {

    private List<Fragment> mFragments;

    public FragmentAdapter(FragmentManager fm, List<Fragment> fragments) {
        super(fm);
        mFragments = fragments;
    }

    @Override
    public Fragment getItem(int arg0) {
        return mFragments.get(arg0);
    }

    @Override
    public int getCount() {
        return mFragments.size();
    }

}

继承FragmentPagerAdapter,只重写getItem(int)getCount()方法,这两个方法在ListView也是经常见到的,具体什么含义就不解释了

构造适配器:

        mViewPager = (ViewPager) findViewById(R.id.viewPager);

        mFragmentList = new ArrayList<>();
        Fragment1 fragment1 = new Fragment1();
        Fragment2 fragment2 = new Fragment2();
        Fragment3 fragment3 = new Fragment3();
        mFragmentList.add(fragment1);
        mFragmentList.add(fragment2);
        mFragmentList.add(fragment3);

        mViewPager.setAdapter(new FragmentAdapter(getSupportFragmentManager(), mFragmentList));

滑动监听:mViewPager.addOnPageChangeListener(new MyPageChangeListener());

        public class MyPageChangeListener implements ViewPager.OnPageChangeListener {

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            /**
             * 这个方法会在屏幕滚动过程中不断被调用。
             */
        }

        @Override
        public void onPageSelected(int position) {
            /**
             * 当用手指滑动翻页的时候,如果翻动成功了(滑动的距离够长),
             *
             * 手指抬起来就会立即执行这个方法,position就是当前滑动到的页面。
             */

            Toast.makeText(FragmentPagerAct.this, "翻到了第" + (position + 1) + "页", Toast.LENGTH_SHORT).show();

        }

        @Override
        public void onPageScrollStateChanged(int state) {
            /**
             * 这个方法在手指操作屏幕的时候发生变化。有三个值:0(END),1(PRESS) , 2(UP)
             *
             * 当用手指滑动翻页时,手指按下去的时候会触发这个方法,state值为1
             *
             * 手指抬起时,如果发生了滑动(即使很小),这个值会变为2,然后最后变为0
             */

        }
    }

以上,即为ViewPagerFragment结合使用时,常用的方法,其中需要注意的是

mViewPager.setAdapter(new FragmentAdapter(getSupportFragmentManager(), mFragmentList));

内嵌的Fragment需和ViewPager所处Activity导入的包一致

例如:如果使用了v4包下的Fragemnt,那么ViewPager 所处当前Class必须继承FragmentActivity,获取Fragment管理器的方法是getSupportFragmentManager()。

如果使用了app包下的Fragemnt,那么`ViewPager 所处当前Class 直接继承Activity 即可,获取Fragment管理器的方法是getFragmentManager()。

不过我们大多数使用的都是v4包下的Fragemnt


完整Demo代码:点击这里

相关博客:viewPager fragment 懒加载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值