所以我有一个底部导航栏,每个标签有4个片段,在每个片段中,我调用一个API请求来获取一些数据,但问题是每次我按下栏的任何标签,至少有两个片段被创建,它们调用自己的方法,并通过扩展触发API请求..!我只希望我选择的片段被示例化。
我知道适配器这样做是为了预先呈现片段,以确保在选项卡和诸如此类的东西之间进行更好的事务处理..!但我真的不能在每次选择时调用多个API调用..!
适配器
public class My_PagerAdapter extends FragmentPagerAdapter {
// I've tried FragmentStatePagerAdapter but same thing
public My_PagerAdapter (FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
new MyFragment_1();
case 1:
new MyFragment_2();
case 2:
new MyFragment_3();
case 3:
new MyFragment_4();
}
}
@Override
public int getCount() {
return 4;
}
}
字符串
编辑
这就是我所谓的适配器。
ViewPager viewPager = main.findViewById(R.id.vp);
viewPager.setOffscreenPageLimit(1);
viewPager.setAdapter(new My_PagerAdapter (getChildFragmentManager()));
navigationTabBar.setModels(models); // just UI stuff for each tab offered by the bottom navigation bar library,
navigationTabBar.setViewPager(viewPager);
型
3条答案
按热度按时间a11xaf1n1#
我在做一个项目的时候也遇到了同样的问题
我的解决方案是在每个片段中添加OnResume方法上的API调用。这样,只有当片段完全可见时,它们才会被触发。
查看fragment lifecycle
yhxst69z2#
好吧,这正是我面临的一个问题。我的解决方案并没有阻止viewpager创建片段,但它会停止对网络API的调用。
要点如下:
1)创建一个接口
字符串
2)修改FragmentPagerAdapter以覆盖onInstantiateItem方法
在这里,每个Fragment都将在Adapter类中声明一个weakReference,以便存储对所创建的Fragment的引用
型
3)在FragmentPagerAdapter中,添加以下方法以获取图片中片段的弱引用
型
4)现在,在创建TabLayout并示例化视图页导航的Activity中,将侦听器附加到TabLayout以侦听选项卡更改
型
5)在Viewpager中的每个Fragment中,实现我们在步骤1中创建的Interface并覆盖方法。
在每个片段中创建一个布尔变量amIVisible.这将有助于决定片段何时可见以及何时可以调用网络API
a)这里对于viewpager中的第一个片段,即索引为0的片段,网络API调用必须在视图创建后立即发生。默认情况下,该片段显然是可见的。这是在oncodeView方法中编写的
型
对于第一个片段,其他方法如下所示
型
在这里,我已经覆盖了onSaveInstanceState方法,并保存了amIVisible的值,savedState是一个布尔值,表示列表是否至少有1个项目。
B)对于其他片段,数据将通过以下过程加载
型
其他片段的接口方法相同。
这是相当复杂的,但做的工作。适配器内的弱引用甚至允许垃圾收集和避免上下文泄漏。
ca1c2owp3#
防止加载视图页导航中的所有片段。
在视图分页器的setAdapret前添加此行. viewPager.setOffscreenPageLimit(number_of_fragment); //示例:4
并检查登录onResume。可以更新其中的数据