Дочерний viewpager уничтожен / становится невидимым после слайда страницы родительского viewpager

#android #android-fragments #android-viewpager #adapter

#Android #android-фрагменты #android-viewpager #адаптер

Вопрос:

У меня есть ViewPager (родительский ViewPager) в моей деятельности с 4 фрагментами. Один из фрагментов реализует скользящий ViewPager (Дочерний ViewPager) с автоматическим скольжением.

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

Я предполагаю, что состояние фрагмента пейджера скользящего просмотра теряется при перемещении родительского ViewPager.

Вот адаптер родительского ViewPager:

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

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

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

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

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
} 
 

Вот адаптер дочернего ViewPager (слайдер):

 class sliding_PageAdapters extends FragmentPagerAdapter {
    int mNumOfTabs;

    public sliding_PageAdapters(FragmentManager fm, int numTabs) {
        super(fm);
        this.mNumOfTabs = numTabs;
    }

    @Override
    public void destroyItem(ViewGroup viewPager, int position, Object object) {
        viewPager.removeView((View) object);
    }

    @Override
    public Fragment getItem(int position) {
        Bundle ar = new Bundle();
        FragmentHomeImages fragment = new FragmentHomeImages();

        switch (position) {
            case 0:

                ar.putString("number", "0");
                fragment.setArguments(ar);
                return fragment;

            case 1:
                ar.putString("number", "1");
                fragment.setArguments(ar);
                return fragment;

            case 2:

                ar.putString("number", "2");
                fragment.setArguments(ar);
                return fragment;

            case 3:

                ar.putString("number", "3");
                fragment.setArguments(ar);
                return fragment;

            default:
                return null;
        }

    }

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

Вызывается дочерний ViewPager с getChildFragmentManager() помощью here:

 sliding_pagerAdapter = new sliding_PageAdapters(getChildFragmentManager(), 4);
 

И родительский ViewPager вызывается с getSupportFragmentManager() помощью here:

 adapter = new ViewPagerAdapter(getSupportFragmentManager());
 

Ответ №1:

Я могу придумать одну проблему. На родительском viewpager вызывается setOffscreenPageLimit(ограничение).

здесь limit — это количество страниц, которые должны быть сохранены по обе стороны от текущей страницы в иерархии представлений в состоянии ожидания. Страницы, превышающие этот предел, будут воссозданы из адаптера при необходимости. Поэтому установите соответствующий предел в зависимости от вашего варианта использования.

 viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setAdapter(new MyAdapter(fragmentManager));
viewPager.setOffscreenPageLimit(2);