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。
这是我正在尝试做的事情
我有一个扩展 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。