FragmentPagerAdapter notifyDataSetChanged() 更新fragment

当FragmentPagerAdapter调用notifyDataSetChanged()后,继而会调用ViewPager的dataSetChanged()方法,在这个方法中会根据Adapter的getItemPosition()方法的返回值判断是否更新fragment。

若getItemPosition()的返回值为PagerAdapter.POSITION_UNCHANGED,则不处理;
若为PagerAdapter.POSITION_NONE,则表明该位置的fragment有变化,dataSetChanged()会从fragment的列表中将该fragment移除并更新当前viewpager的选中项。

所以,想要更新fragment,需要重写getItemPosition()方法。

如果fragment需要更新,则会调用Adapter的instantiateItem()方法来返回一个fragment。FragmentPagerAdapter的处理逻辑是:

先从FragmentManager中通过tag寻找fragment,如果找到就直接返回,找不到就调用getItem()获取一个add到FragmentTransaction回退栈且添加tag。

这里要注意,tag的生成依赖Adapter的getItemId(),而getItemId()默认返回position。如果getItem()返回的fragment已经被add过并且与之对应的position发生改变,那么是会报错的:java.lang.IllegalStateException: Can't change tag of fragment xxx

由于getItemId()返回的position发生了变化,导致生成的tag与原来生成的不同。那么重新add时,是不允许改变其tag的。

解决办法就是使fragment的tag是唯一的。重写getItemId(),使其返回fragment.hashCode()即可解决。

你可能感兴趣的:(FragmentPagerAdapter notifyDataSetChanged() 更新fragment)