onCreateView второго фрагмента (вкладки) вызывается, а на первом

У меня 10 вкладок в моем activity. Как только я открываю действие, отображается первый фрагмент, но вызывается метод (AsyncTask), присутствующий в следующем фрагменте. И если я перейду на следующую вкладку, скажем, на 3-ю вкладку, тогда будет вызван метод, присутствующий в 4-й fragment, и так далее.

Я не понимаю такого поведения. Пожалуйста помоги!


person Vaibhav Dhunde    schedule 01.11.2017    source источник


Ответы (3)


Вы должны знать, как работает viewPager, заполняя fragment в разных позициях.

Когда вы начинаете с позиции 0, создаются fragment в позиции 0 и одна из позиции 1.

Затем, когда вы проводите к позиции 1, создается fragment на позиции 2, поэтому теперь у вас есть три fragments, созданных на разных позициях (0,1,2..при условии, что у вас есть только 3 страницы на viewPager).

Мы проводим пальцем к позиции 2, последней, и fragment в первой позиции (0) уничтожаются, поэтому теперь у нас есть fragments в позициях 2 и 3.

Вот как работает Fragment LifeCycle

вы можете установить mViewPager.setOffscreenPageLimit(2); // 2 is just an example, чтобы ограничить его

Если вы хотите, чтобы какой-то код выполнялся, когда Fragment становится видимым для пользователя, добавьте часть кода в метод setUserVisibleHint

person Dipali Shah    schedule 01.11.2017

По умолчанию это viewpager.setOffscreenPageLimit(1) , что означает, что просмотр пейджера по умолчанию загрузит как минимум 1 справа и один на левой вкладке текущей вкладки.

Это сделано так, в основном потому, что есть момент, когда вы скользите вьюпейджером, когда видна определенная область обеих вкладок. Для этих плавных переходов требуется предварительная загрузка.

Вы не можете установить его viewpager.setOffscreenPageLimit(0).

Единственный выход - использовать этот метод setUserVisibleHint добавить это в свой фрагмент

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // load data here
    }else{
       // fragment is no longer visible
    }
}

Это будет вызываться только тогда, когда эта конкретная вкладка видна пользователю, поэтому только тогда вы можете вызывать все функции загрузки.

проверьте пример примера

person Amit Vaghela    schedule 01.11.2017
comment
Да это помогло. Но если данные были извлечены и загружены, то при возвращении на предыдущую вкладку почему я должен снова извлекать и загружать их? - person Vaibhav Dhunde; 01.11.2017
comment
потому что это не будет храниться нигде. поэтому вам нужно загрузить его снова. - person Amit Vaghela; 01.11.2017
comment
ontabselection он перезагрузит этот фрагмент, и в этом фрагменте ваши методы будут вызываться в соответствии с его жизненным циклом, поэтому он снова загрузит данные @VaibhavDhunde - person Amit Vaghela; 01.11.2017
comment
Я все еще работаю над тем же. Обязательно поверит вам. Спасибо. :) - person Vaibhav Dhunde; 02.11.2017

Поместите туда свой метод AsyncTask.

Вы можете переопределить setMenuVisibility следующим образом:

@Override
public void setMenuVisibility(final boolean visible) {
   if (visible) {
      //execute AsyncTask method
   }

   super.setMenuVisibility(visible);
}

Удачного кодирования!!

person Hemant Parmar    schedule 01.11.2017