Java 使用新片段动态更新ViewPager
我的应用程序中有一个简单的寻呼机布局,它应该根据我的AppState而改变。该应用程序有两个主要状态,LoggedIn和LoggedOut。如果AppState是LoggedOut,那么我的选项卡布局应该基于两个片段构建Java 使用新片段动态更新ViewPager,java,android,android-fragments,tabs,android-view,Java,Android,Android Fragments,Tabs,Android View,我的应用程序中有一个简单的寻呼机布局,它应该根据我的AppState而改变。该应用程序有两个主要状态,LoggedIn和LoggedOut。如果AppState是LoggedOut,那么我的选项卡布局应该基于两个片段构建fragment\u login和fragment\u about。如果应用程序状态为LoggedIn,则应根据不同选项卡构建选项卡布局fragment\u main,fragment\u details,fragment\u about,fragment\u logout 我可
fragment\u login
和fragment\u about
。如果应用程序状态为LoggedIn,则应根据不同选项卡构建选项卡布局fragment\u main
,fragment\u details
,fragment\u about
,fragment\u logout
我可以用这两种状态中的任何一种来初始化应用程序,一切都正常工作。但是,问题是在用户登录后,在运行时动态更改这些布局
选项卡布局正确地更改了标题,但一些旧的选项卡片段仍然存在
设置
我的类连接片段及其各自的标题
private class FragmentList {
Class fClass;
String fName;
public FragmentList(Class c, String n) {
fClass = c;
fName = n;
}
}
我的部门助理
您可以看到,我目前正在尝试将ArrayList作为参数传递,以便能够重新加载tabs()
,但这仍然不起作用
当前输出
当应用程序硬编码为LoggedIn
时,两个片段和选项卡将正确显示。与应用程序相同,应用程序被硬编码为LoggedOut
。但是,当我尝试更改布局时,通过更改listFragments\u CurrentlyActive
的值,我会得到以下行为:
- 选项卡从2增加到4,并具有正确的标题(和顺序)
- 关联的片段是原始片段中的2个,以及新片段中的2个
fragment\u登录
,fragment\u关于
,fragment\u关于
,fragment\u注销
因此,您可以看到这两个额外的片段被正确地添加,但是这两个初始片段仍然引用LoggedOut
片段
可能有一个非常简单的解决方案,我需要在某个地方用mSectionsPagerAdapter.notifyDataSetChanged()
更新适配器,或者重新构建它,但我找不到任何修复方法。非常感谢。J
编辑
我甚至在一开始就尝试创建适配器,因此它们是完全独立的,但仍然会出现相同的行为
SectionsPagerAdapter sectionsAdapter_LoggedOut = new SectionsPagerAdapter(getSupportFragmentManager(), listFragmentsLoggedOut);
SectionsPagerAdapter sectionsAdapter_LoggedIn = new SectionsPagerAdapter(getSupportFragmentManager(), listFragmentsLoggedIn);
SectionsPagerAdapter sectionsAdapterACTIVE;
sectionsAdapterACTIVE = (AppState.isLoggedIn) ? sectionsAdapter_LoggedIn : sectionsAdapter_LoggedOut
这可能是getSupportFragmentManager()
中的片段缓存问题吗
编辑2
添加此图像有助于将问题可视化。不知道我之前是否清楚
已解决 下面在另一个线程上描述了该问题 如果您想切换出正在执行的实际片段 显示时,您需要避免使用碎片PageRadapter
FragmentStatePagerAdapter
FragmentPagerAdapter
不起作用,因为它不会在第一次显示片段后销毁它,因此我遇到了缓存问题。然而,我并没有像那个答案所建议的那样重写getItemPosition(objectitem)
。当我更换以下部件时,我的问题就消失了:
public class SectionsPagerAdapter extends FragmentPagerAdapter {
与
这是不是意味着新的碎片可以成功添加,但旧的碎片也保留了下来?卡森,是的。新的标签标题是正确的,但是旧的片段仍然保留着,并且显然正在被缓存。这就是我想要刷新的内容,所以我们不能通过tabLayout删除所有选项卡。removeAllTabs()在设置WithViewPage之前我已经尝试过了,但是原始片段(四个片段中只有前两个)仍然存在,因为某些原因…添加了Edit 2,并显示了问题的图像
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initApp();
refreshTabsBasedOnNewState();
}
//Separate method that can be called from elsewhere to update the Tabs
public void refreshTabsBasedOnNewState() {
//Can swap these and the app displays and functions correctly.
listFragments_CurrentlyActive = listFragments_LoggedOut;
//listFragments_CurrentlyActive = listFragments_LoggedIn;
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager(), listFragments_CurrentlyActive);
//update adapter class
mSectionsPagerAdapter.reloadTabs();
sectionsAdapterACTIVE.notifyDataSetChanged();
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(sectionsAdapterACTIVE);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);
}
SectionsPagerAdapter sectionsAdapter_LoggedOut = new SectionsPagerAdapter(getSupportFragmentManager(), listFragmentsLoggedOut);
SectionsPagerAdapter sectionsAdapter_LoggedIn = new SectionsPagerAdapter(getSupportFragmentManager(), listFragmentsLoggedIn);
SectionsPagerAdapter sectionsAdapterACTIVE;
sectionsAdapterACTIVE = (AppState.isLoggedIn) ? sectionsAdapter_LoggedIn : sectionsAdapter_LoggedOut
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {