ViewPager相关问题总结

来源:互联网 发布:cx one4.41软件 编辑:程序博客网 时间:2024/06/18 08:52

ViewPager是Android开发中常用控件之一,实现左右滑动的功能。可以与fragment嵌套使用。
在ViewPager控件中,需要实现其监听事件:OnPageChangeListener,然后重写该监听器的三个回调方法:

  • public void onPageScrolled(int position, float positionOffset, int
    positionOffsetPixels)
  • public void onPageSelected(int position)

  • public void onPageScrollStateChanged(int state)

其中:
onPageScrolled(int position, float positionOffset, int positionOffsetPixels) :当页面在滑动时会调用此方法,在滑动被停止之前,此方法会一直得到调用。其中三个参数的含义分别为:

  • position :当前页面,即你点击滑动的页面;
  • positionOffset:表示当前页面偏移的百分比,范围是0~1,用来表示当前页滑动的位置,数值越大,就表示滑动的幅度越大;
  • positionOffsetPixels:当前页面偏移的像素位置 。

onPageSelected(int position):此方法是页面跳转完后得到调用,position为当前选中页面的position(位置编号)。

onPageScrollStateChanged(int state):此方法是在状态改变的时候调用,其中state这个参数有三种状态(0,1,2),分别对应常量SCROLL_STATE_IDLESCROLL_STATE_DRAGGINGSCROLL_STATE_SETTLING。state==0 表示什么也不做,state==1 表示正在滑动,state==2 表示滑动完毕。当页面开始滑动的时候,三种状态的变化顺序依次为(1,2,0)。

1、ViewPager如何判断左右滑动的方向

注意到,onPageScrolled 和 onPageSelected 这两个方法中都有一个共同的参数:position,记录当前页面的位置。于是,可以设置一个全局私有变量 currentPageIndex 并初始化为0,将 position 与 currentPageIndex 进行比较,即可在这两个方法中判断左右滑动的方向。

@Override            public void onPageSelected(int position) {                if (position>currentPageIndex) {                    Log.i("ViewPager", "从左->右");                    currentPageIndex = position;//每次比较后currentPageIndex 重置为当前position                    return;                }                if (position<currentPageIndex) {                    Log.i("ViewPager", "从右->左 ");                    currentPageIndex = position;                    return;                }                if (position==currentPageIndex) {                    Log.i("ViewPager", "无滑动 ");                    return;                }            }

2、ViewPager如何判断已经滑动到第一页或最后一页

@Override       public void onPageScrollStateChanged(int state) {                switch (state) {                case ViewPager.SCROLL_STATE_IDLE:                    if (viewPager.getCurrentItem() == 0) {                        Toast.makeText(MainActivity.this, "已经是第一页了",Toast.LENGTH_LONG).show();                    }else if (viewPager.getCurrentItem() == viewPager.getAdapter().getCount()-1) {                        Toast.makeText(MainActivity.this, "已经是最后一页了",Toast.LENGTH_LONG).show();                    }                                       break;                default:                    break;                }            }

3、ViewPager缓存机制、预加载相关
这里写图片描述
这里写图片描述
ViewPager 源码中,默认的 DEFAULT_OFFSCREEN_PAGES = 1,会默认缓存相邻的 2 个 Fragment 以便快速切换,非相邻的 Fragment 会被销毁掉。当 limit<0 时,强行将 limit 置为 1 。若设置 limit=N(limit !=1),可以预先加载 N 个页面,适用于如音乐播放时,自动加载歌词。
这就是涉及到 ViewPager 的预加载机制,即如果你处于当前某个页面,会预先加载下一个 Fragment 。但有时候涉及到网络请求或其他的耗时操作,就需要取消掉预加载,否则资源开销大。
默认的 DEFAULT_OFFSCREEN_PAGES = 1,可以通过设置 DEFAULT_OFFSCREEN_PAGES = 0,取消预加载。但这样需要修改jar包。
还有一种方法:见这篇博文

参考:
ViewPager缓存(预加载)机制及如何禁止预加载

1 0
原创粉丝点击