#ViewPager简介
-
ViewPager就是一个简单的页面切换组件,我们可以往里面填充多个View,然后我们可以左 右滑动,从而切换不同的View;
-
通过setPageTransformer()方法可以为ViewPager 设置切换时的动画效果;
-
和前面学的ListView,GridView一样, 我们也需要一个
Adapter (适配器)将我们的View和ViewPager进行绑定, 而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,PagerAdapter的instantiateItem()
是每当子项(子View,即page)滑进来的时候,
isViewFromObject(): 判断instantiateItem(ViewGroup, int)函数 所返回来的Key与一个页面视图是否是代表的同一个视图 (即它俩是否是对应的,对应的表示同一个View), 通常我们直接写return view == object;