当我的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不会更新其片段,它仍然会包含那些旧片段。
答案 0 :(得分:0)
当您在片段之间移动时,请使用此代码更新片段视图,无论其是两个还是更多片段。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
//getPlanListData();
}
}