无限循环的ViewPager--LoopViewPager

作者: 剑小河 | 来源:发表于2018-10-17 16:40 被阅读32次

需求

无限循环的ViewPager在Android开发中经常遇到,例如Banner,滚屏广告等等,下面介绍一个我做的无限循环ViewPager

效果图

LoopViewPager操作效果.gif

思路

基本思路跟大多数先驱的做法差不多。

  1. 将PagerAdapter的getCount方法返回值为一个较大的数字,这里我返回了int类型的最大值,即Integer.MAX_VALUE;
  2. 初始item设置为Integer.MAX_VALUE的一半,即Integer.MAX_VALUE / 2;
  3. PagerAdapter的instantiateItem执行时根据position和数据列表计算出当前position应当显示的数据;
  4. 每一个Item的数据和View都绑定在ViewHolder的实体内;
  5. 封装一个ViewHolderCreator,ViewHolder的回收、获取和更新都由ViewHolderCreator控制。

关于ViewHolderCreator

LoopViewPager工作流程.png

上图所示
当setOffscreenPageLimit方法设置limit为2,即左右预加载数各为2,从ViewHolderCreator中获取5个空闲的ViewHolder,加载初始数据。当向右翻一页时,回收最左边的ViewHolder,放入空闲的ViewHolder队列中,获取一个空闲的ViewHolder放入右边,填充数据。

使用方法

在XML中配置或者直接new一个都可以

 <com.riverlet.riverletviewpager.LoopViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="300dp" />

LoopViewPager viewpager = view.findViewById(R.id.viewpager);

或者

LoopViewPager viewpager = new LoopViewPager(getContext());

给LoopViewPager设置数据和ViewHolderCreator

 viewpager.setData(dataList, new LoopViewPager.ViewHolderCreator() {
            @Override
            public LoopViewPager.ViewHolder create() {
                TextView textView = new TextView(getContext());
                textView.setBackgroundColor(0xff43CD80);
                textView.setTextColor(Color.WHITE);
                textView.setTextSize(50);
                textView.setGravity(Gravity.CENTER);
                textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
                return new LoopViewHolder(textView);
            }
        });

方法介绍

 /**
     * 设置基础数据和ViewHolderCreator
     *
     * @param dataList 数据列表
     * @param viewHolderCreator
     */
    public void setData(List dataList, @NonNull ViewHolderCreator viewHolderCreator) ;

/**
     * 获取当前显示Item的ViewHolder,即可获取当前显示的数据和View
     *
     * @return
     */
    public ViewHolder getCurrentItemViewHolder();


/**
     * 根据Item位置获取它的ViewHolder
     *
     * @param position
     * @return
     */
    public ViewHolder getViewHolderOfPosition(int position);


/**
     * 跳转到指定Data的位置
     *
     * @param data
     */
    public void setCurrentItemOfData(Object data);

 /**
     * 跳转到指定Data的位置
     *
     * @param data
     * @param smoothScroll 是否带滚动动画
     */
    public void setCurrentItemOfData(Object data, boolean smoothScroll);

 /**
     * 翻到下一页
     */
    public void nextPage();

  /**
     * 翻到上一页
     */
    public void lastPage();

/**
     * 设置当前页变化的监听
     * @param onCurrentPageChangeListener
     */
    public void setOnCurrentPageChangeListener(OnCurrentPageChangeListener onCurrentPageChangeListener);

注意

  1. 无限循环不是真的无限循环,总页数为Integer.MAX_VALUE,即2147483647,比较大,初始设置在中间位置;
  2. 虽然总页数为2147483647,但实际加载的页数只有5个(当前显示页以及左右个两个);
  3. 因为实际加载页数只有5个,所以setCurrentItem跳转到其他未加载的页数时,会出现bug,
    所以在LoopViewPager里面setCurrentItem被阻断了,封装了setCurrentItemOfData作为跳转方法。

源码及Demo安装包

源码:ViewPagerDemo
Demo安装包:app-debug.apk

引申

无限新增的ViewPager:InfiniteViewPager

相关文章

  • 无限循环的ViewPager--LoopViewPager

    需求 无限循环的ViewPager在Android开发中经常遇到,例如Banner,滚屏广告等等,下面介绍一个我做...

  • 使用OJ平台时数据的几种输入方式

    无限循环:使用EOF作为退出条件 无限循环:使用特定条件作为退出条件 进行延伸,有无限循环中嵌套有限循环 有限循环...

  • 无限的循环

    人生就如这张动图一样,每天都在重复着同样几件事情

  • 无限循环

    没有故事快去睡觉吧(ง •̀_•́)ง

  • 无限循环

    今天中午下班很早 11:00就下班了 孟夏跟男友早早的吃了午饭 各自回寝室休息 因为时候尚早 躺在床上拿起手机显示...

  • 无限循环

    我 我,云小冉。一个普通家庭出生的我,但是身边的人将所有的宠爱都给了我,普通而幸福。无忧无虑,根本不会去考虑太多。...

  • 无限循环

    “喂,陈明,你快来救我啊!”赵阳飞快的语速配合急促的呼吸,脸上豆大的汗珠一滴一滴落下,一脸惊恐的表情。 “不是吧?...

  • 无限循环

    写下些什么,让自己平静。 如果自己不想站起来,没有人,没有方法能拉我起来。 在这8分钟里,能发生些什么? 文字是不...

  • 无限循环

    一切,都在变,却又恍如不曾变过,简直就像,在无限循环。 世间万事万物的一切皆在运转,一个哭声,自己降生了,没有人知...

  • 无限循环

    为什么呢?从灵性的角度来说,或许,便是因为被堵住了眼睛,所以,会做这样的一个梦吧!虽然只是一个细微的地方,却不乏理...

网友评论

  • 楊帥:老方案了,有没有真正无限循环的?

本文标题:无限循环的ViewPager--LoopViewPager

本文链接:https://www.haomeiwen.com/subject/juxpaftx.html