博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用ViewPager加载页面出现空白
阅读量:2175 次
发布时间:2019-05-01

本文共 1217 字,大约阅读时间需要 4 分钟。

原文链接:

首次启动程序时首页空白,切换页面后正常

为了便于管理,通常为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();

此时的首页界面如下:

viewpager

明明调用initData()方法为该页面添加数据可首页依然空白

出现的原因:

两次调用initView方法(基类和instantiateItem方法)引起的,即:

  1. new一个子类时,已经调用initView方法(此时是间接调用基类initView方法,由于多态的存在真正调用的是相应的子类),创建第一个视图对象
  2. 给ViewPager设置adapter时,由于java的特性,adapter中的方法体还没有真正调用,因为只有在执行是才会真正调用
  3. 此时调用baseContentPagerList.get(0).initData()方法时,实际上是给 第一个视图对象添加数据
  4. 然而启动程序是,ViewPager首先会加载两个页面,而此时加载 首页时,第二次调用initView方法产生第二个视图对象,且显示的是该视图,第一个视图对象虽有数据却被第二个视图“覆盖”,故显示的是第二个没有数据的视图,因此出现空白,滑动后正常。

改正做法

在基类中添加getView( )方法,并让每个子类实现。构造方法和以前一样引用initView方法,不然给首页初始化数据时会出现:为null的对象赋值的错误

在pageradapter的instantiateItem方法中调用getView方法

setCurrentItem 表示切换当前的ViewPager到指定界面,因为ViewPager有缓存和回收机制,也就是说,默认情况下ViewPager只会创建三个界面,因此跳过三个界面的时候,需要重新创建,所以导致空白,解决方案就是:

viewPager.setOffscreenPageLimit(4); 表示四个界面来回切换不会重新创建,就会不出现空白了。

你可能感兴趣的文章
Go语言学习Part2:流程控制语句:for、if、else、switch 和 defer
查看>>
Go语言学习Part3:struct、slice和映射
查看>>
Go语言学习Part4-1:方法和接口
查看>>
Leetcode Go 《精选TOP面试题》20200628 69.x的平方根
查看>>
leetcode 130. Surrounded Regions
查看>>
【托业】【全真题库】TEST2-语法题
查看>>
博客文格式优化
查看>>
【托业】【新托业全真模拟】疑难语法题知识点总结(01~05)
查看>>
【SQL】group by 和order by 的区别。
查看>>
【Python】详解Python多线程Selenium跨浏览器测试
查看>>
Jmeter之参数化
查看>>
Shell 和Python的区别。
查看>>
Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
查看>>
Loadrunner之https协议录制回放报错如何解决?(九)
查看>>
python中xrange和range的异同
查看>>
列表、元组、集合、字典
查看>>
【Python】easygui小甲鱼
查看>>
【Python】关于Python多线程的一篇文章转载
查看>>
【Pyton】【小甲鱼】文件
查看>>
【Pyton】【小甲鱼】永久存储:腌制一缸美味的泡菜
查看>>