Java 仅在网络调用成功后加载ViewPager 这就是我要做的

Java 仅在网络调用成功后加载ViewPager 这就是我要做的,java,android,android-viewpager,retrofit,inner-classes,Java,Android,Android Viewpager,Retrofit,Inner Classes,我有一个内部类,它扩展了FragmentPagerAdapter,但我不想对每个片段进行网络调用。因此,我尝试只做一个调用,并将从中得到的结果发送到每个片段,由每个片段根据需要进行处理 但我的问题就在这里 似乎出于某种原因,在网络调用返回成功结果之前加载了片段,我想知道如何避免这种情况发生 非常感谢您在这方面提供的任何可能的帮助 public class WelcomeActivity extends FragmentActivity { private List<Reward&

我有一个内部类,它扩展了
FragmentPagerAdapter
,但我不想对每个
片段进行网络调用。因此,我尝试只做一个调用,并将从中得到的结果发送到每个
片段
,由每个片段根据需要进行处理

但我的问题就在这里 似乎出于某种原因,在网络调用返回成功结果之前加载了片段,我想知道如何避免这种情况发生

非常感谢您在这方面提供的任何可能的帮助

public class WelcomeActivity extends FragmentActivity {

    private List<Reward> mTutorialList = new ArrayList<>();
    private String myResult = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);

        ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
        pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));

    }

    private class MyPagerAdapter extends FragmentPagerAdapter {

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);

        }

        private void getData() {

            JsonObject jo = new JsonObject();

            String user_id = LocalSave.getUserId();

            jo.addProperty("user_id", user_id);
            jo.addProperty("tag", "all");
            jo.addProperty("limit", "-1");


            RewardsAPI.postData(jo, new RewardsAPI.ThisCallback() {
                @Override
                public void onSuccess(Rewards rewards) {
                    Log.d(App.TAG, "onSuccess");

                    myResult = rewards.getRewards().get(0).getRedeemUrl();
                    mTutorialList = rewards.getRewards();
                }

                @Override
                public void onFailure() {
                    Log.e(App.TAG, "onFailure");
                }

                @Override
                public void onError(APIError error) {
                    Log.e(App.TAG, "Exception: " + error.getErrorMessage());
                }
            });

        }


        @Override
        public Fragment getItem(int pos) {

            getData();

            switch (pos) {

                case 0:
//                    return WelcomeFragment.newInstance(mTutorialList.get(0));
                    return GetStartedFragment.newInstance("Get Started!");
                case 1:
                    return FitnessPlanFragment.newInstance("fitness plan");
                case 2:
                    return NutritionPlanFragment.newInstance("nutrition plan");
                default:
                    return GetStartedFragment.newInstance("Get Started!");
            }
        }

        @Override
        public int getCount() {
            return 3;
        }

    }

}
公共类WelcomeActivity扩展了FragmentActivity{
私有列表mtutorialist=new ArrayList();
私有字符串myResult=“”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
ViewPager pager=(ViewPager)findViewById(R.id.ViewPager);
setAdapter(新的MyPagerAdapter(getSupportFragmentManager());
}
私有类MyPagerAdapter扩展了FragmentPagerAdapter{
公共MyPagerAdapter(碎片管理器fm){
超级(fm);
}
私有void getData(){
JsonObject jo=新的JsonObject();
字符串user_id=LocalSave.getUserId();
jo.addProperty(“用户id”,用户id);
jo.addProperty(“标签”、“全部”);
jo.addProperty(“限制”、“-1”);
RewardsAPI.postData(jo,new RewardsAPI.ThisCallback()){
@凌驾
成功时公开作废(奖励){
Log.d(App.TAG,“onSuccess”);
myResult=rewards.getRewards().get(0.GetRequiremeURL();
mtutorialist=rewards.getRewards();
}
@凌驾
公共失效(){
Log.e(App.TAG,“onFailure”);
}
@凌驾
公共无效onError(APIRROR错误){
Log.e(App.TAG,“异常:+error.getErrorMessage());
}
});
}
@凌驾
公共片段getItem(int-pos){
getData();
开关(pos){
案例0:
//返回WelcomeFragment.newInstance(mtutorialist.get(0));
返回GetStartedFragment.newInstance(“Get Started!”);
案例1:
返回FitnessPlanFragment.newInstance(“健身计划”);
案例2:
返回NutritionPlanFragment.newInstance(“营养计划”);
违约:
返回GetStartedFragment.newInstance(“Get Started!”);
}
}
@凌驾
public int getCount(){
返回3;
}
}
}

问题在于
getItem()
getCount()
方法

您说过只想在网络调用执行后显示
片段。因此,您不能预先告诉适配器有3个项,也不能在
getItem()
方法上实例化它们

发件人:

Fragment getItem(int位置)

返回与指定位置关联的片段

从文档中也可以看到:

int getCount()

返回可用的视图数

因此,您要告诉适配器的是:“我已经有三个项目,一旦设置好,就在提供的位置上实例化它们”

我的建议是创建一个
addFragments(arraylistfragments)
方法,并在完成网络工作后调用它,或者在适配器外部进行联网,然后才创建适配器本身


检查进一步的读数。而且。

我相信你必须就此事向我们提供更多的信息。比如,你什么时候打网络电话?适配器上似乎缺少一些方法。很难通过这种方式阅读并找出问题所在。嗨@mauker非常感谢你在这方面的帮助。恐怕这就是我对那个文件的全部代码。适配器没有任何其他功能,正在尝试在getItem中调用我的getData方法,以尝试在显示片段之前加载它们,但这就是目前似乎无法按预期工作的原因。我相信我发现了问题。现在就写答案。看看答案是否有用。它成功了!是啊!非常感谢@Mauker!!对于你在这个问题上的帮助,我无法用语言表达我的感激之情!非常感谢!:)