美文网首页
Android 中的Viewpager+Fragment组合中,

Android 中的Viewpager+Fragment组合中,

作者: 光羽隼 | 来源:发表于2019-02-28 17:54 被阅读0次

    今天项目中遇到一个问题,类似于桌面的应用,当检测到有新的应用安装的时候,刷新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区别

    相关文章

      网友评论

          本文标题:Android 中的Viewpager+Fragment组合中,

          本文链接:https://www.haomeiwen.com/subject/mjdkuqtx.html