Сейчас я занимаюсь разработкой приложения, которое в основном использует следующие компоненты для навигации и визуализации:
- Navigation component,
- ViewPager,
- FragmentStatePagerAdapter,
- TabLayout.
В приложении имеется 7 фиксированных вкладок (фрагмент). У большинства из них есть один RecyclerView, и я получаю данные с сервера.
У меня есть две проблемы с этим решением:
Когда я щелкаю элемент в одном изRecyclerView
, я использую метод navigate()
компонента навигации. Затем я нажимаю кнопку «Назад», и список «снова совершает сетевой вызов» и прокручивается до самого верха (без сохранения состояния фрагмента).
Когда я пролистываю в ViewPager
это не сохраняет состояние фрагмента и перезагружает их все время. Да, я знаком с методом setOffscreenPageLimit()
, и он работает, но в соответствии с документацией: «Вы должны держать этот предел низким, особенно если ваши страницы имеют сложные макеты», поэтому я не должен устанавливать его на 7.
Итак, в основном мой вопрос: как Google это делает в Play Store? В Play Store есть множество вкладок в нижней части навигации, множество вкладок в верхней части, но, похоже, каким-то образом он сохраняет всю мою предыдущую историю навигации (RecyclerView's
состояние и т. Д.).
Спасибо.
Адаптер для ViewPager:
public class MainAdapter extends FragmentStatePagerAdapter {
private Context mCtx;
public MainAdapter(@NonNull FragmentManager fm, int behavior, Context ctx) {
super(fm, behavior);
mCtx = ctx;
}
@NonNull
@Override
public Fragment getItem(int i) {
return new NewsFragment();
}
@Override
public int getCount() {
return 7;
}
@Override
public CharSequence getPageTitle(int position) {
String tabTitle = "";
if (mCtx != null) {
switch (position) {
case 0:
tabTitle = mCtx.getString(R.string.title_fragment_news);
break;
case 1:
tabTitle = mCtx.getString(R.string.button_city_operation);
break;
case 2:
// TODO
tabTitle = "Tab 2";
break;
case 3:
// TODO
tabTitle = "Tab 3";
break;
case 4:
tabTitle = mCtx.getString(R.string.title_fragment_information);
break;
case 5:
tabTitle = mCtx.getString(R.string.title_fragment_announcement);
break;
case 6:
// TODO
tabTitle = "Tab7";
break;
}
}
return tabTitle;
}
}
Начальный просмотр и отображение табуляции :
MainAdapter mMainPagerAdapter = new MainAdapter(getChildFragmentManager(), BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT, getApplicationContext());
ViewPager mViewPager = view.findViewById(R.id.pager);
mViewPager.setAdapter(mMainPagerAdapter);
// mViewPager.setOffscreenPageLimit(3);
final TabLayout tabLayout = view.findViewById(R.id.tab_layout);
tabLayout.setupWithViewPager(mViewPager);