[英]Asynchronous calling and passing values to fragments before setting ViewPager adapter
我的MainActivity类中有一个SlideTabLayout。我在活动中执行异步网络操作,并将获取的结果传递给SlideTabLayout中所需的片段,但是适配器将片段设置为空值,而我的网络操作稍后会获取数据因此,我无法将值传递给片段。如果您可以看到下面的代码.ArrayList的值在初始阶段为0,Activity将null值传递给所有片段。不断更新,这些更新不会传递给片段。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_meat);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
CatalogueService catalogueService = App42API.buildCatalogueService();
Intent categoryIntent = getIntent();
catalogueName = categoryIntent.getStringExtra("CATALOGUE");
viewPager = (ViewPager) findViewById(R.id.viewpager_meat);
tabLayout = (TabLayout) findViewById(R.id.tabs_meat);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MeatActivity.this,CartActivity.class);
startActivity(intent);
}
});
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
String chickenCategoryName = "Chicken";
catalogueService.getItemsByCategory(catalogueName, chickenCategoryName, new App42CallBack() {
@Override
public void onSuccess(Object o) {
Catalogue catalogue = (Catalogue) o;
for (int i = 0; i < catalogue.getCategoryList().size(); i++) {
String category = catalogue.getCategoryList().get(i).getName();
if (category.equals("Chicken")) {
chickenList = catalogue.getCategoryList().get(i).getItemList();
}
}
Log.e("Chicken Size 1",String.valueOf(chickenList.size()));
}
@Override
public void onException(Exception e) {
final String error = e.getMessage();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MeatActivity.this,error,Toast.LENGTH_LONG).show();
}
});
}
});
String muttonCategoryName = "Mutton";
catalogueService.getItemsByCategory(catalogueName, muttonCategoryName, new App42CallBack() {
@Override
public void onSuccess(Object o) {
Catalogue catalogue = (Catalogue) o;
for (int i = 0; i < catalogue.getCategoryList().size(); i++) {
String category = catalogue.getCategoryList().get(i).getName();
if (category.equals("Mutton")) {
muttonList = catalogue.getCategoryList().get(i).getItemList();
break;
}
}
}
@Override
public void onException(Exception e) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MeatActivity.this,"Unable to fetch data",Toast.LENGTH_SHORT).show();
}
});
}
});
String seaFoodName = "Sea Foods";
catalogueService.getItemsByCategory(catalogueName, seaFoodName, new App42CallBack() {
@Override
public void onSuccess(Object o) {
Catalogue catalogue = (Catalogue) o;
for (int i = 0; i < catalogue.getCategoryList().size(); i++) {
String category = catalogue.getCategoryList().get(i).getName();
if (category.equals("Sea Foods")) {
seaFoodList = catalogue.getCategoryList().get(i).getItemList();
break;
}
}
}
@Override
public void onException(Exception e) {
}
});
setupViewPager(viewPager);
tabLayout.setupWithViewPager(viewPager);
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new OneFragment(activityId, chickenList), "CHICKEN");
Log.e("Chicken Size 2",String.valueOf(chickenList.size()));
adapter.addFragment(new TwoFragment(activityId,muttonList), "MUTTON");
adapter.addFragment(new ThreeFragment(activityId,seaFoodList), "SEAFOODS");
viewPager.setAdapter(adapter);
}
实际上,问题是您在进行异步网络调用。 做这样的事情-
将类级别的变量计数器声明为int计数器;
现在,在三个onSuccess()方法的每一个中,只需执行
counter ++;
setupViewPager();
在您的setupViewPager方法中添加检查
setupViewPager(ViewPager viewPager) {
if(counter == 3){
// your code to set the adapter
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.