今天项目中遇到一个问题,类似于桌面的应用,当检测到有新的应用安装的时候,刷新Viewpager+Fragment
组合中fragment
的内容。
步骤
有新的应用安装之后,清空fragment
列表list
,然后获取系统中的第三方应用,创建新的Fragment
,把第三方应用列表放到新的Fragment
中,最后把新的fragment
放到list
,刷新adapter
(我是用的是FragmentPagerAdapter
)。
问题
上边的步骤并不能把我的数据刷新到fragment
,在fragment
内部得到的数据还是第一次生成fragment
时传入的数据。
解决
将adapter
的父类变成FragmentStatePagerAdapter
,然后重写getItemPosition
方法,如下
public class AppAdapter extends FragmentStatePagerFragment{
...
@Override
public int getItemPosition(@NonNull Object object) {
//这个参数会调用PagerAdapter.destroyItem()来去掉该对象,并设置为需要刷新[needPopulate = true] 以便触发PagerAdapter.instantiateItem() 来生成新的对象。
return POSITION_NONE;
}
}
getItemPosition
在PagerAdapter
中的实现是直接传回 POSITION_UNCHANGED
。如果该函数不被重载,则会一直返回 POSITION_UNCHANGED
,从而导致ViewPager.dataSetChanged()
被调用时,认为不必触发 PagerAdapter.instantiateItem()
。很多人因为没有重载该函数,而导致调用PagerAdapter.notifyDataSetChanged()
后,什么都没有发生。而当返回POSITION_NONE
,这个参数会调用PagerAdapter.destroyItem()
来去掉该对象,并设置为需要刷新needPopulate = true
以便触发PagerAdapter.instantiateItem()
来生成新的对象。
以上只在FragmentStatePagerAdapter
的子类中生效。
FragmentStatePagerFragment
类似于动态的,FragmentPagerAdapter
类似于静态的。当数据很多的时候尽量使用FragmentStatePagerFragment
,数据少而且变化小的话,使用FragmentPagerFragment
。
具体参考,这里边给出了FragmentPagerAdapter
的解决方法。FragmentPagerAdapter与FragmentStatePagerAdapter区别
网友评论