Фрагменты в CreateView не вызываются при использовании ViewPager

Я разрабатываю приложение для Android, где у меня есть ViewPager в моей MainActivity, состоящий из 3 фрагментов. Проблема заключается в следующем, когда я проведу пальцем к третьему фрагменту и вернусь к первому, вызывается onCreateView фрагмента 1, что я действительно хочу, однако, если я перешел только к второму фрагменту и вернулся к 1-й, onCreateView не вызывается! Мне нужно найти решение этой проблемы, я часами пытался найти решение, но не знал, как его решить. Вот код, связанный с ViewPager в моей MainActivity

    private void setupViewPager(final ViewPager viewPager) {
    final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFrag(new voting(), "ONE");
    adapter.addFrag(new dashboard(), "TWO");
    adapter.addFrag(new chats(), "THREE");
    myAdapter=adapter;
    viewPager.setAdapter(adapter);
    viewPager.setOffscreenPageLimit(0);
}

private class ViewPagerAdapter extends FragmentStatePagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<Fragment>();
    private final List<String> mFragmentTitleList = new ArrayList<String>();

    private ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        Log.i("getItem","getItem");
        return mFragmentList.get(position);
    }


    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    private void addFrag(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    //added newly
    @Override
    public int getItemPosition(Object object){
        return PagerAdapter.POSITION_NONE;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return null;
    }
}

1 ответ

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

Реализация PagerAdapter, которая представляет каждую страницу как фрагмент, который постоянно хранится в диспетчере фрагментов, пока пользователь может вернуться на страницу.

Вы используете FragmentStatePagerAdapter который является подклассом FragmentPagerAdapter так что наследует это поведение.

Как правило, не рекомендуется заново создавать представление при каждом изменении страницы, поскольку это дорого и может привести к не плавной прокрутке. Если у вас была логика onCreateView(...) что вы хотите запускать снова при каждом изменении фрагмента, то я предлагаю изучить ViewPager.OnPageChangedListener,

Другие вопросы по тегам