getItem 调用了两次,这导致 tab1 和 tab2 都在 FragmentPagerAdapter 中执行
getItem called twice and this causes tab1 and tab2 both executed in FragmentPagerAdapter
我有一个滑动标签,其中包含三个标签的三个不同片段。 FragmentPagerAdapter 中的 getItem 方法调用了两次。我的第一个选项卡加载本地数据并且布局与接下来的两个选项卡(tab2、tab3)不同。 Tab2 和 Tab3 从服务器获取数据并相应地加载。
我的问题是,第一次加载 getItem 调用了两次,这导致 tab1 和 tab2 都被执行。虽然 tab1 只包含本地数据,但由于两次调用 tab2 执行并从服务器获取数据。
我不想在 tab1 等时执行 tab2 和它的功能。
getItem()
代码:
@Override public Fragment getItem(int position) {
Fragment fragment = null;
switch (position) {
case 0: fragment = new CommentFragment(); break;
case 1: fragment = new AllPostFragment(); break;
case 2: fragment = new TodayFragment(); break;
}
return fragment;
}
所以,我正在寻找解决方案。如果可以的话,请帮帮我。
在 ViewPager 中,您的 ViewPager 将加载多少屏幕(片段)是有限制的。您可以通过调用 ViewPagers 的 setOffscreenPageLimit 方法来设置它。
但是,如果您检查 ViewPagers code,它会告诉您必须至少加载 1 个屏幕外页面:
private static final int DEFAULT_OFFSCREEN_PAGES = 1;
public void setOffscreenPageLimit(int limit) {
if (limit < DEFAULT_OFFSCREEN_PAGES) {
Log.w(TAG, "Requested offscreen page limit " + limit
+ " too small; defaulting to " + DEFAULT_OFFSCREEN_PAGES);
limit = DEFAULT_OFFSCREEN_PAGES;
}
// ...
}
底线:抱歉,我认为您不能只加载当前片段。
编辑:但是如果你想加载,你可以在你的片段中做这样的事情,比方说,只有当片段对用户可见时来自网络的数据:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// Fetch data or something...
}
}
当您在一个选项卡中有两个片段时,通常两个片段都会开始,并且会是 运行 "in parallel"。这是正常行为。您可以使用某种 EventBus 或类似的方法来手动控制片段的生命周期。
是的。在每个片段中调用此方法并在其上调用您的方法等:
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
if(isVisibleToUser)
loadData()
}
- 不要写在第一个片段里!
我有一个滑动标签,其中包含三个标签的三个不同片段。 FragmentPagerAdapter 中的 getItem 方法调用了两次。我的第一个选项卡加载本地数据并且布局与接下来的两个选项卡(tab2、tab3)不同。 Tab2 和 Tab3 从服务器获取数据并相应地加载。
我的问题是,第一次加载 getItem 调用了两次,这导致 tab1 和 tab2 都被执行。虽然 tab1 只包含本地数据,但由于两次调用 tab2 执行并从服务器获取数据。
我不想在 tab1 等时执行 tab2 和它的功能。
getItem()
代码:
@Override public Fragment getItem(int position) {
Fragment fragment = null;
switch (position) {
case 0: fragment = new CommentFragment(); break;
case 1: fragment = new AllPostFragment(); break;
case 2: fragment = new TodayFragment(); break;
}
return fragment;
}
所以,我正在寻找解决方案。如果可以的话,请帮帮我。
在 ViewPager 中,您的 ViewPager 将加载多少屏幕(片段)是有限制的。您可以通过调用 ViewPagers 的 setOffscreenPageLimit 方法来设置它。
但是,如果您检查 ViewPagers code,它会告诉您必须至少加载 1 个屏幕外页面:
private static final int DEFAULT_OFFSCREEN_PAGES = 1;
public void setOffscreenPageLimit(int limit) {
if (limit < DEFAULT_OFFSCREEN_PAGES) {
Log.w(TAG, "Requested offscreen page limit " + limit
+ " too small; defaulting to " + DEFAULT_OFFSCREEN_PAGES);
limit = DEFAULT_OFFSCREEN_PAGES;
}
// ...
}
底线:抱歉,我认为您不能只加载当前片段。
编辑:但是如果你想加载,你可以在你的片段中做这样的事情,比方说,只有当片段对用户可见时来自网络的数据:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// Fetch data or something...
}
}
当您在一个选项卡中有两个片段时,通常两个片段都会开始,并且会是 运行 "in parallel"。这是正常行为。您可以使用某种 EventBus 或类似的方法来手动控制片段的生命周期。
是的。在每个片段中调用此方法并在其上调用您的方法等:
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
if(isVisibleToUser)
loadData()
}
- 不要写在第一个片段里!