您的位置:首页 > 其它

ViewPager相关问题总结

2016-08-20 19:09 197 查看
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_IDLE、SCROLL_STATE_DRAGGING、SCROLL_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缓存(预加载)机制及如何禁止预加载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: