片段寻呼机适配器仅显示最后创建的片段
Fragment Pager Adapter only displaying last fragment created
我遇到了与此处描述的问题类似的问题:ViewPager only displaying last fragment,但在尝试那里的解决方案后,我仍然遇到同样的问题。
我有一个带有 TabLayout 的应用程序,它显示 3 个片段。这 3 个片段具有相同的布局,但所述布局的内容(文本等)会根据 TabLayout 中的位置而变化。选项卡 1 显示一件事,选项卡 2 显示另一件事,依此类推。我通过将一个 class 或另一个传递给要显示的片段来执行此操作,具体取决于传递给寻呼机适配器中的 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;
}
我相信问题一定出在某个地方,但请告诉我是否需要 share/change 代码的其他部分
编辑:这是我片段中的 newInstance() 函数 class
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;
}
}
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
字段以及 。请注意,您需要从传递 MyClass
的实例切换到传递一些允许片段获取正确数据的标识符(例如 enum
)。
我遇到了与此处描述的问题类似的问题:ViewPager only displaying last fragment,但在尝试那里的解决方案后,我仍然遇到同样的问题。
我有一个带有 TabLayout 的应用程序,它显示 3 个片段。这 3 个片段具有相同的布局,但所述布局的内容(文本等)会根据 TabLayout 中的位置而变化。选项卡 1 显示一件事,选项卡 2 显示另一件事,依此类推。我通过将一个 class 或另一个传递给要显示的片段来执行此操作,具体取决于传递给寻呼机适配器中的 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;
}
我相信问题一定出在某个地方,但请告诉我是否需要 share/change 代码的其他部分
编辑:这是我片段中的 newInstance() 函数 class
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;
}
}
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
字段以及 MyClass
的实例切换到传递一些允许片段获取正确数据的标识符(例如 enum
)。