我有一个类似于这里描述的问题:ViewPager only displaying last fragment,但在尝试解决方案后,我仍然有同样的问题。
我有一个带TabLayout的应用程序,它显示3个片段。 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用于设置片段的布局等
public static MarkStudentFragment newInstance(MyClass inputClass, int inputPosition) {
MyFragment fragment = new MyFragment();
dataClass = inputClass;
position = inputPosition
return fragment;
}
如果这实际上是编译的,那是因为你已经将dataClass
和position
声明为static
。因此,每次调用newInstance()
时,都会覆盖之前的dataClass
和position
值。每个碎片都将使用dataClass
和position
的唯一值。
解决这个问题,摆脱dataClass
和position
字段,以及use the arguments Bundle
。请注意,您需要从传递MyClass
的实例切换到传递一些标识符,该标识符将允许片段获取正确的数据(例如,enum
)。
我们在片段中有一个名为getUsetVisibleHint()的方法..当片段可见时我们可以使用它来调用api或fetch细节并附加到布局..
你可以把这样的代码
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;
}
}