ViewPagerIndicator - 如何避免每次返回时重新加载片段中的数据

时间:2013-05-12 05:33:00

标签: android android-fragments viewpagerindicator

我正在使用杰克沃顿的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中的一个类

TestFragmentAdapter

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方法中已经拥有的片段对象,它仍然不起作用。

我已经尝试过的另一个解决方案是在每个片段中保存SaveInstance,但也不行。我错过了什么吗?提前谢谢。

修改

对不起,我的错误,我想这不是“重新解决的片段”相关问题。在做了更多调试之后,我发现只有片段在FragmentAdapter中显示时才重新加载数据。在我的片段中,我在OnCreateView方法中从Web服务器加载数据。从android文档中,我想我应该在OnCreate方法中加载我需要的数据来解决这个问题,我是对的吗?感谢。

2 个答案:

答案 0 :(得分:0)

您可以尝试让TestFragmentAdapter扩展FragmentPagerAdapter

答案 1 :(得分:0)

来自FragmentPagerAdapter上的Android开发人员website用户访问的每个网页的片段将保留在内存中,但其视图层次结构可能会在不可见时被销毁。

我相信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];
    }
}

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