FragmentPagerAdapter дивна поведінка

Так що у мене є наступна проблема з FragmentPagerAdapter. У мене є TabLayout з 3 вкладки, що представляють 3 фрагменти, які я можу перемикатися. Тому, коли я переходжу до третього фрагмента, чомусь перший зникає (або його погляд). Хто-небудь знає, як виправити цю проблему? Заздалегідь спасибі.

public class SectionsPagerAdapter extends FragmentPagerAdapter {

private static final int FRAGMENT_COUNT = 3;

private final List listOfFragments = new ArrayList<>();

public SectionsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    return listOfFragments.get(position);
}

@Override
public int getCount() {
    return FRAGMENT_COUNT;
}

public void addFragment(Fragment fragment) {
    listOfFragments.add(fragment);
}


}

Це код для FragmentPagerAdapter.

1
І я думаю, що це виправлено :) Єдине, що я зробив, це перекрити метод FragmentPagerAdapter destroyItem (), з порожнім тілом (не супер.)
додано Автор RadoVidjen, джерело
І я думаю, що це виправлено :) Єдине, що я зробив, це перекрити метод FragmentPagerAdapter destroyItem (), з порожнім тілом (не супер.)
додано Автор RadoVidjen, джерело
Чи можете ви показати код, де ви прив'язуєте свій адаптер?
додано Автор Rutvik Bhatt, джерело

8 Відповіді

І я думаю, що це виправлено :) Єдине, що я зробив, це перевизначити FragmentPagerAdapter destroyItem() метод, з порожнім тілом (не супер).

0
додано

І я думаю, що це виправлено :) Єдине, що я зробив, це перевизначити FragmentPagerAdapter destroyItem() метод, з порожнім тілом (не супер).

0
додано

Однією з проблем тут є трохи заплутаний API.

У FragmentPagerAdapter , getItem (int position) фактично означає "створити елемент". Іншими словами, ви не повинні намагатися вручну кешувати фрагменти у списку адаптера.

@Override
public Fragment getItem(int position) {
    return listOfFragments.get(position); //No! don't do this
}

Незважаючи на те, що це може бути інтуїтивно зрозумілим, вам слід створити новий екземпляр фрагмента, який ви хочете знайти в getItem , дуже наближаючись до офіційного прикладу Google:

@Override 
public Fragment getItem(int position) {
    switch (position) {
        case 0: 
            return FirstFragment.getInstance();
        case 1:
            return SecondFragment.getInstance(); 
    }
}

Otherwise you will run into problems where the FragmentManager's cache and your own List cache are out-of-sync. In short, caching of Fragments is handled by the FragmentManager and you don't need to roll-your-own caching.

0
додано

Однією з проблем тут є трохи заплутаний API.

У FragmentPagerAdapter , getItem (int position) фактично означає "створити елемент". Іншими словами, ви не повинні намагатися вручну кешувати фрагменти у списку адаптера.

@Override
public Fragment getItem(int position) {
    return listOfFragments.get(position); //No! don't do this
}

Незважаючи на те, що це може бути інтуїтивно зрозумілим, вам слід створити новий екземпляр фрагмента, який ви хочете знайти в getItem , дуже наближаючись до офіційного прикладу Google:

@Override 
public Fragment getItem(int position) {
    switch (position) {
        case 0: 
            return FirstFragment.getInstance();
        case 1:
            return SecondFragment.getInstance(); 
    }
}

Otherwise you will run into problems where the FragmentManager's cache and your own List cache are out-of-sync. In short, caching of Fragments is handled by the FragmentManager and you don't need to roll-your-own caching.

0
додано

I don't know what is your problem. but if in your app only 3 fragments are there than you can try setOffscreenPageLimit method of ViewPager

ViewPager.setOffscreenPageLimit(3);
0
додано
Дякуємо за коментар! Проблема полягає в тому, що з деяких причин, якщо у вас є три фрагменти, і скажемо, ви setCurrentItem (1) (це означає, що другий фрагмент за замовчуванням), а потім перейти до останнього фрагмента (третій), а потім повернутися до першого фрагмента, є не перший фрагмент, схожий на його вилучений з якоїсь причини (або принаймні його макет). Як я вже згадував у своєму коментарі, я зафіксував його з перевизначенням destroyItem() з FragmentPagerAdapter.
додано Автор RadoVidjen, джерело
добре чудово. і розмістіть своє рішення як відповідь, так що якщо будь-який інший візит до цього питання, то ваша відповідь допоможе їм вирішити його проблему
додано Автор Bhavesh Rangani, джерело

I don't know what is your problem. but if in your app only 3 fragments are there than you can try setOffscreenPageLimit method of ViewPager

ViewPager.setOffscreenPageLimit(3);
0
додано
Дякуємо за коментар! Проблема полягає в тому, що з деяких причин, якщо у вас є три фрагменти, і скажемо, ви setCurrentItem (1) (це означає, що другий фрагмент за замовчуванням), а потім перейти до останнього фрагмента (третій), а потім повернутися до першого фрагмента, є не перший фрагмент, схожий на його вилучений з якоїсь причини (або принаймні його макет). Як я вже згадував у своєму коментарі, я зафіксував його з перевизначенням destroyItem() з FragmentPagerAdapter.
додано Автор RadoVidjen, джерело
добре чудово. і розмістіть своє рішення як відповідь, так що якщо будь-який інший візит до цього питання, то ваша відповідь допоможе їм вирішити його проблему
додано Автор Bhavesh Rangani, джерело

Я дійсно не знаю, що сталося, але це мій код, сподіваюся, що це допоможе вам

public class AdapterFragmentViewPager extends FragmentPagerAdapter {

    private List fragmentList = new ArrayList<>();


    public AdapterFragmentViewPager(FragmentManager fm) {
        super(fm);
    }

    public void addFragment(Fragment fragment) {
        fragmentList.add(fragment);
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

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

і це мій Tablayout:

private AdapterFragmentViewPager adapterFragmentViewPager = new AdapterFragmentViewPager(getSupportFragmentManager());
TabLayout.Tab home = tabLayout.newTab();
        tabLayout.addTab(home);

        TabLayout.Tab newest = tabLayout.newTab();
        tabLayout.addTab(newest);

        TabLayout.Tab author = tabLayout.newTab();
        tabLayout.addTab(author);

        TabLayout.Tab category = tabLayout.newTab();
        tabLayout.addTab(category);

        TabLayout.Tab saved = tabLayout.newTab();
        tabLayout.addTab(saved);


        adapterFragmentViewPager.addFragment(FragmentHome.newInstance());
        adapterFragmentViewPager.addFragment(FragmentQuote.newInstance());
        adapterFragmentViewPager.addFragment(FragmentAuthor.newInstance());
        adapterFragmentViewPager.addFragment(FragmentCategory.newInstance());
        adapterFragmentViewPager.addFragment(FragmentFavorites.newInstance());
        viewPager.setAdapter(adapterFragmentViewPager);
        tabLayout.setupWithViewPager(viewPager);
0
додано

Я дійсно не знаю, що сталося, але це мій код, сподіваюся, що це допоможе вам

public class AdapterFragmentViewPager extends FragmentPagerAdapter {

    private List fragmentList = new ArrayList<>();


    public AdapterFragmentViewPager(FragmentManager fm) {
        super(fm);
    }

    public void addFragment(Fragment fragment) {
        fragmentList.add(fragment);
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

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

і це мій Tablayout:

private AdapterFragmentViewPager adapterFragmentViewPager = new AdapterFragmentViewPager(getSupportFragmentManager());
TabLayout.Tab home = tabLayout.newTab();
        tabLayout.addTab(home);

        TabLayout.Tab newest = tabLayout.newTab();
        tabLayout.addTab(newest);

        TabLayout.Tab author = tabLayout.newTab();
        tabLayout.addTab(author);

        TabLayout.Tab category = tabLayout.newTab();
        tabLayout.addTab(category);

        TabLayout.Tab saved = tabLayout.newTab();
        tabLayout.addTab(saved);


        adapterFragmentViewPager.addFragment(FragmentHome.newInstance());
        adapterFragmentViewPager.addFragment(FragmentQuote.newInstance());
        adapterFragmentViewPager.addFragment(FragmentAuthor.newInstance());
        adapterFragmentViewPager.addFragment(FragmentCategory.newInstance());
        adapterFragmentViewPager.addFragment(FragmentFavorites.newInstance());
        viewPager.setAdapter(adapterFragmentViewPager);
        tabLayout.setupWithViewPager(viewPager);
0
додано
android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.