Viewpager с fragmentstatepageradapter не вызывает oncreateview для предыдущего фрагмента

В моем окне просмотра установлено значение offscreenpagelimit 1 (по умолчанию)

Когда я прокручиваю окно просмотра вправо, oncreateview вызывается для фрагмента с текущей позицией +1 для подготовки следующего фрагмента.

Но когда я перехожу к третьему фрагменту и возвращаюсь ко второму, oncreateview первого фрагмента не вызывается.

Почему окно просмотра ведет себя так и как я могу предварительно загрузить предыдущие фрагменты, если они были удалены из памяти?


person Joske369    schedule 04.06.2015    source источник
comment
Я смог понять это и ответил на него: [здесь] [1] [1]: stackoverflow.com/a/ 30968767/816635   -  person lini sax    schedule 21.06.2015


Ответы (1)


ViewPager ведет себя так, потому что fragmentStatePagerAdapter сохраняет свои представления. При первом запуске вы всегда увидите, что onCreateView () вызывается для фрагмента n + 1. Но если вы прокрутили все фрагменты, их представления уже находятся в FragmentStatePagerAdapter. Конечно, может случиться так, что PagerAdapter уничтожит некоторые представления (и фрагмент) по причинам, связанным с управлением памятью.

Предположим, что это происходит: фрагмент X уничтожается. Итак, если вы проводите пальцем по фрагментам, и вы находитесь на фрагменте Y, фрагмент X находится в вашем offscreenpagelimit. FragmentStatePagerAdapter заметит, что доступного фрагмента нет, и создаст его заново. В этом случае onCreateView () будет вызван снова.

Если вы хотите предварительно загрузить состояние, которое было до того, как фрагмент был уничтожен, вам необходимо использовать обратный вызов onSaveInstanceState ().

Вот пример:

чтобы сохранить состояние Фрагмента:

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Log.v(TAG, "In frag's on save instance state ");
    outState.putSerializable("starttime", startTime);  //saves the object variable
}

для восстановления состояния:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    Log.v(TAG, "In frag's on create view");
    View view = inflater.inflate(R.layout.fragment_data_entry, container,
            false);
    timeTV = (TextView) view.findViewById(R.id.time_tv);
    if ((savedInstanceState != null)
            && (savedInstanceState.getSerializable("starttime") != null)) {
       startTime = (Calendar) savedInstanceState
               .getSerializable("starttime");
   }
   return view;
}

Этот код взят из здесь . Вы можете получить больше информации об этом на этом сайте.

person Paul Reznik    schedule 04.06.2015
comment
Это не помогает. Я до сих пор не вижу, чтобы onCreate и onCreateView вызывались для элемента 0 при загрузке пейджера просмотра в первый раз. - person lini sax; 21.06.2015
comment
См. Мой анализ и способ решения проблемы stackoverflow.com/a/30968767/816635 - person lini sax; 21.06.2015