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

问题描述:

我正在使用杰克·沃顿的ViewPagerIndicator来制作可滑动的选项卡。目前,我可以使它在我的应用程序中运行,并带有4个选项卡。但显然,当我更改页面/选项卡时,每个片段都会重新创建。例如,如果我处于选项卡A中,切换到选项卡C并返回到选项卡A,则A选项卡的片段会再次重新创建,而不仅仅是将旧选项放到页面的前面。ViewPagerIndicator - 如何避免每次返回时在片段中重新加载数据

我尝试关注该库的示例。这里是我的代码看起来是这样的:

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

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

编辑

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

+0

根据我更新的问题,我在下面的答案中考虑@Neoh评论是更正的答案。 – bangandi 2013-05-26 00:18:29

从Android开发人员websiteFragmentPagerAdapter用户访问的每个页面的片段将保留在内存中,尽管其视图层次结构在不可见时可能会被破坏。

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

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

+0

我已经试图实现上面给出的代码,就像我之前所说的“我试着做一个不同的方法,比如为TestFragmentAdapter构造函数中的每个片段调用newInstance()方法,然后调用我已经在getItem中拥有的片段对象方法,它仍然无法正常工作。“ – bangandi 2013-05-12 07:48:49

+0

什么仍然不起作用?当您滑动页面时,必须调用getItem(),但至少该片段不会再次被重新实例化。 – Neoh 2013-05-12 07:54:31

+0

我很抱歉,我的错误。我编辑了我的问题。请大家看看,也许你对我有一个建议,@Neoh。谢谢。 – bangandi 2013-05-12 08:11:29

你可以试着让你的TestFragmentAdapter延伸FragmentPagerAdapter