Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用新片段动态更新ViewPager_Java_Android_Android Fragments_Tabs_Android View - Fatal编程技术网

Java 使用新片段动态更新ViewPager

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 我可

我的应用程序中有一个简单的寻呼机布局,它应该根据我的AppState而改变。该应用程序有两个主要状态,LoggedIn和LoggedOut。如果AppState是LoggedOut,那么我的选项卡布局应该基于两个片段构建
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 {