Overview

我们在使用ViewPager来制作图片轮播的时候,常常为ViewPager不能一直无限循环的问题所苦恼。对于这个问题,目前从网上找到了两个思路来解决:

  • 将 ViewPager 的Count 的数量设置的尽可能的大,然后就造成了无限循环的假象。

  • 第二种,方式是,假如三个图片无限循环,那么就需要用5张图片,如下图所示

使用这种方式启动的时候,需要将 2 号图片,设置为第一张,当向前滑动的时候,因为前面的 1号图片 是和 4 号图片一样,那么,给人的错觉就像是无线循环的一样,当选中一号图片后,立即将当前选中的图片设置为 4 号图片,4号图片向5号图片滑动也是同理。

实现

关于第一种方式,我想对大家来说都不是问题,本文主要是介绍第二种方式的实现方式

Step 1: 准备好任意3张图片

Step 2: 建立Adapter,为了一劳永逸,我们需要做一些简单的封装,来方便我们以后的使用

通用的Adapter

package com.example.it.recycleviewpager;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup; import java.util.List; /**
* Created by 鲁迅认识的那只猹 on 9/25/2017 10:58 AM.
* Emial 1258730808@qq.com
* Desc:
*/ public abstract class BaseRecycleViewPagerAdapter<T> extends PagerAdapter {
private Context context;
private List<T> dataSource; public BaseRecycleViewPagerAdapter(Context context, List<T> dataSource) {
this.context = context;
this.dataSource = dataSource; //为了无线循环添加两个冗余项目
T t1 = dataSource.get(0);
T t2 = dataSource.get(dataSource.size() - 1);
this.dataSource.add(dataSource.size() , t1);
this.dataSource.add(0, t2);
} /**
* 返回视图的数量
*/
@Override
public int getCount() {
return dataSource.size();
} /**
* 实例化,Page
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = bindingView(position);
container.addView(view);
return view;
} /***
* 抽象方法,绑定视图,需要子类实现
*/
abstract View bindingView(int position); /**
* 回收资源
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
} @Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
} public Context getContext() {
return context;
} public List<T> getDataSource() {
return dataSource;
}
}

建立Adapter,从BaseRecycleViewPagerAdapter 继承

public class AdvertisingAdapter extends BaseRecycleViewPagerAdapter<Integer> {

    public AdvertisingAdapter(Context context, List<Integer> dataSource) {
super(context, dataSource);
} /**
* 建立我们需要用来轮播的图片
*/
@Override
View bindingView(int postion) {
ImageView imageView = new ImageView(getContext());
imageView.setLayoutParams(new ViewGroup.LayoutParams(-1, -1));
imageView.setImageResource(getDataSource().get(postion));
return imageView;
}
}

Step3: 测试我们的Adapter

public class MainActivity extends AppCompatActivity {

    private ViewPager viewPager;
private AdvertisingAdapter advertisingAdapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); viewPager = (ViewPager) this.findViewById(R.id.vp);
init();
} void init() {
List<Integer> resIdList = new ArrayList<>();
resIdList.add(R.drawable.pet2);
resIdList.add(R.drawable.pet3);
resIdList.add(R.drawable.pet4);
advertisingAdapter = new AdvertisingAdapter(this, resIdList);
viewPager.setAdapter(advertisingAdapter);
//设置第二张图片为最初显示的图片
viewPager.setCurrentItem(1);
//设置Item的选中事件,实现循环
viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
if (position == 0)
viewPager.setCurrentItem(viewPager.getAdapter().getCount() - 2, false);
if (position == viewPager.getAdapter().getCount() - 1)
viewPager.setCurrentItem(1, false);
}
});
}
}

源码下载

基本的需求已经实现,如果还有更多的需求,还可以根据上面的扩展。

我的码云: https://gitee.com/ShareKnowledge/RecycleViewPager

ViewPager 无限循环的更多相关文章

  1. 一行代码引入 ViewPager 无限循环 + 页码显示

    (出处:http://www.cnblogs.com/linguanh) 前序: 网上的这类 ViewPager 很多,但是很多都不够好,体现在 bug多.对少页面不支持,例如1~2张图片.功能整合不 ...

  2. Android实现ViewPager无限循环滚动回绕

     Android实现ViewPager无限循环滚动回绕 Android系统提供的ViewPager标准方式是左右可以自由滑动,但是滑动到最左边的极限位置是第一个page,滑动到最右边的位置是最后一 ...

  3. 详细分析Android viewpager 无限循环滚动图片

    由于最近在忙于项目,就没时间更新博客了,于是趁着周日在房间把最近的在项目中遇到的技术总结下.最近在项目中要做一个在viewpager无限滚动图片的需求,其实百度一下有好多的例子,但是大部分虽然实现了, ...

  4. ViewPager 无限循环遇到的坑 viewpager.setOffscreenPageLimit(2);

    viewpager.setOffscreenPageLimit(limit);这个方法,是表示viewpage除了当前显示的页面外,左右个预加载的页面个数,也就是 为limit=2时表示当前一共加载了 ...

  5. viewpager双层嵌套,子viewpager无限循环无法手动滑动

    项目中首页是用viewpager+fragment集成的,第一个fragment有广告轮播图使用viewpager实现的,开始就遇到是广告图无法手动滑动,事件被外层的viewpager拦截响应切换到下 ...

  6. Android无限循环轮播广告位Banner

     Android无限循环轮播广告位Banner 现在一些app通常会在头部放一个广告位,底部放置一行小圆圈指示器,指示广告位当前的页码,轮播展示一些图片,这些图片来自于网络.这个广告位banner ...

  7. android 无限循环的viewpager

    思路 例如存在 A -B -C 需要在viewpager滑动时无限循环 1.我们可以设计 C' A B C A'  C'与C相同,A'与A相同 2.滑动到A'时,则index回到1 3.滑动到C'时, ...

  8. ViewPager,实现真正的无限循环(定时+手动)

    利用定时器,实现循环轮播,很简单:只需在定时器的消息里加如下代码即可: int count = adapter.getCount(); if (count > 1) { // 多于1个,才循环 ...

  9. 扩展ViewFlow避免和ViewPager滑动冲突,同时支持无限循环,并完美和CircleFlowIndicator结合

    首先,为了避免滑动冲突,我们要继承ViewFlow,重写onInterceptTouchEvent public class MyViewFlow extends ViewFlow { private ...

随机推荐

  1. Spark记录-Scala语句(运算符-if-for-while-try-模式匹配)

    Scala条件运算符 Scala条件运算符在下表中列出. 运算符 操作 描述 && 与 运算符左侧和右侧的值为true.仅当左侧为真时,右侧才被计算. || 或 左侧或右侧的至少一个值 ...

  2. SQL记录-PLSQL字符串

    PL/SQL字符串 PL/SQL字符串实际上是一个可选的尺寸规格字符序列.字符可以是数字,字母,空白,特殊字符或全部的组合. PL/SQL提供了三种类型的字符串: 固定长度字符串:在这样的字符串,程序 ...

  3. bzoj千题计划257:bzoj4199: [Noi2015]品酒大会

    http://www.lydsy.com/JudgeOnline/problem.php?id=4199 求出后缀数组的height 从大到小枚举,合并 维护组内 元素个数,最大.次大.最小.次小 # ...

  4. spring中bean配置和注入场景分析

    bean与spring容器的关系 Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载.实例化Bean,并 ...

  5. 优雅地搭建整合ssm项目

    spring + spring mvc + mybatis 三大框架建议观看 黑马程序员出品的 Springmvc+Mybatis由浅入深全套视频教程 Spring框架2016版视频 观看顺序 ,我个 ...

  6. CSS规范 - 典型错误--(来自网易)

    不符合NEC规范的选择器用法 .class{} 不要以一个没有类别的样式作为主选择器,这样的选择器只能作为后代选择器使用,比如.m-xxx .class{}.        .m-xxx div{} ...

  7. phpStorm 8.0.3 设置

    phpstorm 8 license key Learn Programming===== LICENSE BEGIN =====63758-1204201000000Ryqh0NCC73lpRm!X ...

  8. java Runnable、Callable、FutureTask 和线程池

    一:Runnable.Callable.FutureTask简介 (1)Runnable:其中的run()方法没有返回值. ①.Runnable对象可以直接扔给Thread创建线程实例,并且创建的线程 ...

  9. ios TextField限制输入两位小数

    只需要实现textField的这个代理方法就可以实现 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange: ...

  10. C# 文件Copy

    文件Copy有以下几种方法: 1.Copy string sourceFile = @"c:\temp\New Text Document.txt"; string destina ...