ViewPager

112 阅读2分钟

#ViewPager简介

  • ViewPager就是一个简单的页面切换组件,我们可以往里面填充多个View,然后我们可以左 右滑动,从而切换不同的View;

  • 通过setPageTransformer()方法可以为ViewPager 设置切换时的动画效果;

  • 和前面学的ListView,GridView一样, 我们也需要一个Adapter (适配器)将我们的ViewViewPager进行绑定, 而ViewPager则有一个特定的Adapter—— PagerAdapter;

  • Google官方是建议我们使用Fragment来填充ViewPager的,这样 可以更加方便的生成每个Page,以及管理每个Page的生命周期;

  • 提供了两个Fragment 专用的Adapter: FragmentPageAdapter和FragmentStatePagerAdapter;

  • FragmentPageAdapter: 和PagerAdapter一样, 只会缓存当前的Fragment以及左边一个,右边一个, 即总共会缓存3个Fragment而已, 假如有1,2,3,4四个页面: 处于1页面:缓存1,2 处于2页面:缓存1,2,3 处于3页面:销毁1页面,缓存2,3,4 处于4页面:销毁2页面,缓存3,4 更多页面的情况,依次类推;

  • FragmentStatePagerAdapter: 当Fragment对用户不可见时, 整个Fragment会被销毁, 只会保存Fragment的状态! 而在页面需要重新显示的时候,会生成新的页面!

  • 综上, FragmentPageAdapter适合固定的页面较少的场合; 而FragmentStatePagerAdapter则适合于页面较多或者页面内容非常复杂(需占用大量内存)的情况!

#PagerAdapter的使用

  • 如果想使用PagerAdapter, 只需重写getCount()isViewFromObject()即可;

但官方建议重写下面的四个方法:

  • getCount():获得viewpager中有多少个view;

  • destroyItem():移除一个给定位置的页面。 适配器有责任从容器中删除这个视图。 这是为了确保在finishUpdate(viewGroup)返回时 视图能够被移除。

另外两个方法则涉及到key:

  • instantiateItem(): ①将给定位置的view添加到ViewGroup(容器)中, 创建并显示出来; ②返回一个代表新增页面的Object(key), 通常都是直接返回view本身就可以了, 当然也可以自定义自己的key, 但是key和每个view要一一对应的关系; 示例代码:
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        container.addView(viewLists.get(position));
        return viewLists.get(position);
    }

我们可以看到这个方法其实有点类似于 我们在为RecycleView写的Adapter时, RecycleView.Adapter中的onBindViewHolder()方法, 或者ListView的Adapter中的getView(); onBindViewHolder()是每当子项滑进来的时候, 通过get得到的positon,去数据list取数据,设置到子item布局组件中; ViewPager,PagerAdapterinstantiateItem() 是每当子项(子View,即page)滑进来的时候,

  • isViewFromObject(): 判断instantiateItem(ViewGroup, int)函数 所返回来的Key与一个页面视图是否是代表的同一个视图 (即它俩是否是对应的,对应的表示同一个View), 通常我们直接写return view == object;