ViewPager: Can't change tag of fragment
问题描述:
在应用里用到了ViewPager
和FragmentPagerAdapter
实现多页(>20页)滑动,每一页都是一个Fragment
,给ViewPager
注册一个OnPageChangeListener
,当知道某一个Fragment被选中时,开始调用其刷新数据的方法。
并有一目录,点击某个条目时,调用 ViewPager
的 setCurrentItem(position)
,页面跳转到指定页,但是此时奇怪的是注册的 OnPageChangeListener#onPageSelected
居然没有被调用,表现为选中的页面没有刷新数据。
这时候往右侧滑动几页没问题,再往左侧滑动几页就一定会报出异常:
java.lang.IllegalStateException: Can’t change tag of fragment PageFragment{42ef29a8 #14 id=0x7f060052
android:switcher:2131099730:22}: was android:switcher:2131099730:22 now android:switcher:2131099730:17
分析原因:
经过一番排查,发现问题出现的原因在于我的FragmentPagerAdapter
内部维护的List集合造成的,因为我想自己来控制一下Fragment
内部数据的销毁,并且使Fragment
得到重用。
但是,在往List集合中,add(fragment)
的时候,没有注意FragmentPagerAdapter#getItem(position)
传入的位置和实例化fragment所存放在List中的位置!
导致,List中会有可能出现存在两个指针指向相同的Fragment,表现出来的样子就是报异常“Can’t change tag of fragment”,并且不会调用其刷新数据的方法,因为其isShow
被标记为true
了。
解决方法:
判断一下position与List的当前大小即可。
当List大小比position大时,意味着,要从里取。
反之则表示,要在List对应position的location放一个Fragment。
1 | private List<PageFragment> pages; |