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

问题描述 投票:1回答:1

当我的Activity通过方向更改重新创建或者在开发人员设置中打开“不要保持活动”时,具有ViewPagerFragmentStatePagerAdapter不会重新创建片段。

这是活动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();不会做任何事情。

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

也是我在重新创建活动后看到的内容。 FragmentManager有2个片段,参考数字可以说(Fragment1 @ 1000)和(Fragment2 @ 1001),当我在private List<Fragment> fragments,(Fragment1 @ 1050)和(Fragment2 @ 1051)在pager适配器中添加新片段并调用notifyDataSetChanged()时,fragmentManager会没有更新它的碎片,它仍然会有那些旧碎片。

编辑:我想我发现了我的问题support FragmentPagerAdapter holds reference to old fragments简而言之,即使在评论中,也是永远不会引用PagerAdapter之外的片段。

android android-layout android-fragments android-activity android-pageradapter
1个回答
0
投票

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

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        getFragmentManager().beginTransaction().detach(this).attach(this).commit();
        //getPlanListData();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.