Проблема с двумя уровнями вложенных ViewPager, управляемых FragmentStatePagerAdapter?

В приложении для Android у меня есть динамический viewPager, который может отображать динамический номер фрагмента (номер фрагмента фиксируется до его создания). Этот viewPager состоит из 4 (фиксированного числа) subViewPager. Каждый subViewPager может содержать 1-5 фрагментов. Это означает, что общее количество фрагментов может достигать 20 единиц.

Для информации: фрагмент может быть просто набором полей, вплоть до холст-ориентированного представления, где пользователь взаимодействует с касанием, добавляется с отображением растрового изображения

Я попробовал первую реализацию с использованием FragmentPagerAdapter (для основного и вспомогательного виджетов), он работал нормально, но потребовал много памяти (120 МБ выделенной памяти кучи)

Я сейчас использую FragmentStatePagerAdater, чтобы уменьшить выделение памяти

Моя проблема заключается в том, что subViewPager, который обрабатывается во фрагменте mainViewPager, может быть уничтожен из-за навигации (это то, что ожидает statepageradapter для освобождения памяти) (они инициализируются в OnCreateView).

=> Дело в том, что мне нужно, чтобы этот объект можно было провести с помощью кнопки:

Для перехода к следующему фрагменту мне нужно получить доступ к mainViewPager, а затем к subViewPager текущего элемента mainViewPager, чтобы включить текущий видимый фрагмент.

Проблема заключается в том, что удерживающий фрагмент subViewPager может быть / уничтожен, поэтому viewPager имеет значение null. Где и как обрабатывать подпейджер, чтобы разрешить доступ к подпредставителю ПЛЮС, разрешить освобождение памяти путем уничтожения невидимых фрагментов.

Вот часть кода:

public class MySubViewPagerFragment extends Fragment {

    private MySubFragmentPagerStateAdapter mSubPagerStateAdapter;
    private ViewPager mPagerSub;
    private TitlePageIndicator mIndicatorSub;

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.vp_sub, container, false);

        int id = getArguments().getInt("id");

        // Creation de l'adapter
        mSubPagerStateAdapter = new MySubFragmentPagerStateAdapter(getChildFragmentManager(), ((MainActivity) getActivity()).getConfigList().get(id));
        // Creation du Pager
        mPagerSub = (ViewPager) v.findViewById(R.id.vp_sub);
        // Affectation de l'adapter au ViewPager
        mPagerSub.setAdapter(this.mSubPagerStateAdapter);

        TitlePageIndicator indicator = (TitlePageIndicator) v.findViewById(R.id.tpi_sub);
        indicator.setViewPager(mPagerSub);
        mIndicatorSub = indicator;
        return v;
    }

    public boolean swipNextFragment() {
        boolean result = false;
        int c = mPagerSub.getCurrentItem();
        if (c < (mPagerSub.getAdapter().getCount() - 1)) {
            result = true;
            new Handler().post(new Runnable() {
                @Override
                public void run() {
                    mPagerSub.setCurrentItem(mPagerSub.getCurrentItem() + 1);
                }
            });

        }
        return result;
    }
}

Я попытался поставить subViewPager на уровне активности, но ничего не было решено.

Был ли у вас какой-либо вариант использования / решение или совет?

Вот пример проекта с той же архитектурой. https://github.com/afaucogney/NestedAndroidViewPagers

PS: не стесняйтесь дать мне несколько советов по другой оптимизации, если вы их видите.

0 ответов

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