保存和还原片段状态(例如Play商店)

时间:2019-10-28 10:44:47

标签: android android-viewpager android-architecture-navigation

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

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

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

此解决方案有两个问题:

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

  2. 当我在ViewPager中滑动时,它不会保存片段的状态并一直都在重新加载它们。是的,我熟悉setOffscreenPageLimit()方法,并且可以正常工作,但是根据文档:“您应该将此限制保持在较低水平,尤其是在页面具有复杂布局的情况下”,因此我不应该将其设置为7。

所以基本上我的问题是,Google如何在Play商店中做到这一点? Play商店的底部导航栏具有大量标签,顶部具有大量标签,但以某种方式似乎可以保存我以前的所有导航历史记录(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;
}
}

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

0 个答案:

没有答案