我正在使用BottomNavigationView
来显示导航图中的一堆片段。
在我的MainActivity
中,底部导航设置如下:
val navController = findNavController(R.id.mainNavigationFragment)
setupActionBarWithNavController(navController)
bottomNavigationView.setupWithNavController(navController)
每个片段都有自己的FragmentScoped viewmodel
,以提供其内容。
在bottomnavview
中的每个选项卡之间循环,我看到正在重新创建片段,这又导致为该片段创建新的viewmodel实例。
这将导致新的api调用再次获取数据。
如何避免重新获取此数据?
我知道我可以做到这些:
使用“活动”视图模型托管所有这些数据,但这仅会 制作一个单一的视图模型来托管我所有片段的数据。
缓存api响应,以便重新创建片段 从缓存中获取数据,而不是进行新的网络调用
是否有任何平台提供了最佳实践,我可以遵循该最佳实践来避免每次重新获取数据?
谢谢
答案 0 :(得分:1)
我通过以下方法解决了此问题(经过数小时的研究,由于无法解释某些布局不一致,因此无法覆盖setOnNavigationItemSelectedListener
)
| | | | |
v v v v v
bottomNavigationView.setOnNavigationItemReselectedListener(
item -> Log.d(MY_TAG, "navigation item " + item.getTitle() + " reselected")
);
或
bottomNavigationView.setOnNavigationItemReselectedListener(item -> { } );
如果您不想使用Log
条目:)
答案 1 :(得分:0)
最好设置一个ViewPager
,底部为TabLayout
(可以设置样式,使其看起来非常相似,只是它没有那些编号的标志),然后可以定义屏幕外阈值,即保持活动的页面数-在导航时,这是一种自欺欺人的方法,因为只需替换碎片即可,而无需任何条件。