Замена фрагмента ViewPager извне

189
20 декабря 2017, 21:49

Как можно заменить текущий фрагмент в ViewPager? Например, нужно заменить класс фрагмента, причем из другого класса, как можно это реализовать?

Answer 1

Если правильно понял ваш вопрос, это довольно легко:

Допустим, у вас есть MyViewPagerAdapter, адаптер вашего ViewPager, у которого есть функции addFragment() и removeFragment(), и который расширяет класс FragmentStatePagerAdapter т.к. вы работаете с фрагментами (override-функции я опускаю, пример такого адаптера можете глянуть здесь):

public class MyViewPagerAdapter extends FragmentStatePagerAdapter {
    Context context;
    private ViewPager viewPager;
    //пример с TabLayout, но можно и без него, конечно
    private TabLayout tabLayout;
    private final ArrayList<Fragment> fragmentList = new ArrayList<>();
    public MyViewPagerAdapter(FragmentManager manager, Context context, ViewPager viewPager,
                            TabLayout tabLayout) {
        super(manager);
        this.context = context;
        this.viewPager = viewPager;
        this.tabLayout = tabLayout;
    }
 ...
    public void addFragment(Fragment fragment) {
        /*
        * добавляем фрагмент в список
        * нужно для override-функций
        * getItem() и getCount()
        */
        fragmentList.add(fragment);
        //не забываем обновить состояние ViewPager'a
        notifyDataSetChanged();
   }
   public void removeFragment(int position) {
      //удаляем tab по позиции
      removeTab(position);
      //удаляем сам фрагмент из списка и...
      Fragment fragment = fragmentList.get(position);
      fragmentList.remove(fragment);
      //удаляем экземпляр фрагмента
      destroyItem(viewPager, position, fragment);
      //не забываем обновить состояние ViewPager'a
      notifyDataSetChanged();
   }
   private void removeTab(int position) {
      if (tabLayout.getChildCount() > 0) {
         tabLayout.removeTabAt(position);
      }
  }
}

destroyItem() - метод из FragmentStatePagerAdapter, который удаляет экземпляр фрагмента.

Теперь просто. В любом классе каким-либо образом получаем позицию текущего фрагмента в ViewPage, который хотим заменить. Например как-то так:

int currentTabPosition = viewPager.getCurrentItem();

Получаем адаптер ViewPage и вызываем:

adapter.removeFragment(currentTabPosition); 

Получаем новый фрагмент:

MyFragment myFragment = new myFragment();

и добавляем его в адаптер:

adapter.addFragment(myFragment);
READ ALSO
SQLite. Запись добавляется пустая

SQLite. Запись добавляется пустая

Запрос в JavaДобавляет пустую запись

142
Сформировать единый список ДТО

Сформировать единый список ДТО

Добрый день, я работаю из Spring Data JPA и возникла такая ситуацияДопустим в базе данных хранится информация про группу в университете(ид группы,...

154
Большая потеря кадров при отрисовке с помощью Swing

Большая потеря кадров при отрисовке с помощью Swing

Идет потеря кадров при отрисовке объектов с помощью Swing, хотел поинтересоваться как можно оптимизировать код или использовать более подходящие...

138
Android Jsoup парсинг

Android Jsoup парсинг

Подскажите в чем ошибка? вылетает приложение

150