FragmentStatePagerAdapter视图分页器片段在重新创建活动后未显示
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FragmentStatePagerAdapter视图分页器片段在重新创建活动后未显示相关的知识,希望对你有一定的参考价值。
当我的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();
不会做任何事情。
在活动重建后,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之外的片段。
当您在片段之间移动时,请使用此代码更新片段视图,无论其是两个还是多个片段。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
//getPlanListData();
}
}
以上是关于FragmentStatePagerAdapter视图分页器片段在重新创建活动后未显示的主要内容,如果未能解决你的问题,请参考以下文章
FragmentStatePagerAdapter 向 TextView 返回错误的位置
如何将 FragmentFactory 与 FragmentStatePagerAdapter 一起使用
getItem 函数在 FragmentStatePagerAdapter 中调用两次?
FragmentPagerAdapter和FragmentStatePagerAdapter区别?