Android报错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


分析原因

经过一番排查,发现问题出现的原因在于我的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。

  private  List<PageFragment> pages;
     //...
     public  PageFragment getItem( int  position) {
         PageFragment page =  null ;
         if  (pages.size() > position) {
             page = pages.get(position);
             if  (page !=  null ) {
                 return  page;
             }
         }
 
         while  (position>=pages.size()) {
             pages.add( null );
         }
         page = PageFragment.newPage(pageList.get(position),position);
         pages.set(position, page);
         return  page;
     }
文章来自: 点击打开链接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值