0

我正在使用 Jake Wharton 的ViewPagerIndicator制作一个可滑动的标签。目前我可以让它在我的应用程序中运行,其中有 4 个选项卡。但显然,当我更改页面/选项卡时,每个片段都会重新创建。例如,如果我在选项卡 A 中,切换到选项卡 C,然后返回选项卡 A,则重新创建 A 选项卡的片段,而不仅仅是将旧的片段带到页面前面。

我尝试遵循图书馆的例子。这是我的代码的样子:

ProfileViewPagerActivity

private static final String[] TAB_TITLES = new String[] { "Info",
        "Personal Event", "Favorite", "Attending" };

TestFragmentAdapter mAdapter;
ViewPager mPager;
PageIndicator mIndicator;
int action;
User user;

@Override
protected void onCreate(Bundle arg0) {
    // TODO Auto-generated method stub
    super.onCreate(arg0);
    setContentView(R.layout.simple_tabs);
    action = getIntent().getIntExtra(Constants.LOAD_WHAT, Constants.LOAD_MY_PROFILE);
    user = (User) getIntent().getSerializableExtra(Constants.USER);
    mAdapter = new TestFragmentAdapter(getSupportFragmentManager());

    mPager = (ViewPager) findViewById(R.id.pager);

    mPager.setAdapter(mAdapter);

    mIndicator = (TabPageIndicator) findViewById(R.id.indicator);
    mIndicator.setViewPager(mPager);
}

这是适配器作为 ProfileViewPagerActivity 中的一个类

测试片段适配器

private int mCount = TAB_TITLES.length;


    public TestFragmentAdapter(FragmentManager fm) {
        super(fm);          
    }


    @Override
    public Fragment getItem(int position) {

        switch (position) {
        case 0:
            return UserInfoFragment.newInstance(action,user);

        case 1:
            return EventListFragment.newInstance(user.getUsername(), Constants.LIST_MINE, action);

        case 2:
            return EventListFragment.newInstance(user.getUsername(), Constants.LIST_FAVORITE, action);

        case 3:
            return EventListFragment.newInstance(user.getUsername(), Constants.LIST_ATTENDED, action);
        }
        return null;

    }

    @Override
    public int getCount() {
        return mCount;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return TAB_TITLES[position].toUpperCase(Locale.US);
    }

使用上面的代码,每次我更改选项卡时,片段都会重新创建自己。我尝试采用不同的方法,例如为 TestFragmentAdapter 构造函数中的每个片段调用 newInstance() 方法,然后只调用我在 getItem 方法中已有的片段对象,它仍然不起作用。

我已经尝试过的另一个解决方案是在每个片段中保存实例状态,但也不起作用。我错过了什么吗?提前致谢。

编辑

对不起,我的错误,我想这不是“重新实例化的片段”相关的问题。在进行更多调试后,我发现如果片段显示在 FragmentAdapter 中,则只有数据会再次重新加载。在我的片段中,我在 OnCreateView 方法中从 Web 服务器加载数据。从 android 文档中,我想我应该在 OnCreate 方法中加载我需要的数据来解决这个问题,对吗?谢谢。

4

2 回答 2

0

您可以尝试让您的 TestFragmentAdapter extends FragmentPagerAdapter

于 2013-05-12T05:55:42.303 回答
0

来自 Android 开发者网站FragmentPagerAdapter用户访问的每个页面的片段将保存在内存中,尽管它的视图层次结构在不可见时可能会被破坏。

我相信android有自己的机制来保存内存。如果你不相信,你总是可以先声明你的片段:

private int mCount = TAB_TITLES.length;

private UserInfoFragment fragment0; // first fragment
private EventListFragment [] fragmentAt; // fragment 2,3,4

@Override
protected void onCreate(Bundle arg0) {

    fragmentAt = new EventListFragment[mCount-1];
    ...
}

然后在你的TestFragmentAdapter

@Override
public Fragment getItem(int position) {

    switch (position) {
    case 0:
        if(fragment0 == null) {
            fragment0 = UserInfoFragment.newInstance(action,user);
        }
        return fragment0;

    case 1:
    case 2:
    case 3:
        if(fragmentAt[position-1] == null) {
            fragmentAt[position-1] = EventListFragment.newInstance(user.getUsername(), Constants.LIST_ATTENDED, action);
        }
        return fragmentAt[position-1];
    }
}

这样,片段就可以保证只创建一次。

于 2013-05-12T06:41:37.257 回答