Android:无限翻页的ViewPager

/ 0评 / 0

Published by orzz.org(). (https://orzz.org/android-unlimited-viewpager/)

ViewPager是google SDK里用来做滑动式的视图翻页的控件。我们可以新建一个默认的Android Application,指定Navigation Type为“Swipe Views (ViewPager)”,可以很直观的看到ViewPager的用法。

首先,我们新建一个测试项目,Activity的选项如下:
新建一个ViewPager测试工程

向导会自动帮我们在activity_main.xml里写入如下内容:

另外fragment_main.xml里会自动写上一个TextView:

之后,MainActivity则是非常简单的,ViewPager里的每一个视图都是一个PlaceholderFragment:

然后通过一个自定义的FragmentPagerAdapter,为ViewPager提供视图:

最后,在MainActivity的onCreate函数中,如下代码负责把上面的PagerAdapter放到PagerAdapter里去:

最终实现出来的效果如下:
Swipe Views (ViewPager)
当然,上面是可以翻页的,一共3页,每一页上显示的都是当前的序号。
默认情况下,ViewPager可以显示的视图数目,和PagerAdapter的getCount方法的返回值有关,如果我们把getCount改成这样:

选项卡也会变成5个。虽然在这个例子里,暂时用不到PageTitle,不过后续若需要Title显示文字,getPageTitle是必须要显示正确的。
对于本例,我们可以简单的把strings.xml改成这样:

接下来,改一改getPageTitle:

这样,通过一个position总能得到一个有效的PageTitle。为了看到修改的效果,我们可以让PlaceholderFragment显示PageTitle,而不止是一个数字:

这样我们就有了5页的ViewPager,每一页显示当然页的PageTitle:
5 pages ViewPager

下面我们来实现无限多的页面。
可以考虑这样一种方法:getCount永远返回3,当我们进行翻页操作时,先全部更新所有页面上应当显示的数据,之后PagerAdapter自动调用setCurrentItem(1, false)将页面重新固定回中间那一页。这样可以让我们看起来好像是翻页了,但实际上仅仅是数据发生了变化而已。

首先,我们来实现这样一个UnlimitedPagerAdapter:

通过setPrimaryItem,在当前页面变化的时候更新数据,刷新显示内容,重新定位页面。同样的,PlaceholderFragment需要稍微调整一下:

这样我们就可以完成UnlimitedPagerAdapter.UnlimitedPager接口,通过PlaceholderFragment提供的setText方法修改页面上显示的数据:

如上,在需要的时候(每次ViewPager被翻页时),onChanged就会被调用,mData会被刷新掉。之后每次onRefresh被调用时,sFragments会根据当前的mData调整每个PlaceholderFragment视图应当如何显示。经过这样设计的类关系图如下所示:
UnlimitedPagerAdapter
之后,在MainActivity的onCreate里把SectionsPager、UnlimitedPagerAdapter和ViewPager连起来:

好了,大功告成了。现在我们得到了一个可以“无限”翻页的ViewPager。不过需要注意的是,这样的ViewPager和Action Bar Tabs是不能直接联动的,除非再设计一个“无限”的Action Bar Tabs。

使用上面的UnlimitedPager接口配合UnlimitedPagerAdapter,实际上也可以很轻松的实现循环翻页的ViewPager,只需要修改派生出来的SectionsPager,让数据模型形成环状就可以了。


参考文章:

  • 1. Android ViewPager使用详解
  • 2. Android 使用ViewPager实现左右循环滑动图片
  • Published by orzz.org(). (https://orzz.org/android-unlimited-viewpager/)

    发表回复

    您的电子邮箱地址不会被公开。 必填项已用*标注

    此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据