9

У меня есть ViewPager, который содержит Fragment s по FragmentStatePagerAdapter. Скажем, пейджер изначально имеет следующие страницы (Fragment ы):Динамически пропускать страницы в ViewPager

A - B - C - D 

Когда пойло пользователя, он может перейти от A к B, B к C и т.д. Но есть являются случаи, когда пользователь меняет некоторые параметры на странице A, он может перемещаться не до B, но C:

A - C - D 

Затем пользователь возвращается к A, изменяет что-то и что заново позволяет B:

A - B - C - D 

Как я могу добиться этого очень динамическое поведение? Я не могу добавить Fragment в любое время, когда пользователь что-то меняет, а затем повторно заполняет ViewPager, потому что он медленный и прерывает поток.

+1

Подобно 'ListView', вы можете просто обновить' FragmentStatePagerAdapter' позади вашего 'ViewPager' с различными данными. Дайте 'Adapter' другой набор' Fragments' в каждом случае. – DroidBender

+0

Но если я вызываю 'notifyDatasetChanged',' ViewPager' воссоздает весь список 'Fragment' и переходы на первую страницу, также каждый 'Fragment' теряет состояние. – WonderCsabo

+1

Не создавайте свои фрагменты в самом представлении ViewPager, чтобы они не теряли свое состояние. Создайте их один раз, например, когда создается FragmentActivity. Затем используйте ссылку и не создавайте новые. – DroidBender

ответ

3

У нас тоже была такая же ситуация, и мы решили эту проблему, сохранив логический ArrayList. Страницы здесь - это фрагменты. На фрагменте мы создали интерфейс для обновления ArrayList. Этот интерфейс реализован в родительской активности. На каждом прокрутке ViewPager мы извлекаем логический ArrayList. В ViewPager в setOnPageChangeListener мы переопределили onPageSelected.

А вот кусок кода:

pageIndicator.setOnPageChangeListener(new OnPageChangeListener() { 

    @Override 
    public void onPageSelected(int position) { 
     // TODO Auto-generated method stub 

     pagesPageBreakInfoList = activityContext.getBooleanList(); 
     currentPageNumber = position; 

     if (!pagesPageBreakInfoList.get(position)) { 
      if (currentPageNumber > previouspagenumber) { 
       previouspagenumber = currentPageNumber; 
       if (numberofSubmodule == (position + 1)) { 
        viewPager.setCurrentItem(position - 1); 
       } else { 
        viewPager.setCurrentItem(position + 1); 
       } 
      } else { 
       previouspagenumber = currentPageNumber; 
       viewPager.setCurrentItem(position - 1); 
      } 
     } else { 
      previouspagenumber = currentPageNumber; 
     } 
    } 

    @Override 
    public void onPageScrolled(int arg0, float arg1, int arg2) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onPageScrollStateChanged(int arg0) { 
     // TODO Auto-generated method stub 
    } 
}); 
+0

Хотя пользователь все еще может видеть скрытый фрагмент во время прокрутки, я думаю, это лучшее, что я могу найти. –

Смежные вопросы