2013-05-12 2 views
0

Я использую 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, чтобы решить эту проблему, я прав? Благодарю.

+0

Основываясь на моих обновленных вопросах, я беру комментарий @Nooh в его ответе ниже, это исправленный ответ. – bangandi

ответ

0

От разработчиков Android website от FragmentPagerAdapter: Фрагмент каждой страницы, которую посещает пользователь, будет храниться в памяти, хотя его иерархия представлений может быть уничтожена, если ее не видно.

Я считаю, что у андроида есть свой собственный механизм для сохранения памяти. Если вы не уверены в том, что вы всегда можете объявить свои фрагменты первым:

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

Я уже пытался реализовать ваш код, приведенный выше, как я уже говорил, «Я пытаюсь сделать другой подход, например, вызвать метод newInstance() для каждого фрагмента внутри конструктора TestFragmentAdapter, а затем просто вызвать объект фрагмента, который у меня уже есть в getItem метод, и он все еще не работает ». – bangandi

+0

что еще не работает? 'getItem()' должен вызываться при прокрутке страниц, но по крайней мере фрагмент не восстанавливается снова. – Neoh

+0

Прошу прощения, моя ошибка. Я отредактировал свой вопрос. Пожалуйста, взгляните, может быть, у вас есть совет для меня, @ Ничего. Благодарю. – bangandi

0

Вы можете попытаться сделать ваш тестовый адаптер расширенным. FragmentPagerAdapter.