现在我正在开发一个应用程序,该应用程序基本上使用以下组件进行导航和可视化:
- Navigation component,
- ViewPager,
- FragmentStatePagerAdapter,
- TabLayout.
在应用程序中有7个固定的选项卡(片段)。他们中的大多数人都有一个RecyclerView,我从服务器上获取数据。
此解决方案有两个问题:
当我单击RecyclerView
中的一个项目时,我使用导航组件的navigate()
方法。然后按返回按钮,列表将“再次进行网络通话”并滚动到顶部(不保留片段的状态)。
当我在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);