Android的FragmentStatePagerAdapter

我正在使用这个例子使用FragmentStatePagerAdapter。

MyAdapter类的实现如下:

public static class MyAdapter extends FragmentStatePagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return NUM_ITEMS; } @Override public Fragment getItem(int position) { return ArrayListFragment.newInstance(position); } } 

ListFragment类包含以下创build新实例的方法:

  /** * Create a new instance of CountingFragment, providing "num" * as an argument. */ static ArrayListFragment newInstance(int num) { ArrayListFragment f = new ArrayListFragment(); // Supply num input as an argument. Bundle args = new Bundle(); args.putInt("num", num); f.setArguments(args); return f; } 

当我在我的活动中创build一个新的片段状态寻呼机适配器时,调用getItem ,然后调用ListFragment类中的newInstance方法。 当我想要创build一个新的片段时,这非常棒。

但是,我不清楚如何修改getItem (如果需要的话),以获得片段对象, 当它已经存在 ,用户页面,例如,第2页到第1页。我想我的活动检索现有的,以前创build的片段,以便它可以运行驻留在片段类中的内部类AsyncMethod

Solutions Collecting From Web of "Android的FragmentStatePagerAdapter"

我已经实现了类似于你所拥有的东西。 我扩展了FragmentPagerAdapter类,如下所示:

 public class ContactsFragmentPagerAdapter extends FragmentPagerAdapter { ActionBar mActionBar; private List<Fragment> mFragments; public ContactsFragmentPagerAdapter(FragmentManager fm, List<Fragment> fragments) { super(fm); mFragments = fragments; } @Override public int getCount() { return mFragments.size(); } @Override public Fragment getItem(int position) { return mFragments.get(position); } public void setActionBar(ActionBar bar) { mActionBar = bar; } } 

注意我已经给构造函数添加了一个参数来传入Fragment对象List 。 这样,此类的getItem()方法可以返回任何扩展Fragment或其任何子类的类,而不是像您所做的那样只返回一个特定的类ArrayListFragment

在我实例化FragmentPagerAdapter子类的Activity中,我已经在Fragment对象列表中传递了:

类实例化FragmentPagerAdapter

 public final class ContactManager extends Activity { private ContactsFragmentPagerAdapter mAdapter; private ViewPager mPager; public ActionBar mActionBar; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.contact_manager); List<Fragment> fragments = new Vector<Fragment>(); fragments.add(Fragment.instantiate(this, ContactsListFragment.class.getName())); fragments.add(Fragment.instantiate(this, GroupsListFragment.class.getName())); mAdapter = new ContactsFragmentPagerAdapter(this.getFragmentManager(), fragments); mPager = (ViewPager) findViewById(R.id.pager); mPager.setAdapter(mAdapter); mPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageScrollStateChanged(int arg0) {} @Override public void onPageScrolled(int arg0, float arg1, int arg2) {} @Override public void onPageSelected(int arg0) { mActionBar.getTabAt(arg0).select(); } }); } } 

通过访问variables“fragments”,可以访问以前创build的Fragment以便可以运行该Fragment方法。

我认为解决scheme比提供的答案简单得多。

如果你看看FragmentStatePagerAdapter.instantiateItem()的源代码 ,你会注意到instantiateItem()为你处理这个逻辑,因此你的getItem()应该总是返回一个新的实例。

所以为了返回一个现有的片段,简单的做(假设你从ViewPager调用):

 Fragment f = (Fragment) getAdapter().instantiateItem(this, getCurrentItem()); 

虽然@ imiric的解决scheme非常简洁,但它仍然困扰着我,它需要知道类的实现。 我的解决scheme涉及将以下内容添加到您的适配器,它应该与FragmentStatePagerAdapter很好地行为可能销毁碎片:

  private SparseArray<WeakReference<Fragment>> mFragments = new SparseArray<>(); @Override public Object instantiateItem(ViewGroup container, int position) { Fragment f = (Fragment) super.instantiateItem(container, position); mFragments.put(position, new WeakReference<>(f)); // Remember what fragment was in position return f; } @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); mFragments.remove(position); } public Fragment getFragment(int position) { WeakReference<Fragment> ref = mFragments.get(position); Fragment f = ref != null ? ref.get() : null; if (f == null) { Log.d(TAG, "fragment for " + position + " is null!"); } return f; } 
 public class MyPagerAdapter extends FragmentStatePagerAdapter { final Context m_context; final WeakReference<Fragment>[] m_fragments; public DetailPagerAdapter(FragmentManager fm) { super(fm); m_context = ... m_fragments = new WeakReference[enter size here]; } @Override public Fragment getItem(int position) { final Fragment fragment = instantiate your fragment; m_fragments[position] = new WeakReference<Fragment>(fragment); return fragment; } @Override public int getCount() { return ... } public Fragment getFragment(final int position) { return m_fragments[position] == null ? null : m_fragments[position].get(); } } 

不需要修改FragmentPagerAdapter,因为片段由FragmentManagercaching。 所以你必须在里面find它。 使用此function通过寻呼机适配器位置查找片段。

 public Fragment findFragmentByPosition(int position) { FragmentPagerAdapter fragmentPagerAdapter = getFragmentPagerAdapter(); return getSupportFragmentManager().findFragmentByTag( "android:switcher:" + getViewPager().getId() + ":" + fragmentPagerAdapter.getItemId(position)); } 

v4支持api的示例代码。