您的位置:首页 > 移动开发 > Android开发

ViewPager结合PagerAdapter实现在Fragment下的随手指滑动翻页

2014-07-21 08:48 323 查看
前几天由于项目需要,必须在Fragment下实现月历的翻页功能,虽然可以使用ViewSwitcher来做,但是从用户体验来看,ViewSwitcher切换动画的效果真的是不敢恭维,并且不能实现随手指滑动的效果,所以就从ViewPager着手做了。

我是自定义的月历每一页,单独继承于一个LinearLayout重写的CalendarView,并用自定义的View来实现重新绘制每一天的视图,刚开始想的是先用一层Fragment来封装月视图也就是CalendarView,然后在自己要写的Fragment中使用FragmentAdapter来实现从每一月的BaseFragment切换,玩儿了几天,终于放弃了。下面会详细叙述原因:

FragmentAdapter需要获取的要修改的FragmentManager,但是在项目给定的Fragment中我们获取到的是android.app.FragmentManager(由于主界面定义的Fragment必须是android.app.FragmentManager,所以获取到的自然也就是了),但FragmentAdapter需要的却是V4版本的FragmentManager,所以就遇到了问题,PM那边直说了项目由于版本需求,必须最多兼容V4版本的,这样,虽然查到了V13版本的FragmentManager兼容APP和V4版本的,却不能用了。这时候一学长就给出了建议,为什么不用ViewPager的PagerAdapter来实现View之间的切换呢?

使用ViewPager的PagerAdapter来实现View之间的切换之前并不是没有想过,但是在实现的时候由于已经把CalendarView封装成一个BaseFragment了,而获取该BaseFragment的View的时候老是空指针,就放弃了,这也说明了先生学艺不精,不明白Fragment中定义的View是什么概念,直接调用了BaseFragment的getView,所以老是Down掉了,其实getView是系统调用的,当用户自己使用时,就相当于重新创建了一个BaseFragment,这时,获取到的View当然是空了。

最后,还是听从了学长的建议,乖乖的使用PagerAdapter来实现随手指滑动翻页的功能,但是问题接着接踵而至:

由于我的CalendarView是重写了LinearLayout,并且在这个LinearLayout中我定义了两个View,全都是通过addView来添加到LinearLayout中的,所以在ViewPager获取具体View的时候,总是默认获取到的是LinearLayout中的第一个View,没办法,只好把标头的View在给定的Fragment实现,并把月视图添加到了ViewPager中,这样就实现了基本的滑动。

滑动是实现了,但是ViewPager默认的是在有限页面的滑动,并且默认起始页面是第一页,这个不是什么大问题,我们只需要设定一个OnPageChangeListener就可以监听到页面变化,这样就可以动态的生成页面,解决了有限页面的问题;setCurrentItem就可以设置ViewPager的初始化界面是那一个,这样就解决了默认起始页面的问题,但是,不可忽视的是月历是可以向两个方向无限滑动的,我解决这个问题的方法是把起始页面设置成一个非常大的int型数,只要用户不是白痴,就不会为了测试我的月历而向前翻这么多页。

这样一个基本的月历就实现了,在做这个的时候中间还有看起来无数的BUG,但最后都不是问题,随着一个一个BUG的修补,我的月历也越来越完善了,直到最后心安的翻起来这个最终可以用的版本,算是完成了这阶段的任务。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息