`
phenom
  • 浏览: 406109 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

ViewPager使用中的一些小问题

 
阅读更多
ViewPager是在引入Fragment中一起加入的,它的主要作用就是可以配合ActionBar与Fragment一起,容易的编写一些tab界面.

从Demos里可以看到一些例子,对于如何使用它与Fragment.使用supportv4的包可以将Fragment运用在api level 10以下的系统,但是没有ActionBar,如果想要,需要自己实现.至于如何实现ActionBar再说了.

主要谈谈ViewPager与Fragment一起使用.

代码主要参考Support4Demos中的,可以下载来看下.
ViewPager的初始化:
mPager = (ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mAdapter);

一个适配器是必须的,因为在页面切换时需要一个切换内容的数据列表,就像自己实现ViewFlipper或是使用手势操作一样,但它有一个优点,就是当你移动时,可以先看到下一个界面的内容,而自己实现手势操作,是先看到一片黑色背景,移动成功后才加载新的界面xml与数据.

ViewPager里面还定义了一个
    private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES;默认值 是1,这表示你的预告加载的页面数量是1,假设当前有四个Fragment的tab,显示一个,预先加载下一个.这样你在移动前就已经加载了下一个界面,移动时就可以看到已经加载的界面了.

从日志里面可以看到onActivityCreated等方法在初始化第一个Fragment完成后就会初始化下一个Fragment.

假设你想预先加载多个Fragment可以使用它提供的公共方法:

public void setOffscreenPageLimit(int limit) {
        if (limit < DEFAULT_OFFSCREEN_PAGES) {
            Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " +
                    DEFAULT_OFFSCREEN_PAGES);
            limit = DEFAULT_OFFSCREEN_PAGES;
        }
        if (limit != mOffscreenPageLimit) {
            mOffscreenPageLimit = limit;
            populate();
        }
    }

从这个方法来看,不管你设置什么值,至少会预先加载下一个Fragment,你想预先加载几个就可以传入相应的参数.
这种情况如音乐播放时,如果有自动加载歌词就可以使用了.

如果你的界面需要加载一些大量的数据,但你不想预先加载下一个界面(需要网络或耗时的操作),使用ViewPager却很无耐.特别是下一个界面有可能你一段很长时间不会使用到,如我开发的微博,在显示主页后我不想立即加载下一个界面,因为都有ListView,如果我不访问它,就不必加载无用的资源.

可以通过修改这个值,但有,修改后就会有一个麻烦的地方,因为移动时不会预先加载下一个界面的关系,所以会看到一片黑色的背景.

如果不介意黑色背景,可以覆盖这个类,然后定义默认的加载数量为0
private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES=0;就是不预先加载下一个界面.

如果想预加载,可以使用原来的ViewPager,或这里直接改为mOffscreenPageLimit=你要加载的数量。

由于sdk的更新问题,不是所有v4 support都适合的,v17时就换了

先到这吧.


附件是修改的,包自己建了。v4包是最新版,rev10
分享到:
评论
9 楼 cn23snyga 2013-12-18  
请教贵博!
怎样查看v4 包的版本?!
8 楼 phenom 2013-07-13  
hhbbeijing 写道
V17改成什么样子了,取消预加载好用吗

要看如何使用了.如果是Android-ViewPagerIndicator,似乎不行,
7 楼 hhbbeijing 2013-07-10  
V17改成什么样子了,取消预加载好用吗
6 楼 phenom 2013-01-14  
gybin 写道
1.6的机器会报错。

02-15 01:03:36.419: E/AndroidRuntime(3177): Caused by: java.lang.VerifyError: android.support.v4.os.ParcelableCompat
02-15 01:03:36.419: E/AndroidRuntime(3177): at android.support.v4.view.LazyViewPager$SavedState.<clinit>(Unknown Source)

系统版本太低了,没有兴趣知道为什么,
5 楼 gybin 2013-01-14  
1.6的机器会报错。

02-15 01:03:36.419: E/AndroidRuntime(3177): Caused by: java.lang.VerifyError: android.support.v4.os.ParcelableCompat
02-15 01:03:36.419: E/AndroidRuntime(3177): at android.support.v4.view.LazyViewPager$SavedState.<clinit>(Unknown Source)
4 楼 gjhappyyy 2012-10-10  
setOffscreenPageLimit(0)不起作用呀。您帖子中写

如果不介意黑色背景,可以覆盖这个类,然后定义默认的加载数量为0 
private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES=0;就是不预先加载下一个界面.


是要自己重写ViewPager类,然后重新生成jar包么????
3 楼 si5hao 2012-08-16  
谢谢,不过这种回复很不及时哦,一起到群129506068来讨论学习吧
2 楼 phenom 2012-04-23  
mViewPager.setOffscreenPageLimit(5);
就可以了。会加载后面的5个fragment,当你滚动到相应的页面时,就会显示已经加载的界面了,默认是一个,保证了,当你滚动时,可以立即看到下一个页面,而我改成0,滚动时看不到下一个界面,只有滚动完成了,才会加载数据,布局等。
1 楼 si5hao 2012-04-21  
为什么 设置了都 不起什么作用呢,请问怎么写呢

相关推荐

Global site tag (gtag.js) - Google Analytics