Android小技巧之无限循环的ViewPager

简介: 前言之所以会写着篇文章的原因是我现在项目用运用到了广告轮播(BannerView),当时在赶项目的时候在github上面找到了符合的开源库 就直接引用了,但是该开源库稍微有点庞大,功能比较繁多。

前言

之所以会写着篇文章的原因是我现在项目用运用到了广告轮播(BannerView),当时在赶项目的时候在github上面找到了符合的开
源库 就直接引用了,但是该开源库稍微有点庞大,功能比较繁多。于是在这样的情况之下,我决定自己造轮子。(现在处于项目完善和迭代器,正在重构项目,去除多余的第三方等以减少APK的大小,增加用户的体验度)

效果图如下,为了录制效果,所以将速度加快了。

img_13a46c50bd19d4b65423daf0b46e468c.gif
轮播图

Step1

在这期间碰到的第一个难点就是ViewPager的无缝循环,于是乎在各种谷歌之下发现都是千篇一律的代码之后依然投入了stackoverflow的怀抱,最终找到了解决无缝循环的两种方式:

第一种:
左右各增加一个页面,造成无缝的假象

第二种:
getcount的时候返回Integer.MAX_VALUE,这种方式会创建大量的对象,对于我来说不可取。

Step2

第一种方法实现起来非常的简单,其原理是在Adapter里面实现OnPageChangeListener接口,重写onPageSelected来搞定,假如我有三个页面需要相互切换:

A<->B<->C

只要在初始化数据的时候在A的前面加上C,C的后面加上A现在就变成了3+2五个页面:

C<->A<->B<->C<->A

这时候在重写onPageSelected方法,当前的position为0的时候,setCurrentItem为(getCount-2),假如当前的position==4(getCount-1),就setCurrentItem为1:

int pageCount = getCount();
if (position == 0) {
    pager.setCurrentItem(pageCount - 2, false);
} else if (position == pageCount - 1) {
    //延时切换,避免闪烁
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            pager.setCurrentItem(1, false);
        }
    },600);
}

里面我写了一个匿名内部类,为了方便才这么写,至于为什么需要延迟?注释了试试就知道了。

Step3

完整代码如下:

/***
 * BannerAdapter
 * @param <T>
 */
public class BannerAdapter<T> extends PagerAdapter {
    private List<T> mDatas;
    private Context mContext;
    private int count;

    public BannerAdapter(final ViewPager pager, List<T> mDatas, Context mContext) {
        super();
        this.mBannerHelper = mBannerHelper;
        this.mContext = mContext;
        int actualNoOfIDs = mDatas.size();
        count = actualNoOfIDs + 2;

        T t = mDatas.get(0);//获取到第一个
        T t1 = mDatas.get(mDatas.size() - 1);//获取到最后一个

        this.mDatas = mDatas;
        this.mDatas.add(mDatas.size(), t);
        this.mDatas.add(0, t1);

        pager.addOnPageChangeListener(new OnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                int pageCount = getCount();
                if (position == 0) {
                    pager.setCurrentItem(pageCount - 2, false);
                } else if (position == pageCount - 1) {
                    //延时切换,避免闪烁
                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            pager.setCurrentItem(1, false);
                        }
                    },600);
                }
            }

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
    }

    public int getCount() {
        return count;
    }

    public Object instantiateItem(View container, int position) {
        View view;
        //TODO 在这里返回你的View
        ((ViewPager) container).addView(view, 0);
        return view;
    }

    @Override
    public void destroyItem(View container, int position, Object object) {
        ((ViewPager) container).removeView((View) object);
    }

    @Override
    public void finishUpdate(View container) {
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public void restoreState(Parcelable state, ClassLoader loader) {
    }

    @Override
    public Parcelable saveState() {
        return null;
    }

    @Override
    public void startUpdate(View container) {
    }
}

最后

最近在学习自定义View,感觉进度十分的缓慢,不过刚看到几个UI交互效果,准备自己实现试试,挑战自我。

源码

目录
相关文章
|
3月前
|
安全 Android开发 开发者
【Android开发小技巧】扔掉这坑人的 Handler
【Android开发小技巧】扔掉这坑人的 Handler
40 0
|
4月前
|
XML Java Android开发
Android Studio App开发之翻页视图ViewPager的讲解及实战(附源码 包括翻页视图和翻页标签栏)
Android Studio App开发之翻页视图ViewPager的讲解及实战(附源码 包括翻页视图和翻页标签栏)
103 0
|
8月前
|
Android开发
Android 使用ViewPager实现手动左右切换页面和底部点点跟随切换效果
Android 使用ViewPager实现手动左右切换页面和底部点点跟随切换效果
136 0
|
26天前
|
Android开发
Android开发小技巧:怎样在 textview 前面加上一个小图标。
Android开发小技巧:怎样在 textview 前面加上一个小图标。
12 0
|
8月前
|
Android开发
Android 使用ViewPager和自定义PagerAdapter实现轮播图效果
Android 使用ViewPager和自定义PagerAdapter实现轮播图效果
70 0
|
4月前
|
XML Java Android开发
Android Studio App开发之实现简单的启动引导页ViewPager(附源码 实现App的欢迎页面)
Android Studio App开发之实现简单的启动引导页ViewPager(附源码 实现App的欢迎页面)
83 1
|
6月前
|
Java Android开发
[笔记]Android 学习一之转场动画+ViewPager+ListView简单Demo
[笔记]Android 学习一之转场动画+ViewPager+ListView简单Demo
|
7月前
|
数据处理 Android开发
关于安卓viewpager实现堆叠卡片交互
关于安卓viewpager实现堆叠卡片交互
181 1
|
8月前
|
Android开发
Android 中ViewPager嵌套RecyclerView出现滑动冲突的解决方案
Android 中ViewPager嵌套RecyclerView出现滑动冲突的解决方案
703 0
|
8月前
|
XML Android开发 数据格式
Android 使用ViewPager实现基本的翻页效果
Android 使用ViewPager实现基本的翻页效果
94 0