本文主要介绍ViewPager FragmentPagerAdapter中Fragment缓存的规则。
可能需要在一个Activity中显示多个ViewPager,如GridView或ListView中以ViewPager做Item。
在Fragment的onCreateView函数中添加断点,结果发现只有第一个ViewPager的Fragment被初始化了。
排查发现在FragmentPagerAdapter中的instantiateItem函数中FragmentManager以container的id加fragment的position为标记。导致第一个ViewPager的position初始化后进了缓存,第二个ViewPager的position1就直接从缓存中获取数据,查看FragmentPagerAdapter源码如下:
![instantiateItem](https://ucc.alicdn.com/6abc3acwnnmpa/developer-article26544/20241009/a09ad7000bcb4cd883f64f7b03ee4dab.jpeg?x-oss-process=image/resize,w_1400/format,webp)
![makeFragmentName](https://ucc.alicdn.com/6abc3acwnnmpa/developer-article26544/20241009/6a673fb86fe54c6b99a155d1d8f24d1c.jpeg?x-oss-process=image/resize,w_1400/format,webp)
针对上面的makeFragmentName规则,我们有两种解决方法:
1、自己复制FragmentPagerAdapter中的内容,重写一个PagerAdapter,修改其中的makeFragmentname规则,推荐使用此种方法。
2、改变上面container.getId,即ViewPager父View的idcontainerId。不过这种方式只是用于ViewPager较少的情况,否则复制很恶心的。。。