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

如果getCount()方法返回的Count小于limit 不会出问题,会默认取Count和limit的最小值
package com.musichome.main.course;

import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.RelativeLayout; import com.musichome.R;
import com.musichome.Widget.MyImageView;
import com.musichome.base.BaseToolBarActivity;
import com.musichome.utils.ImageViewUtils;
import com.musichome.utils.LogUtils; import java.lang.reflect.Field;
import java.util.ArrayList; import butterknife.Bind;
import butterknife.ButterKnife; /**
* Created by lidaqiang on 17/4/19.
*/ public class SwitchInstrumenActivity extends BaseToolBarActivity {
@Bind(R.id.vp_switch_activiy_viewpager)
ViewPager viewpager;
private ArrayList<RelativeLayout> viewList;
private ArrayList<String> urlList; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_switch_instrument);
ButterKnife.bind(this);
initToolBar();
addData();
initItemView();
initViewPager(); } private void initViewPager() {
viewpager.setAdapter(pagerAdapter);
viewpager.setOffscreenPageLimit(2);
viewpager.setCurrentItem((Integer.MAX_VALUE / 2));
viewpager.setPageTransformer(true, new ZoomOutPageTransformer());
viewpager.setPageMargin((int) -(getResources().getDimension(R.dimen.pagemargin2)));
setViewPagerScrollSpeed();
} private void initItemView() {
viewList = new ArrayList<>();
int size = urlList.size();
for (int i = 0; i < size * 4; i++) {
RelativeLayout relativeLayout = (RelativeLayout) LayoutInflater.from(getActivity()).inflate(R.layout.item_switch_instrument_activity, null);
MyImageView myImageView= (MyImageView)relativeLayout.findViewById(R.id.miv_myimageview);
ImageViewUtils.setImageViewForUrl(myImageView,urlList.get(i%urlList.size()));
viewList.add(relativeLayout);
}
} private void addData() {
urlList = new ArrayList<>();
urlList.add("http://image.mymusichome.com/ugc_938273b30cbc4c9b8474f6c5b25b5fec_1489797562454");
urlList.add("http://image.mymusichome.com/ugc_a9da4d5f237d44f381ffca0040ef0588_1491812501197");
urlList.add("http://image.mymusichome.com/ugc_938273b30cbc4c9b8474f6c5b25b5fec_1489797562454"); } private void initToolBar() {
initToolBarLeft();
setToolBarCenter("切换乐器");
} PagerAdapter pagerAdapter= new PagerAdapter() { @Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
} @Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(viewList.get(position % viewList.size()));
}
@Override
public Object instantiateItem(ViewGroup container, final int position) {
View view = viewList.get(position %viewList.size());
ViewParent viewParent = view.getParent();
if (viewParent != null) {
viewpager.removeView(view);
}
container.addView(view);
return view;
} }; /**
* 设置ViewPager的滑动速度
*/
private void setViewPagerScrollSpeed() {
try {
Field mScroller = null;
mScroller = ViewPager.class.getDeclaredField("mScroller");
mScroller.setAccessible(true);
FixedSpeedScroller scroller = new FixedSpeedScroller(viewpager.getContext());
mScroller.set(viewpager, scroller);
} catch (NoSuchFieldException e) { } catch (IllegalArgumentException e) { } catch (IllegalAccessException e) { }
}
}

但是在假无线循环中如果设置Count=Integer.MAX_VALUE  但真实viewList只有10个页面,这个时候设置 limit=10就回出现空页面,因为一边加载10个,总共需要现实21个页面,而并没有这么多页面就会出现一个页面同时,需要加载多次,会出现error错误
需要将view去除从父布局移除
@Override
public Object instantiateItem(ViewGroup container, final int position) {
View view = viewList.get(position %viewList.size());
ViewParent viewParent = view.getParent();
if (viewParent != null) {
viewpager.removeView(view);
}
container.addView(view);
return view;
}

这时就回出现问题,一共就有10个布局,需要加载21个布局,这样有些页面需要重复加载,同时为了避免布局加载时出现view已有父布局的错误,添加如上代码,这样一个view被第一次加载在viewpage中的左边第一个位置,第二次加载时这个view被我们从父布局viewpage中移除,加载到viewpage中左边的第10个位置,这时候在左边的第一个位置,或者左边的第10个位置一定会有一个页面是空的。这样多次循环情况中空页面就回越来越多

ViewPager 无限循环遇到的坑 viewpager.setOffscreenPageLimit(2);的更多相关文章

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

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

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

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

  3. 踩石行动:ViewPager无限轮播的坑

    2016-6-19 前言 View轮播效果在app中很常见,一想到左右滑动的效果就很容易想到使用ViewPager来实现.对于像我们常说的banner这样的效果,具备无限滑动的功能是可以用ViewPa ...

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

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

  5. ViewPager 无限循环

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

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

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

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

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

  8. android 自定义无限循环播放的viewPager。轮播ViewPager。实现循环播放 广告,主题内容,活动,新闻内容时。

    前言 实际项目需要一个 播放广告的控件,可能有多个广告图片.每个一段时间更换该图片.简单来说,就是一个 “循环播放图片”的控件. 间隔时间更换图片 一般来说,图片切换时需要有动画效果 需要支持手势,用 ...

  9. android 无限循环的viewpager

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

随机推荐

  1. [BZOJ] 2662: [BeiJing wc2012]冻结

    https://www.lydsy.com/JudgeOnline/problem.php?id=2662 第一次写分层图(捂脸) 一开始真的naive地建图了,T到飞起.. 可以省下建图的空间,直接 ...

  2. 永久激活IDEA的方法

    第一步,下载破解补丁jetbrains-agent.jar 链接:https://pan.baidu.com/s/15x6dzOjveMkHlgHJT0PBWg提取码:2ykx 第二步,将下载的破解补 ...

  3. CentOS6.5卸载openJDK和安装Sun JDK

    CentOS6.5卸载openJDK和安装Sun JDK 最近业务需要,新安装了CentOS6.5系统,在配置tomcat的时候,总是报错找不到jdk中的java.研究了半天,发现应该是openJDK ...

  4. JavaScript正则表达式-反向引用

    使用括号“()”进行分组,使子表达式(子模式)可以作为整体独立被修饰,子表达式所匹配的结果会被记录下来并可以单独被访问. /(a(b(cd){2})+)EF/ 则各引用分别对应: \1  对应(a(b ...

  5. 学习笔记7——wp版本更新需要注意的问题

    平时开发时应该避免修改wp的核心代码, 因为在升级wp版本时,核心代码都会被覆盖, wp升级时只有wp-content文件夹不会被覆盖.

  6. Java包(package)详解

    java包的作用是为了区别类名的命名空间 1.把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用.. 2.如同文件夹一样,包也采用了树形目录的存储方式.同一个包中的类名字是不同的,不同的包 ...

  7. BNUOJ 5227 Max Sum

    Max Sum Time Limit: 1000ms Memory Limit: 32768KB   This problem will be judged on HDU. Original ID:  ...

  8. Codeforces Round #362 (Div. 2)

    闲来无事一套CF啊,我觉得这几个题还是有套路的,但是很明显,这个题并不难 A. Pineapple Incident time limit per test 1 second memory limit ...

  9. 九度oj 题目1254:N皇后问题

    题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上.因为皇后可以直走,横走和斜走如下图). 你的任务是,对 ...

  10. 【Luogu】P1155双栈排序(二分图)

    题目链接在此 此题一开始写了个深搜,过了30%的数据,也就是n<=10的那一段.... 然后看了题解发现这是个二分图的判断. 我们先举例子找到不能放进一个栈里的规律.设有数列[2,3,1,4] ...