Java 片段寻呼机适配器仅显示创建的最后一个片段

Java 片段寻呼机适配器仅显示创建的最后一个片段,java,android,android-fragments,android-pageradapter,Java,Android,Android Fragments,Android Pageradapter,我有一个与这里描述的问题类似的问题:,但是在尝试解决方案之后,我仍然有相同的问题 我有一个带有TabLayout的应用程序,它显示3个片段。3个片段具有相同的布局,但所述布局的内容(文本等)根据表格布局中的位置而变化。选项卡1显示一件事,选项卡2显示另一件事,等等。我通过将一个或另一个类传递给要显示的片段来实现这一点,具体取决于在寻呼机适配器中传递给getItem()的位置 我所看到的是,无论我试图加载什么片段,我的选项卡布局都将始终显示同一片段的3个实例,在本例中是最后一个实例化的实例。我已经

我有一个与这里描述的问题类似的问题:,但是在尝试解决方案之后,我仍然有相同的问题

我有一个带有TabLayout的应用程序,它显示3个片段。3个片段具有相同的布局,但所述布局的内容(文本等)根据表格布局中的位置而变化。选项卡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然后用于设置片段的布局,等等

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

您可以这样放置代码

 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;

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


要解决此问题,请去掉
dataClass
position
字段,然后。请注意,您需要从传递
MyClass
的实例切换到传递某个标识符,该标识符将允许片段获取正确的数据(例如
enum
)。

您可以去掉
新的MyFragment()
,因为您没有使用该对象。除此之外,我相信你的问题在于你的
newInstance()
方法以及你是如何使用这些参数的。你能告诉我你有3个不同的片段吗?@Niceumang是的,在系统的FragmentPagerAdapter.class中创建和处理3个不同的片段@Commonware使用newInstance()方法编辑问题。首先,您正在调用的
newInstance()
方法使用两个参数,而不是一个参数。其次,好的,您的
newInstance()
方法将不会编译,因为
静态
方法没有
this
对象。@commonware添加了
this。
为了使代码更清晰,代码确实编译了,并对其不清晰表示歉意。至于这两个参数,你的确切意思是什么,这是我应该在文档中阅读并实现的,还是?这不是我当前正在实现的逻辑,而是在switch语句中?
public static MarkStudentFragment newInstance(MyClass inputClass, int inputPosition) {
    MyFragment fragment = new MyFragment();
    dataClass = inputClass;
    position = inputPosition
    return fragment;
}