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)
其中:
position :当前页面,即你点击滑动的页面;
positionOffset:表示当前页面偏移的百分比,范围是0~1,用来表示当前页滑动的位置,数值越大,就表示滑动的幅度越大;
positionOffsetPixels:当前页面偏移的像素位置 。
1、ViewPager如何判断左右滑动的方向
注意到,onPageScrolled 和 onPageSelected 这两个方法中都有一个共同的参数:position,记录当前页面的位置。于是,可以设置一个全局私有变量 currentPageIndex 并初始化为0,将 position 与 currentPageIndex 进行比较,即可在这两个方法中判断左右滑动的方向。
2、ViewPager如何判断已经滑动到第一页或最后一页
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缓存(预加载)机制及如何禁止预加载
在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缓存(预加载)机制及如何禁止预加载
相关文章推荐
- PresentModalViewController(模态) 相关问题总结
- 完美解决关于禁止ViewPager预加载的相关问题
- 关于智能家居主界面,通话记录界面设计的相关问题(ViewPager以及自定view)
- ScorllView相关问题总结
- Viewpager 的相关总结
- ScrollView嵌套ListView,ViewPager问题总结(二)
- ViewPager相关总结
- android View绘制相关问题总结
- VS6.0单文档工程中,View界面想使用CListCtrl & list = GetListCtrl(); 问题总结
- C#线程相关问题总结:基本操作及UI控件交互
- 数据库相关问题的部分总结
- MFC中SDI,视类继承于CFormView引发的相关问题
- 关于view类里触摸屏相应的相关问题汇总
- Windows相关问题总结
- 虚拟环境XP不能访问Linux 相关服务问题总结 推荐
- mtk平台,相关问题总结
- VB6.0 程序升级到 VB 2008 相关问题总结
- C#线程相关问题总结:基本操作及UI控件交互
- php代码优化及php相关问题总结
- DLL 问题 - 相关总结 一个网友的 wltg2001