片段分页器适配器仅显示最后创建的片段

时间:2019-03-16 11:48:37

标签: java android android-fragments android-pageradapter

我有一个与此处描述的问题类似的问题:ViewPager only displaying last fragment,但是尝试解决方案之后,我仍然遇到相同的问题。

我有一个带有TabLayout的应用程序,其中显示了3个片段。这三个片段具有相同的布局,但是所述布局的内容(文本等)根据TabLayout中的位置而变化。选项卡1显示一件事,选项卡2显示另一件事,等等。我通过将一个类或另一类传递给要显示的片段来实现此目的,具体取决于传递给分页器适配器中getItem()的位置。

我看到的是,无论我尝试加载什么片段,我的选项卡布局将始终显示同一片段的3个实例,在这种情况下,最后一个实例化。我已经遍历了代码,并确保足够的3个不同的片段被实例化并在getItem()中被调用了3次,但只有最后一次返回的片段被设置到TabLayout上了3次。

如何显示3个不同的片段,而不是显示3个不同的片段?

使用的代码:

@Override
public Fragment getItem(int position) {

    MyFragment fragment = new MyFragment();

    if (position == 0) {
        fragment = MyFragment.newInstance(MyClass1, position); // this gets returned first
    } else if (position == 1){
        fragment = MyFragment.newInstance(MyClass2, position); // this gets returned second
    } else if (position == 2){
        fragment = MyFragment.newInstance(MyClass3, position); // this gets returned third and is the only fragment displayed in the 3 tabs
    }
    return fragment;
}

我相信问题一定存在,但是请告诉我是否需要共享/更改代码的其他部分

编辑:这是我的片段类中的newInstance()函数

public static MarkStudentFragment newInstance(MyClass inputClass, int inputPosition) {
    MyFragment fragment = new MyFragment();
    dataClass = inputClass;
    position = inputPosition;
    return fragment;
}
然后

dataClass用来设置片段的布局,等等

3 个答案:

答案 0 :(得分:0)

public static MarkStudentFragment newInstance(MyClass inputClass, int inputPosition) {
    MyFragment fragment = new MyFragment();
    dataClass = inputClass;
    position = inputPosition
    return fragment;
}

如果这实际上可以编译,那是因为您已将dataClassposition声明为static。因此,每次调用newInstance()时,都会覆盖先前的dataClassposition值。而且您的每个片段都将使用dataClassposition的唯一值。

要解决此问题,请除去dataClassposition字段以及use the arguments Bundle。请注意,您将需要从传递MyClass的实例切换为传递一些标识符,该标识符将允许片段获取正确的数据(例如enum)。

答案 1 :(得分:-1)

我们在片段中有一个名为 getUsetVisibleHint()的方法。通过在可见片段时使用此方法,我们可以调用 api或获取详细信息并附加到布局

答案 2 :(得分:-1)

您可以放置​​这样的代码

 public Fragment getItem(int i)
{
    switch (i)
    {
        case 0:
             Fragment fragment1=new Fragment();
            return fragment1;
        case 1:
            Fragment fragment2=new Fragment();
            return fragment2;
        case 2:
            Fragment fragment3=new Fragment();
            return fragment3;
        default:
                return null;

    }
}