最近在做的新闻客户端用到了ViewPager,Android Studio如今集成的很好了,自动创建很多不必要写的代码。
在使用过程中碰到了一个很奇怪的事:ViewPager中加载的数据重复
具体的看图就明白了:
可以看到加载出来的数据,1、2页面出现了重复,而3恢复正常
在困扰许久之后博主在stackoverflow上面找到了大神的解答:
class="brush:csharp;gutter:true;">Because you ware using static variable to show in fragments.When your say static its not a part of the class instance it creates only once and shared among the multiple fragment instance. And you ware changing it in getItem() method , as it is static was reflecting in all fragment instance and repeating.
原文:http://stackoverflow.com/questions/19042842/viewpager-showing-duplicate-data
根据这个回答解决了这个问题
下面来详细解释一下原因:
这就是问题所在。
会犯这样的错误的Java肯定都没学好╮(╯_╰)╭比如我。。
我们来复习一下Java中static的生命周期吧:
(1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。
(3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋以0值。
问题就出在第二条
由于我的Item是静态变量,所以在创建下一个的时候“引用了”上一个的Item,Item在上一个创建完成的时候并没有被销毁或者清空而是被下一个所回收利用。在当前这个Item从网络获取数据之前,直接进行了Adapter显示了上一个的数据,而第三个由于回收机制被回收所以是重新从网络获取完数据之后再显示
当把Item的static去除之后
完美的修复了该问题:
以上是我在使用ViewPager中所遇到的问题,如果有什么写错的地方还请大家指正