首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android FragmentStatePagerAdapter

Android FragmentStatePagerAdapter
EN

Stack Overflow用户
提问于 2012-05-18 16:24:09
回答 6查看 41.1K关注 0票数 24

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

MyAdapter类的实现如下:

代码语言:javascript
复制
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类包括以下创建新实例的方法:

代码语言:javascript
复制
    /**
     * 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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-10-24 20:45:39

我已经实现了一些与你类似的东西。我对FragmentPagerAdapter类进行了如下扩展:

代码语言:javascript
复制
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。

代码语言:javascript
复制
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的方法。

票数 6
EN

Stack Overflow用户

发布于 2013-10-06 14:52:29

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

如果您查看FragmentStatePagerAdapter.instantiateItem(),您将注意到instantiateItem()为您处理这个逻辑,因此您的getItem()实现应该总是返回一个新实例。

因此,为了返回一个现有的片段,只需做(假设您是从ViewPager调用):

代码语言:javascript
复制
Fragment f = (Fragment) getAdapter().instantiateItem(this, getCurrentItem());
票数 44
EN

Stack Overflow用户

发布于 2014-05-02 11:36:26

虽然@imiric的解决方案非常简洁,但我仍然感到困扰的是,它需要有关类的实现的知识。我的解决方案包括将以下内容添加到适配器中,它应该能够很好地处理可能破坏片段的FragmentStatePagerAdapter:

代码语言:javascript
复制
    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;
    }
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10656323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档