FragmentStatePagerAdapter视图分页器片段在重新创建活动后未显示

时间:2018-01-11 12:14:35

标签: android android-layout android-fragments android-activity android-pageradapter

当我的Activity通过方向更改重新创建时,或者如果"不要保留活动"已在开发人员设置中启用,我的ViewPager已启用 FragmentStatePagerAdapter不会重新创建片段。

这是活动onCreate方法:

@Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    AndroidInjection.inject(this);
    super.onCreate(savedInstanceState);
    ButterKnife.bind(this);
    pagerAdapter = new CustomPagerAdapter(getSupportFragmentManager());
    viewPager.setAdapter(pagerAdapter);
    viewPager.addOnPageChangeListener(this);

    presenter.onCreate();
  }

这是FragmentStatePager:

public class CustomPagerAdapter extends FragmentStatePagerAdapter {

  private List<Fragment> fragments = new ArrayList<>();

  public MyFoodaPagerAdapter(FragmentManager fm) {
    super(fm);
  }

  public void init(List<Fragment> initFrags) {
    fragments.addAll(initFrags);
    notifyDataSetChanged();
  }

  public void update(Fragment fragment, int position) {
    fragments.set(position, fragment);
    notifyDataSetChanged();
  }

  @Override
  public Fragment getItem(int position) {
    return fragments.get(position);
  }

  @Override
  public int getItemPosition(Object object) {
    if (!fragments.contains(object)) {
      return POSITION_NONE; // replace
    }
    return super.getItemPosition(object);
  }

  public void clear(){
    fragments.clear();
    notifyDataSetChanged();
  }

  @Override
  public int getCount() {
    return fragments.size();
  }

  @Override
  public CharSequence getPageTitle(int position) {
    return "Title "+position; // TODO: 25/10/2017  
  }
}

由于FragmentStatePagerAdapter保存了当前选定的片段,并且旁边的片段就在其旁边,如果我在寻呼机中只有2个片段并且重新创建了Activity,则更改片段列表并调用notifyDataSetChanged();不会&# 39;什么都不做

在重新创建活动后,

getItem(int position)根本无法在PagerAdapter中触发。如果我在寻呼机中有3个以上的片段并且选择了第一个片段,那么移动到第3个页面将呈现该片段并且移回到第1个片段将最终呈现第1个片段。如果我在寻呼机中只有2个片段,那么在它们之间移动什么都不做,它们就不会被渲染。

此外,我在重新创建活动后看到了什么。当我将新片段添加到FragmentManager,(Fragment1 @ 1050)和(Fragment2 @ 1051)中时,private List<Fragment> fragments具有参考数字的2个片段(Fragment1 @ 1000)和(Fragment2 @ 1001)。寻呼机适配器并调用notifyDataSetChanged(),fragmentManager不会更新其片段,它仍然会包含那些旧片段。

编辑:我认为我找到了问题support FragmentPagerAdapter holds reference to old fragments 简而言之,即使在评论中,也绝不会引用PagerAdapter之外的片段。

1 个答案:

答案 0 :(得分:0)

当您在片段之间移动时,请使用此代码更新片段视图,无论其是两个还是更多片段。

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        getFragmentManager().beginTransaction().detach(this).attach(this).commit();
        //getPlanListData();
    }
}