0

Я внедрил вкладки ActionBar, используя ViewPager. У меня три вкладки. На третьей вкладке я выполняю команду AsyncTask, которая извлекает List. Если я отлаживаю приложение, я обнаружил, что AsyncTask выполняется, когда я нажимаю на какую-либо вкладку сначала по умолчанию (вкладка 1). Это означает, что даже если я щелкнул вторую вкладку после нажатия первой вкладки, будет выполнен AsyncTask. Я хочу, чтобы он выполнялся только при выборе третьей вкладки.Android AsyncTask выполняется в неправильных вкладках ActionBar с помощью ViewPager

Вот мой код:

StatusUpdate.java

public class StatusUpdate extends FragmentActivity implements ActionBar.TabListener { 
    private String accesstoken, refreshToken;  
    private StorageHelper helper;  
    private ViewPager viewPager;  
    private ActionBar actionBar;  
    private TabsPagerAdapter mAdapter;  
    private String[] tabs = { "Tab1", "Tab2", "Tab3"}; 
    private int[] icons ={R.drawable.running,R.drawable.color_icons_green_home, R.drawable.report};  
    protected boolean canContinue = true;  
    protected ProgressDialog pd; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.statusupdate); 
     viewPager = (ViewPager) findViewById(R.id.pager); 
     actionBar = getActionBar(); 
     mAdapter = new TabsPagerAdapter(getSupportFragmentManager());  
     viewPager.setAdapter(mAdapter); 
     actionBar.setHomeButtonEnabled(false); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);     
     ConnectionDetector cd = new ConnectionDetector(getApplicationContext()); 
     if (cd.isConnectingToInternet()== false) { 
      new AlertDialog.Builder(this) 
       .setTitle("Network error") 
       .setMessage("Please check your internet connection") 
       .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {  
       public void onClick(DialogInterface dialog, int which) { 
        canContinue = false; 
        finish(); 
       } 
      }) 
      .show(); 
     } else if (canContinue) { 
      // Adding Tabs 
      for (int i= 0; i< tabs.length && i< icons.length; i++) { 
      actionBar.addTab(actionBar.newTab().setText(tabs[i]).setIcon(icons[i]).setTabListener(this)); 
     } 

     /** 
     * on swiping the viewpager make respective tab selected 
     **/ 
     viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {  
      @Override 
      public void onPageSelected(int position) { 
       // on changing the page 
       // make respected tab selected 
       actionBar.setSelectedNavigationItem(position);     
      } 

      @Override 
      public void onPageScrolled(int arg0, float arg1, int arg2) { 
      } 

      @Override 
      public void onPageScrollStateChanged(int arg0) { 
      } 
     });  
    } 

TabPagerAdapter.java

public class TabsPagerAdapter extends FragmentPagerAdapter { 
    public TabsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    }  
    @Override 
    public Fragment getItem(int index) {  
     switch (index) { 
      case 0: 
       // Running late fragment 
       return new Tab1(); 
      case 1: 
       // WFH fragment 
       return new Tab2(); 
      case 2: 
       // Report fragment 
       return new Tab3();    
     }  
     return null; 
    } 

    @Override 
    public int getCount() { 
     // get item count - equal to number of tabs 
     return 3; 
    }  
} 

Tab3.java

public class Tab3 extends Fragment { 
    public static List<StatusResponse> mResponseList = new ArrayList<StatusResponse>(); 
    private ListView statusList; 
    private RelativeLayout rlLoading; 
    public ArrayList<StatusResponse> rowItems; 
    private ExpandableListView expListView; 
    private ExpandableListAdapter listAdapter; 
    List<String> listDataHeader; 
    HashMap<String, List<StatusResponse>> listDataChild; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     View v = inflater.inflate(R.layout.reportlayout, null); 
     statusList = (ListView)v.findViewById(android.R.id.list); 
     rlLoading = (RelativeLayout)v.findViewById(R.id.loadingPanel);   
     expListView = (ExpandableListView)v.findViewById(R.id.lvExpStatus); 
     new GetStatusTask().execute(); 
     return v; 
    } 

    private class GetStatusTask extends AsyncTask<Void, Void, List<StatusResponse>> { 
    } 
} 
+0

возможно дубликат [Как определить, когда фрагмент становится видимым в ViewPager] (http://stackoverflow.com/questions/10024739/how-to-define-when-fragment-становится-visible-in-viewpager) – Selvin

ответ

2

удалить new GetStatusTask().execute(); из onCreateView и поместить его в коде ниже:

viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {  
      @Override 
      public void onPageSelected(int position) { 
       // on changing the page 
       // make respected tab selected 
       actionBar.setSelectedNavigationItem(position); 
       if(position == 2) { 
        new GetStatusTask().execute(); 
       }    
      } 

      @Override 
      public void onPageScrolled(int arg0, float arg1, int arg2) { 
      } 

      @Override 
      public void onPageScrollStateChanged(int arg0) { 
      } 
     }); 

или вы можете вызвать его на onResume() вместо onCreateView.

Update:

в вашем использовании фрагмента класса ниже код:

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
    if(isVisible()){ 
     if(isVisibleToUser){ 
      Log.d("MyTag","My Fragment is visible"); 
     }else{ 
      Log.d("MyTag","My Fragment is not visible"); 
     } 
    } 
} 
+0

Я попытался поместить его в onResume(), но он по-прежнему ведет себя одинаково. Задача попадает, даже если я нажму на вторую вкладку. Я обновляю ListView в этой задаче. Если я использую свой код, я не смогу обновить ListView – user2574903

+0

, попробуйте мое новое обновление! – mmlooloo

+0

@mmlooloo Спасибо за ответ ... ты спас мой день ... –