我有一个滑动标签,其中包含三个不同的片段,分别用于三个标签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;
}
所以,我正在寻找解决方案。如果可以,请帮帮我。
答案 0 :(得分:12)
在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...
}
}
答案 1 :(得分:0)
如果选项卡中有两个片段,通常两个片段都会启动并且将同时运行&#34;并行&#34;。这是正常行为。您可以使用某种EventBus或类似的手动控制片段的生命周期。
答案 2 :(得分:0)
是的。在每个片段中调用此方法,并在其上调用您的方法等:
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
if(isVisibleToUser)
loadData()
}