Android FragmentPagerAdapter刷新问题

界面类似UC浏览器的UC头条,滚动条加对应的页面,方案是使用viewpager和FragmentPagerAdapter,首先是设置adapter的数据为空fragment,然后动态替换。

于是就遇到了很多人遇到的问题,adapter调用notifydatasetchanged并不能更新视图,原因是视图被缓存了。广为传播的一个解决方案是重写instantiateItem(container,position)。在该方法里面替换fragment。这样做只能解决部分问题。

因为系统设置的有预加载,第一次会加载两个fragment,如果选择viewpager的中间部分,会在该位置两边也加载共三个,已经加载过的不会再调用instantiateItem(这是原罪)。
比如第一次加载,会调用两次instantiateItem。默认先初始化第一个pager,第二个加载的为空fragment,但是接下来直接选择第二个pager时,instantiateItem(container,position)里面的position并不是1,而是2,直接跳过了position为1的pager加载,这样,position1的fragment就无法更新了。类似的,无论在哪个位置,只要选择相邻的pager,就没办法更新fragment了。
请问大神们有没有解决的方法,或者能提供其他的方案

ViewPager.setOffscreenPageLimit(1) 关闭预加载。或者使用FragmentStatePagerAdapter,不会进行缓存。

第一个看了源码,无论怎样设置,offpage最后都会变成1;对于fragmentstatepageradapter是指不在缓冲区中的fragment会被销毁,而缓冲区始终保存的是当前显示页和相邻两页。不过问题已基本解决了,就是把fragment全部加载进去,每次换页只要缓冲区没有,就会调用onCreateView,相当于动态加载了,而不是说只要加载过该fragment就不会再oncreateview了。因此不用替换fragment这个方法,而是直接更新fragment里面的内容就可以了,就是上面说的缓冲区没有该页的fragment,就会oncreateview