Мои фрагменты на вкладке viewpager не обновляются

Я получил viewpager с 4 вкладками .. в каждой вкладке есть фрагмент. моя первая вкладка-это фрагмент с формой (например пользователи) после нажатия кнопки Сохранить данные вставляются в базу данных. моя вторая вкладка-это еще один фрагмент с формой, но он использует данные с первой вкладки (я получаю его из базы данных) для заполнения блесны. теперь после того, как я успешно вставил данные с моей первой вкладки, во второй вкладке счетчик пуст. поскольку мой запрос db реализован в onCreateView () во втором фрагмент, вызывается только один раз при запуске приложения, поэтому изменение между вкладкой 1 i tab2 не запускает onCreateView() или даже onResume(). Для меня интересно то, что если я перейду на tab4, а затем вернусь на tab2, мои данные будут в моем спиннере правильно, поэтому каким-то образом убирая две вкладки от моей текущей вкладки, обновляя мой фрагмент. мой вопрос в том, как я могу достичь правильного обновления моего фрагмента, когда onCreateView() вызывается только один раз ?

редактировать я пытался поставить этот метод псыхи предложила так:--2-->

    this.mViewPager.setOffscreenPageLimit(0);
    this.mViewPager.setAdapter(this.mPagerAdapter);
    this.mViewPager.setOnPageChangeListener(this);

но это не работает для меня. Я что-то упускаю ?

6 ответов


обновление: есть лучший способ, пожалуйста, посмотрите здесь:обновить ViewPager динамически?


удаление содержимого этого ответа, потому что это был действительно плохой способ доступа Fragments внутри ViewPager см. ссылку выше для лучшего подхода.


лучший способ, который я обнаружил для имитации поведения" setOffscreenPageLimit(0)", - это использование OnPageChangeListener в сочетании с переопределением метода getItemPosition в вашем адаптере. Что-то вроде этого:--3-->

в вашем пользовательском адаптере пейджера:

@Override
public int getItemPosition(Object object) {
     return POSITION_NONE;
}

затем в вашей деятельности, содержащей ViewPager:

final MyPagerAdapter adapter = new MyPagerAdapter();
pager.setAdapter(adapter);
pager.setOnPageChangeListener(new OnPageChangeListener() {
     @Override
     public void onPageSelected(int position) {
          ... anything you may need to do to handle pager state ...
          adapter.notifyDataSetChanged(); //this line will force all pages to be loaded fresh when changing between fragments
     }
}

Это должно иметь тот же эффект, что и установка OffscreenPageLimit в 0. Однако эта функциональность является своего рода против для чего предназначен ViewPager. Если вы пытаетесь реализовать ViewPager таким образом, возможно, стоит пересмотреть свой макет, чтобы убедиться, что ViewPager действительно то, что вы хотите использовать.


Это потому, что вы можете указать количество фрагментов ваш viewpager будет "держать в памяти" (setOffScreenPageLimit (): Я думаю, что значение по умолчанию равно 1). Поэтому ваш второй фрагмент не перезагружается. И когда вы переходите на вкладку 3 или 4, то ваши 2 первых фрагмента удаляются, а затем воссоздаются, когда вы вернетесь.

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


первое переопределение в методе fragment

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(isVisibleToUser){
        actionView();//call the method to be refreshed
    }
    else{
        //no
    }

}

по моему опыту, ViewPagers keep:

  • текущего вкладке
  • & 1 вкладка с обеих сторон в памяти

поэтому, когда вы переключаетесь между 1 и 2, ничего не происходит под капотом - это похоже на то, что они просто скрыты / показаны.

но когда вы переходите на вкладку 4, вкладки 1 и 2 уничтожаются (вызывается onDestroy ()), поэтому, когда вы возвращаетесь к любому из них, они создаются заново (вызывается onCreate ()).

As psykhi предполагает, что вы могли бы setOffScreenPageLimit () к 0, так что каждый фрагмент создается каждый раз, когда вы перейти к ней.

Если вы были заинтересованы в сохранении других страниц в памяти для обеспечения высокой производительности, как они были разработаны с учетом этого, вы можете использовать систему обмена сообщениями / публикации событий для отправки сообщения с вкладки 1 на вкладку 2 с сообщением об обновлении при отправке формы на вкладке 1.


Ok может быть поздним ответом, может помочь другим в будущем, поэтому недавно я столкнулся с той же проблемой при извлечении данных из БД на вкладки, которые он использовал для отображения только один раз, когда я нажимаю на вкладку 3rd.. Я пытался выше решение, но ничего не помогало.. fianlly я наткнулся Отто Эта библиотека позволяет вам общаться в вашем приложении..

просто используйте эту библиотеку для yourAdapter.notifyDataSetChanged () везде, где вы получаете данные из БД..

Это видео помогло меня много https://www.youtube.com/watch?v=lVqBmGK3VuA