2015-01-29 1 views
0

В моем приложении Android я использую представление прокрутки вкладки, имеющее 4 вкладки, первая вкладка отображает данные в пользовательском интерфейсе и вызывает WS через AsyncTask, данные, возвращаемые WS, заполняют pojo и это pojo передается на другую вкладку (фрагменты) Проблема, с которой я сталкиваюсь, - это вкладки, которые не выполняются в последовательности, когда я нажимаю на первую вкладку, первая и две вкладки выполняются перед вызовом WS из-за этого странного поведения, я не могу получить данные в моя вторая вкладкавкладки в viewpager не отвечают в последовательности android

активность:

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

} 

Просьба входы благодаря

+0

Просматривает страницу прокрутки перед отображением – Xcihnegn

+0

, но перед вызовом WS на первой вкладке она выполняет 2 вкладки :(Пожалуйста, предложите любое лучшее решение. – user1785094

+0

Ваша вторая вкладка основана на первой вкладке, выполняющей результат, что не является хорошей логикой. должно быть параллельно. – Xcihnegn

ответ

0

Одно из решений:

  • В вашей деятельности, запуск WS с AsyncTask, а затем вызвать фрагменты, которые нуждаются в данных для обновления Просмотр

    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(); 
    
    
        } 
    
    
    } 
    
  • В каждой вкладке/фрагмент, который нуждается в общий набор данных, определить способ обновить вид с набором данных

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

Надеюсь, что это решение будет работать для вас.

Смежные вопросы