FragmentPagerAdapter странное поведение - PullRequest
0 голосов
/ 07 июня 2018

Итак, у меня следующая проблема с FragmentPagerAdapter.У меня есть TabLayout с 3 вкладками, представляющими 3 фрагмента, которые я могу переключить.Поэтому, когда я переключаюсь на третий фрагмент, по какой-то причине первый исчезает (или его вид).Кто-нибудь знает, как решить эту проблему?Заранее спасибо.

public class SectionsPagerAdapter extends FragmentPagerAdapter {

private static final int FRAGMENT_COUNT = 3;

private final List<Fragment> 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.

Ответы [ 4 ]

0 голосов
/ 07 июня 2018

И я думаю, что я исправил это :) Единственное, что я сделал, это переопределил метод destroyItem () FragmentPagerAdapter, с пустым телом (без супер).

0 голосов
/ 07 июня 2018

Я не знаю, что на самом деле происходит, но это мой код, надеюсь, это поможет вам

public class AdapterFragmentViewPager extends FragmentPagerAdapter {

    private List<Fragment> 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 голосов
/ 07 июня 2018

Одной из проблем здесь является слегка запутанный 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(); 
    }
}

В противном случае вы столкнетесь с проблемами, когда кэш FragmentManager и ваш собственный кэш List<Fragment> не синхронизированы.Короче говоря, кэширование фрагментов обрабатывается FragmentManager, и вам не нужно выполнять кэширование самостоятельно.

0 голосов
/ 07 июня 2018

Я не знаю, в чем твоя проблема.но если в вашем приложении есть только 3 фрагмента, вы можете попробовать setOffscreenPageLimit метод ViewPager

ViewPager.setOffscreenPageLimit(3);
...