原文链接:http://blog.csdn.net/zjf1165/article/details/51076642
首次启动程序时首页空白,切换页面后正常
为了便于管理,通常为ViewPager的每个子页面建立一个基类,然后用一个集合(一般用ArrayList)承载该ViewPager的所有子页面,然而在该基类的构造方法中一般引用initView()方法,使得某个子类在new的时候就创建视图,而在pageradapter中的
public Object instantiateItem(ViewGroup container, int position) { }
方法中一般也会调用基类的initView()方法添加将要展示界面,错误出现:
即使在其他地方改变ViewPager中子页面的显示也无法将其展示出来,即出现空白现象
事例代码(智慧北京项目):
viewPager.setAdapter(new MyPagerAdapter(baseContentPagerList));
/*
*初始化首页数据
*baseContentPagerList为承载每个子页面的ArrayList
*/
baseContentPagerList.get(0).initData();
此时的首页界面如下:
明明调用initData()方法为该页面添加数据可首页依然空白
出现的原因:
两次调用initView方法(基类和instantiateItem方法)引起的,即:
- new一个子类时,已经调用initView方法(此时是间接调用基类initView方法,由于多态的存在真正调用的是相应的子类),创建第一个视图对象
- 给ViewPager设置adapter时,由于java的特性,adapter中的方法体还没有真正调用,因为只有在执行是才会真正调用
- 此时调用baseContentPagerList.get(0).initData()方法时,实际上是给 第一个视图对象添加数据
- 然而启动程序是,ViewPager首先会加载两个页面,而此时加载 首页时,第二次调用initView方法产生第二个视图对象,且显示的是该视图,第一个视图对象虽有数据却被第二个视图“覆盖”,故显示的是第二个没有数据的视图,因此出现空白,滑动后正常。
改正做法
在基类中添加getView( )方法,并让每个子类实现。构造方法和以前一样引用initView方法,不然给首页初始化数据时会出现:为null的对象赋值的错误
在pageradapter的instantiateItem方法中调用getView方法
setCurrentItem 表示切换当前的ViewPager到指定界面,因为ViewPager有缓存和回收机制,也就是说,默认情况下ViewPager只会创建三个界面,因此跳过三个界面的时候,需要重新创建,所以导致空白,解决方案就是:
viewPager.setOffscreenPageLimit(4); 表示四个界面来回切换不会重新创建,就会不出现空白了。