>
导航组件在HomeFragment中启动新的ProfileFragment。
view.setonClickListener(navigation.createnavigateonClickListener(r.id.action_homefragment_to_profilefragment,null))
在片段中创建ViewModel(PriceGraphFragment)。ViewModel已经被记录,并且具有多个观察者的数据只在ViewModel中初始化一次数据。
priceViewModel.graphlivedata.observe(this,Observer{priceGraphDataMap:hashmap
>
priceviewmodel=viewmodelproviders.of(this).get(PriceDataViewModel::class.java)
使用片段的活动和子片段的父片段创建ViewModel。priceViewModel=viewModelProviders.of(activity!!).get(priceDataViewModel::class.java)
PriceViewModel=viewModelProviders.of(ParentFragment!!).get(PriceDataViewModel::class.java)
onviewcreated()
中创建嵌套的ChildFragment(PriceGraphFragment)有关?父片段
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
user = viewModel.getCurrentUser()
if (savedInstanceState == null) {
fragmentManager
?.beginTransaction()
?.replace(binding.priceDataContainer.id,
PriceGraphFragment.newInstance())
?.commit()
}
这基本上是体系结构中的一个bug。你可以在这里读到更多关于它的信息。您可以通过使用GetViewLifecyCleOwner
而不是Observer
中的这个来解决它。
像这样:
mViewModel.methodToObserve().observe(getViewLifecycleOwner(), new Observer<Type>() {
@Override
public void onChanged(@Nullable Type variable) {
并将此代码放在onActivityCreate()
中,因为使用GetViewLifecyCleOwner
需要一个视图。
在onViewCreated中,我设置了Observer对象,以便在LiveData中所做的任何更改都可以在这里得到更改通知: 在ViewModel类中,我将LiveData参数设置为: 在init中,我设置了一个观察者:
因此,我遇到的问题是,我希望在中有一个的实例,以便在活动和片段中观察它。我怎样才能做到这一点?
此外,为什么Viewmodel不能观察到它自己的LiveData的变化?
我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。现在我希望将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从数据提取类返回的LiveData对象。observe方法需要一个LifecycleOwner对象作为第一个参数,但我的ViewModel中显然没有这个对象,而且我知道我不应该在ViewModel中保留对ac
我在我的Android应用程序中遵循MVVM架构。(https://developer.android.com/jetpack/guide)。我所有的存储库函数都返回一个网络边界资源对象。你可以从jetpack指南链接中阅读更多关于这个设计实现的信息,或者从谷歌这里查看示例项目 在这个特殊的问题中,当我在屏幕上下拉时,我试图通过网络重新获取信息。 目前的工作执行情况 片段侦听器(当屏幕下拉时触发)
我有一个片段和一个相应的viewmodel类。我在Fragment方法上从DB获取包装为LiveData的联系人列表。它工作得很好,我使用PagedListAdapter显示联系人列表,如下所示: 我在我的片段中添加了一个观察者,如下所示: 有一个按钮在我的片段,它把我带到另一个屏幕,在那个屏幕上我添加更多的联系人到表。但当我从那个屏幕回到我的片段时,观察者并没有被调用。这意味着返回时不会调用方法