Я использую ViewPagerIndicator Jake Wharton для создания прокручиваемой вкладки. В настоящее время я могу заставить его работать в моем приложении с 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);
}
Использование кодов выше, фрагмент воссоздает себя каждый раз, когда я изменить вкладку. Я пытаюсь сделать другой подход, например вызов метода newInstance() для каждого фрагмента внутри конструктора TestFragmentAdapter, а затем просто вызвать объект фрагмента, который у меня уже есть в методе getItem, и он все еще не работает.
Еще одно решение, которое я уже пробовал - это сохранитьInstanceState в каждом фрагменте, но не работает. Я что-то упускаю? Заранее спасибо.
EDIT
Мне очень жаль, моя ошибка, я предполагаю, что это не «пересоздан фрагмент» связанный с этим вопрос. После выполнения дополнительной отладки я обнаружил, что только данные перезагружаются снова, если фрагмент показан в FragmentAdapter. В моем фрагменте я загружаю данные с веб-сервера в методе OnCreateView. Из документов Android, я думаю, я должен загрузить данные, которые мне нужны в методе OnCreate, чтобы решить эту проблему, я прав? Благодарю.
Основываясь на моих обновленных вопросах, я беру комментарий @Nooh в его ответе ниже, это исправленный ответ. – bangandi