如何在使用ViewPager时在ActionBarActivity Fragments中处理AsyncTask?

我使用ActionBarActivity来创build5个选项卡。 我使用ViewPager在使用扩展FragmentPagerAdapter的SectionsPagerAdapter的5个选项卡之间滑动。 每个选项卡都有一个在oncreateview方法中调用的asynctask片段。 当我在一个片段中,其他片段中的asynctask被调用。

我尝试在oncreateview方法中使用toast消息是每个片段而不是asynctask。 但是,错误的敬酒信息正在被错误的片段解雇。

创build方法代码:

mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); mViewPager = (ViewPager) findViewById(R.id.pager_exp); mViewPager.setAdapter(mSectionsPagerAdapter); mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { actionBar.setSelectedNavigationItem(position); actionBar.setTitle(getHomePageTitle(position)); } }); for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { // Create a tab with text corresponding to the page title defined by // the adapter. Also specify this Activity object, which implements // the TabListener interface, as the callback (listener) for when // this tab is selected. actionBar.addTab(actionBar.newTab() .setIcon(getPagedrawable(i)) .setTabListener(this)); } 

//适配器类代码:

 public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case 0: Fragment1 f1 = new Fragment1(); return f1; case 1: Fragment2 f2 = new Fragment2(); return f2; case 2: Fragment3 f3 = new Fragment3(); return f3; case 3: Fragment4 f4 = new Fragment4(); return f4; case 4: Fragment5 f5 = new Fragment5(); return f5; } return null; } @Override public int getCount() { // Show 5 total pages. return 5; } } 

Fragemnt类代码:

 public class F1 extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @SuppressLint("NewApi") @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View view = inflater.inflate(R.layout.f1,container, false); Toast.makeText(getActivity(), "F1", Toast.LENGTH_SHORT).show(); return view; } } 

FragmentPagerAdapter保持附加片段,除了显示的那个,处于恢复状态。 解决scheme是实现一个自定义的OnPageChangeListener并创build一个新的方法来显示片段。

1)创buildLifecycleManager接口接口将有两个方法,每个ViewPager's Fragment将实现它。 这些方法如下:

 public interface FragmentLifecycle { public void onPauseFragment(); public void onResumeFragment(); } 

2)让每个Fragment为每个类声明实现接口Add iplements语句:

 public class FragmentBlue extends Fragment implements FragmentLifecycle public class FragmentGreen extends Fragment implements FragmentLifecycle public class FragmentPink extends Fragment implements FragmentLifecycle 

3)在每个片段中实现接口方法为了检查它是否按预期工作,我将只logging方法调用并显示Toast:

 @Override public void onPauseFragment() { Log.i(TAG, "onPauseFragment()"); Toast.makeText(getActivity(), "onPauseFragment():" + TAG, Toast.LENGTH_SHORT).show(); } @Override public void onResumeFragment() { Log.i(TAG, "onResumeFragment()"); Toast.makeText(getActivity(), "onResumeFragment():" + TAG, Toast.LENGTH_SHORT).show(); } 

4)在ViewPager页面上调用接口方法你可以在ViewPager上设置OnPageChangeListener,每次ViewPager显示另一个页面的时候都会得到callback:

 pager.setOnPageChangeListener(pageChangeListener); 

5)实现OnPageChangeListener来调用您的自定义生命周期方法

监听者知道新的位置,并可以在PagerAdapter的帮助下调用新的Fragment上的接口方法。 我可以在这里调用onResumeFragment()来获取当前的fragment和onPauseFragment()。

我还需要存储当前片段的位置(最初当前位置等于0),因为我不知道用户是从左到右还是从右到左滚动。 看看我的意思是在代码中:

 private OnPageChangeListener pageChangeListener = new OnPageChangeListener() { int currentPosition = 0; @Override public void onPageSelected(int newPosition) { FragmentLifecycle fragmentToShow = (FragmentLifecycle)pageAdapter.getItem(newPosition); fragmentToShow.onResumeFragment(); FragmentLifecycle fragmentToHide = (FragmentLifecycle)pageAdapter.getItem(currentPosition); fragmentToHide.onPauseFragment(); currentPosition = newPosition; } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } public void onPageScrollStateChanged(int arg0) { } }; 

我没有写代码。 完整的教程在这里: http : //looksok.wordpress.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-including-source-code/

用这个

 viewPager.setOffscreenPageLimit(1); // the number of pages you want to load in background 

也是一个ProgressDialogue

ViewPager创build与您当前页面相邻的片段的视图。 这也使您有机会加载相邻片段所需的任何数据。 如果您使用AsyncTasks加载数据,使用此function将带来更好的用户体验。 但是,如果你需要一个事件,当viewpager打开一个特定的页面,LordRaydenMK的解决scheme将起作用。

在ViewPager中使用AsyncTasks在以下线程上查看我的post:

AsyncTask在ViewPager的每个页面上运行

你好你可以尝试使用每个片段的标签和调用页面上每个片段的调用方法

 mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { actionBar.setSelectedNavigationItem(position); actionBar.setTitle(getHomePageTitle(position)); Fragment f = getFragrmentManager().findFragmentByTag( "" + position); if (f != null) f.refresh(); } }); 

  @Override public Fragment getItem(int position) { Fragment f=null; switch (position) { case 0: f = new Fragment1(); break; case 1: f = new Fragment2(); break; case 2: f = new Fragment3(); break; case 3: f = new Fragment4(); break; case 4: f = new Fragment5(); break; } f.setTag(""+position); return f; }