android - 如何防止再次设置视图模型,在返回片段导航
问题描述
我正在使用 Android Jetpack Navigation、MVVM 和 dataBinding,但我遇到了一个问题。每次从详细信息片段返回时,我的主列表片段都会刷新(再次调用 API,并再次绘制 recyclerList)。我怎样才能防止这种情况?
这是主列表片段代码:
class PostListFragment : BaseFragment() {
private lateinit var viewModel: PostListViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = TestFragmentBinding.inflate(inflater, container, false)
val factory = InjectorUtils.providePostListViewModelFactory()
viewModel = ViewModelProviders.of(this, factory).get(PostListViewModel::class.java)
val adapter = MainListAdapter()
binding.mainList.adapter = adapter
binding.let {
it.viewmodel = viewModel
it.setLifecycleOwner(this@PostListFragment)
}
subscribeUi(adapter)
return binding.root
}
private fun subscribeUi(adapter: MainListAdapter) {
viewModel.progressVisible.postValue(true)
addToDisposable(viewModel.getContentRepository().getAllPosts(requireContext())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ result ->
viewModel.progressVisible.postValue(false)
adapter.submitList(result)
}, { error ->
viewModel.progressVisible.postValue(false)
}))
}
}
另外我必须补充一点,我在包含 viewPager 的 MainFragment 上使用这个片段。
我的 MainFragment 的代码:
class MainFragment : Fragment() {
private lateinit var sharedViewModel: SharedNewPostViewModel
private lateinit var viewModel: MainViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = MainFragmentBinding.inflate(inflater, container, false)
val factory = InjectorUtils.provideMainViewModelFactory()
viewModel = ViewModelProviders.of(this, factory).get(MainViewModel::class.java)
binding.let {
it.viewModel = viewModel
it.setLifecycleOwner(this@MainFragment)
}
sharedViewModel = activity?.run {
ViewModelProviders.of(this).get(SharedNewPostViewModel::class.java)
} ?: throw Exception("Invalid activity")
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val pagerAdapter = MainPagerAdapter(childFragmentManager)
viewPager.adapter = pagerAdapter
tabLayout.setupWithViewPager(viewPager)
}
}
解决方案
需要已经savedInstanceState
签到Activity.onCreate()
:
if(savedInstanceState == null) {
...
}
当它不是时null
,不要膨胀Fragment
- 随后不会调用Fragment.onCreateView()
两次(否则很难View
从那里返回 a )。
推荐阅读
- ruby-on-rails - 如何在 ruby on rails 中使用带有 ajax 的地理编码器
- reactjs - 如何反应日期
- excel - Excel:在单元格或行之间创建关系
- ios - 如何在 podfile 中获取 git 分支?
- python - 将 pandas read_csv 调用传递给另一个带有命名参数的函数
- java - 如何使用 Selenium WebDriver 关闭 Modal?
- azure-active-directory - 如何从 Active Directory 访问令牌中获取刷新令牌。?
- html - 减少表中调用类/函数的次数
- git - 如何在 git-p4 中删除未搁置的分支
- powershell - 从另一个域中获取在一个域中创建的组,彼此之间具有信任关系