Фрагменты не вызывают OnResume() при прокрутке с помощью ViewPager

Объяснение моей проблемы :

Я трачу много времени, но не могу заставить это работать. У меня есть просмотр пейджера в основной деятельности, который содержит три фрагмента с использованием (Tabhost). Мой класс ViewPagerAdapter расширяет FragmentStatePagerAdapter.

Проблема, с которой я столкнулся, заключается в том, что мой метод OnResume() не вызывается, когда я прокручиваю View. И я хочу обновить представление фрагмента viewpager при пролистывании.

Мой метод OnResume() вызывается только тогда, когда я нажимаю на элемент ListView и обратно. но когда я нажимаю OnLongClick в ListView, другие фрагменты не обновляются.

Примечание. Я знаю, что этот вопрос задавали раньше, но ни одно из этих решений не помогло мне.

Примечание 2. Когда мой телефон переходит в спящий режим, после разблокировки телефона второй фрагмент вызывает onResume()

Мой метод OnResume() на первой вкладке:

 @Override
public void onResume() {
    super.onResume();

    adapterLogin.notifyDataSetChanged();
}

Мой метод OnResume() во второй вкладке:

 @Override
public void onResume() {
    super.onResume();
   adapterLogin.UpdateView(databaseHelper.getAllVoitureFavourite(1,username));
   adapterLogin.notifyDataSetInvalidated();
   adapterLogin.notifyDataSetChanged();


}

Мой метод UpdateView() в BaseAdapter :

public void UpdateView(List<Voiture> items) {
    this.voitureList = items;
    notifyDataSetInvalidated();
    notifyDataSetChanged();

}

Снимок экрана моего приложения для лучшего понимания проблемы:

введите описание изображения здесь

Любая помощь будет оценена.


person Ahlem Jarrar    schedule 21.08.2016    source источник


Ответы (3)


Используйте setUserVisibleHint (логическое значение isVisibleToUser).

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
       // Do your stuff here
    }

}
person Samvel Kartashyan    schedule 27.01.2017
comment
переопределить этот метод во фрагменте - person Mia; 15.05.2019
comment
Переопределяет устаревший метод в androidx.fragment.app.Fragment. - person Reynosh; 14.07.2021

Поведение, которое вы описываете, - это то, как работает ViewPager, в этом нет ничего плохого.

Кроме того, если вы проверите исходный код класса ViewPager, вы заметите, что минимальное значение offscreenPageLimit равно 1. Установка его на 0 просто ничего не делает, поскольку возвращается к значению по умолчанию 1.

Что вы можете сделать, так это добавить TabHost.OnTabChangeListener, чтобы при каждом пролистывании вызывался соответствующий метод.

mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
    @Override
    public void onTabChanged(String tabId) {
        switch (mTabHost.getCurrentTab()) {
            case 0:
                //fragment 1 update()
                break;
            case 1:
                //fragment 2 update()
                break;
            case 2:
                //fragment 3 update()
                break;
        }
    }
});
person kws    schedule 22.08.2016

Если ваш ViewPager имеет только 2 страницы, то ни один из фрагментов не будет останавливаться во время прокрутки, и onResume() никогда не будет вызываться.

Я считаю, что по умолчанию он всегда сохраняет соседние страницы, то есть имеет ограничение на количество страниц, равное 1.

Вы можете попробовать установить количество сохраняемых страниц равным 0.

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(0); 
person Dom    schedule 21.08.2016
comment
Проверьте, обновляется ли ваша первая страница, когда вы переходите на страницу 3 и обратно, и дайте мне знать. Убедитесь, что вы регистрируете свою функцию onResume(), потому что, если ваши данные не меняются, вы не заметите их обновления. Кроме того, будьте осторожны в методе onResume() для второй вкладки. Кажется, что вы дважды вызываете notifyDataSetInvalidated(), что не нужно. - person Dom; 22.08.2016