viewpager 中的选项卡未按顺序响应 android

tabs in viewpager not responding in a sequence android

在我的 android 应用程序中,我使用的是具有 4 个选项卡的选项卡滑动视图,第一个选项卡在 UI 上显示数据,并通过 AsyncTask 调用 WS,WS 返回的数据正在填充一个pojo 并将此 pojo 传递给其他选项卡(片段) 我面临的问题是,当我单击第一个选项卡时,选项卡未按顺序执行,由于这种奇怪的行为,第一个和第二个选项卡在调用 WS 之前正在执行我无法在第二个选项卡中获取数据

Activity:

   public class TabSwipeActivity extends FragmentActivity implements ActionBar.TabListener, DetailsFoeFragment.ExistingFeatureDataInt

{
    ActionBar actionbar;
    ViewPager viewpager;
    FragmentPageAdapter ft;
    ExistingData existingData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tabswipe);
        ArrayList<String> detailList =this.getIntent().getStringArrayListExtra("FeatureData");      

        viewpager = (ViewPager) findViewById(R.id.pager1);
        ft = new FragmentPageAdapter(getSupportFragmentManager());

        if(detailList!=null)
            ft.setDetailList(detailList);

    //  ft.setExistingData(getExistingData());
        actionbar = getActionBar();
        viewpager.setAdapter(ft);

        actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionbar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);

        actionbar.addTab(actionbar.newTab().setText("Details").setTabListener(this),0,true);
        actionbar.addTab(actionbar.newTab().setText("Action Taken").setTabListener(this),1,false);
        actionbar.addTab(actionbar.newTab().setText("Before Photos").setTabListener(this),2,false);
        actionbar.addTab(actionbar.newTab().setText("After Photos").setTabListener(this),3,false);

        viewpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            public void onPageScrollStateChanged(int arg0) {
                // TODO Auto-generated method stub

            }

            public void onPageScrolled(int arg0, float arg1, int arg2) {
                // TODO Auto-generated method stub

            }

            public void onPageSelected(int arg0) {
                actionbar.setSelectedNavigationItem(arg0);

            }

        });
    }

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        viewpager.setCurrentItem(tab.getPosition());

    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }


////
Adapter:
/////



public class FragmentPageAdapter extends FragmentPagerAdapter {


    Bundle bundle= new Bundle();
    ExistingData existingData = new ExistingData();;

    public FragmentPageAdapter(FragmentManager fm) {
        super(fm);
        // TODO Auto-generated constructor stub
    }
    Fragment fragment;
    @Override
    public Fragment getItem(int arg0) {
        // TODO Auto-generated method stub
        switch (arg0) {
        case 0:

            fragment = new DetailsFoeFragment();
            bundle.putStringArrayList("details",detailList);         
            fragment.setArguments(this.bundle);
            return fragment;
        case 1:
              fragment= new ActionFoeFragment();        
              bundle.putParcelableArrayList("actions",(ArrayList)existingData.getActionList());
            //  bundle.putParcelableArrayList("actions",(ArrayList)existingData.getActionList());
             // bundle.putString("featureId",detailList.get(2));         
              fragment.setArguments(this.bundle);
              return fragment;

        case 2:
            fragment = new PhotoBeforeFoeFragment();
        //  bundle.putStringArrayList("beforeImage",null);
            bundle.putStringArrayList("beforeImage",(ArrayList<String>)existingData.getBeforeImagePath());       
            fragment.setArguments(this.bundle);
            return fragment;
        case 3:
            fragment = new PhotoAfterFoeFragment();
            bundle.putStringArrayList("afterImage",(ArrayList<String>)existingData.getAfterImagePath());         
            fragment.setArguments(this.bundle);
            return fragment;    

        default:
            break;
        }
        return null;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 4;
    }

    ArrayList<String> detailList;
    public void setDetailList(ArrayList<String> detailList) {
        this.detailList = detailList;
    }


    public void setExistingData(ExistingData existingData) {
        this.existingData = existingData;
    }
    @Override
    public int getItemPosition(Object object) {
            return POSITION_NONE;
    } 

}

请提供意见 谢谢

一个解决方案:

  • 在你的activity,运行WS中加上Asynctask,然后调用需要数据的fragment去更新view

     class yourActivity {
    
    
         @Override 
         public void onCreate(Bundle savedInstanceState) {
    
            ... ...
    
            //set up your tabs with fragments
                ... ...
    
            //WS: Your asynctask requesting data from server 
            (new AsyncTask<... ...>() {
    
              ... ...
    
              @Override
              protected void onPostExecute(dataSet) {
                  //here you have got your data set from server then inform tabs to update
                  YourFragment frag = (YourFragment)getSupportFragmentManager().findFragmentById(R.id.your_fragment);
    
                  frag.updateView(dataSet);
              } 
    
           }).execute();
    
    
       }
    
    
    }
    
  • 在每个需要共享数据集的tab/fragment中,定义一个用数据集更新视图的方法

     class YourFragment extebds Fragment{
    
          ... ...
    
         public void updateView(dataSet)
         {
            //update this fragment view with dataSet
            //and stop your waiting dialog
         }
     }
    

希望这个解决方案对你有用。