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方法来解决这个问题,我是对吗?谢谢。
从Android开发人员website对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];
}
}
这样,片段保证只创建一次。
我已经试图实现上面给出的代码,就像我之前所说的“我试着做一个不同的方法,比如为TestFragmentAdapter构造函数中的每个片段调用newInstance()方法,然后调用我已经在getItem中拥有的片段对象方法,它仍然无法正常工作。“ – bangandi 2013-05-12 07:48:49
什么仍然不起作用?当您滑动页面时,必须调用getItem(),但至少该片段不会再次被重新实例化。 – Neoh 2013-05-12 07:54:31
我很抱歉,我的错误。我编辑了我的问题。请大家看看,也许你对我有一个建议,@Neoh。谢谢。 – bangandi 2013-05-12 08:11:29
你可以试着让你的TestFragmentAdapter延伸FragmentPagerAdapter
。
根据我更新的问题,我在下面的答案中考虑@Neoh评论是更正的答案。 – bangandi 2013-05-26 00:18:29