ViewPager+Fragment+ListView重新加载后数据源重复问题的解决方法

时间:2024-04-09 20:56:00

今天在项目中遇到了一个问题,我的主页Activity是以ViewPager+Fragment进行构建的,其中有两个Fragment又包含了ListView,正常情况下这两个Fragment的界面如下:
ViewPager+Fragment+ListView重新加载后数据源重复问题的解决方法ViewPager+Fragment+ListView重新加载后数据源重复问题的解决方法
但是当我从主页Activity跳转到另一个Activity,之后再返回主页Activity时,发现第一个包含ListView的Fragment的界面变成了下面这样:
ViewPager+Fragment+ListView重新加载后数据源重复问题的解决方法
很明显这是ListView的数据源重复添加造成的错误,但是奇怪的是另一个包含ListView的Fragment却非常正常,没有发生数据源重复的错误:
ViewPager+Fragment+ListView重新加载后数据源重复问题的解决方法
起初我以为是第一个Fragment的代码逻辑出了问题,但是经过一步步的排查后发现并没有什么问题,这时我怀疑是ViewPager的内部机制造成的,如果ViewPager的机制是当我从另一个Activity返回时,ViewPager只重新执行第一页Fragment的onCreateView方法的话,这种Bug就解释的通了。但在这个猜想前我得先排除自己的代码逻辑有问题这一干扰因素,于是我将正常Fragment的代码全部复制到第一个Fragment,经过bug复现我发现同样的代码,但是第一个Fragment依然出现了数据源重复的问题:
ViewPager+Fragment+ListView重新加载后数据源重复问题的解决方法
到这里我就可以确定是ViewPager的机制导致了这一问题,这时我想到了ViewPager的方法中有一个方法叫setOffscreenPageLimit(int limit),之前我对这个方法的理解一直是预加载,但在查询了官方Api的解释之后,原来这个方法的实质是在空闲状态下,将视图层次结构中当前页面的两侧应保留的页面数设置为空,超出此限制的页面将在需要时从适配器重新创建。总结起来就是这个方法可以缓存页面,也就是说我只要将所有页面缓存进去就行了,于是我传入参数5之后,再进行Bug复现,这时果然就不再出现数据源重复的问题了。