首页 > 解决方案 > 保存和恢复片段状态,如 Play Store

问题描述

现在我正在开发一个应用程序,它基本上使用这些组件进行导航和可视化:

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

在应用程序中有 7 个固定选项卡(片段)。他们中的大多数人都有一个 RecyclerView,我从服务器获取数据。

我对这个解决方案有两个问题:

  1. 当我单击其中一个项目时RecyclerView,我使用导航组件的navigate()方法。然后我按下后退按钮,列表是“再次进行网络调用”并滚动到顶部(不保留片段的状态)。

  2. 当我在其中滑动时,ViewPager它不会保存片段的状态并一直重新加载它们。是的,我熟悉该 setOffscreenPageLimit()方法,并且它正在工作,但根据文档:“你应该保持这个限制低,特别是如果你的页面有复杂的布局”,所以我不应该将它设置为 7。

所以基本上我的问题是,谷歌如何在 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;
}
}

初始化 viewpager 和 tablayout

    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);

标签: androidandroid-viewpagerandroid-architecture-navigation

解决方案


推荐阅读