我正在使用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类包括以下创建新实例的方法:
/**
* 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;
}当我在活动中创建一个新的片段状态寻呼机适配器时,会调用getItem,然后调用ListFragment类中的newInstance方法。当我想要创建一个新的片段时,这是很棒的。
但是,我不清楚如何修改getItem (如果需要的话),以便在片段对象已经存在时获得它,以及从第2页到第1页的用户页。我希望我的活动能够检索现有的、先前创建的片段,以便它能够运行驻留在片段类中的内部类AsyncMethod。
发布于 2012-10-24 20:45:39
我已经实现了一些与你类似的东西。我对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;
}
}注意,我向构造函数添加了一个参数,以传递List of Fragment对象。这样,该类的getItem()方法可以返回扩展Fragment或其任何子类的任何类,而不是像您所做的那样仅返回一个特定的类ArrayListFragment。
在实例化FragmentPagerAdapter子类的FragmentPagerAdapter中,我在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();
}
});
}
}通过访问变量“片段”,您可以访问先前创建的Fragment,以便运行该Fragment的方法。
发布于 2013-10-06 14:52:29
我认为解决办法比所提供的答案简单得多。
如果您查看FragmentStatePagerAdapter.instantiateItem(),您将注意到instantiateItem()为您处理这个逻辑,因此您的getItem()实现应该总是返回一个新实例。
因此,为了返回一个现有的片段,只需做(假设您是从ViewPager调用):
Fragment f = (Fragment) getAdapter().instantiateItem(this, getCurrentItem());发布于 2014-05-02 11:36:26
虽然@imiric的解决方案非常简洁,但我仍然感到困扰的是,它需要有关类的实现的知识。我的解决方案包括将以下内容添加到适配器中,它应该能够很好地处理可能破坏片段的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;
}https://stackoverflow.com/questions/10656323
复制相似问题