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!!对于你在这个问题上的帮助,我无法用语言表达我的感激之情!非常感谢!:)