Сохранение и восстановление состояния фрагмента, например Play Store - PullRequest
0 голосов
/ 28 октября 2019

Сейчас я занимаюсь разработкой приложения, которое в основном использует следующие компоненты для навигации и визуализации:

 - Navigation component,
 - ViewPager,
 - FragmentStatePagerAdapter,
 - TabLayout.

В приложении имеется 7 фиксированных вкладок (фрагмент). У большинства из них есть один RecyclerView, и я получаю данные с сервера.

У меня есть две проблемы с этим решением:

  1. Когда я щелкаю элемент в одном изRecyclerView, я использую метод navigate() компонента навигации. Затем я нажимаю кнопку «Назад», и список «снова совершает сетевой вызов» и прокручивается до самого верха (без сохранения состояния фрагмента).

  2. Когда я пролистываю в 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);
...