界面类似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了。
请问大神们有没有解决的方法,或者能提供其他的方案