Проблема с двумя уровнями вложенных 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: не стесняйтесь дать мне несколько советов по другой оптимизации, если вы их видите.