android - 保存和恢复片段状态,如 Play Store
问题描述
现在我正在开发一个应用程序,它基本上使用这些组件进行导航和可视化:
- Navigation component,
- ViewPager,
- FragmentStatePagerAdapter,
- TabLayout.
在应用程序中有 7 个固定选项卡(片段)。他们中的大多数人都有一个 RecyclerView,我从服务器获取数据。
我对这个解决方案有两个问题:
当我单击其中一个项目时
RecyclerView
,我使用导航组件的navigate()
方法。然后我按下后退按钮,列表是“再次进行网络调用”并滚动到顶部(不保留片段的状态)。当我在其中滑动时,
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);
解决方案
推荐阅读
- php - PHP 检查数组中存在的元素
- python - 为什么要重塑 VGG_UNet 分割模型的最后几层?
- json - 在 asp.net mvc 中使用 ajax 显示复杂的 JSON 数据
- javascript - 如何显示服务器中的表情符号
- java - java中的切换方法
- python - 需要帮助在 python webbrowser.open 中放置一个verable
- python - Python“从 x 导入 y”与“从 .x 导入 y”
- vim - 我不明白为什么 Vim 脚本中的 job_start 会发生这样的事情?
- css - 与父级分隔容器宽度
- javascript - Laravel REST API 何时为值列表创建单独的控制器?