ViewPager 仅在网络调用成功后加载

ViewPager to load only after successful result from network call

这是我正在尝试做的事情

我有一个扩展 FragmentPagerAdapter 的内部 class,但我不想为每个 Fragment 进行网络调用。所以我试着只打一个电话,然后把我从它得到的结果发送给每个 Fragment,由他们每个人根据他们的需要处理。

但这就是我的问题

似乎由于某种原因,片段在网络调用之前加载 returns 结果成功,我想知道如何避免这种情况发生?

非常感谢您提供的任何可能的帮助!!

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;
        }

    }

}

你的问题出在你的 getItem()getCount() 方法上。

您说您希望仅在网络调用执行后才显示 Fragments。所以你不能事先知道你的适配器有 3 个项目,你也不能在 getItem() 方法上实例化它们。

来自 the FragmentPagerAdapter docs:

Fragment getItem (int position)

Return the Fragment associated with a specified position.

也来自文档:

int getCount()

Return the number of views available.

所以,你告诉适配器的是: “我已经有了三个项目,一旦你设置好了,就实例化它们提供的职位”。

我的建议是您要么创建一个 addFragments(ArrayList<Fragment> fragments) 方法,并在网络工作完成后调用它,要么在适配器外部进行网络连接,然后您才能创建适配器本身。

检查this related question for further reading. And this tutorial