我有一个与此处描述的问题类似的问题: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用来设置片段的布局,等等
答案 0 :(得分:0)
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
)。
答案 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;
}
}