我有一个片段和一个相应的viewmodel类。我在FragmentOnActivityCreated
方法上从DB获取包装为LiveData的联系人列表。它工作得很好,我使用PagedListAdapter显示联系人列表,如下所示:
var allContacts: LiveData<PagedList<Contact>>? = null
fun initData() {
val factory = repo.getContacts()
allContacts = LivePagedListBuilder(factory, PagedList.Config.Builder()
.setEnablePlaceholders(true)
.setPageSize(Constant.CONTACT_LIST_PAGE_SIZE)
.build()).build()
}
我在我的片段中添加了一个观察者,如下所示:
viewModel.allContacts?.observe(this, Observer<PagedList<Contact>> {
dataChanged()
})
有一个按钮在我的片段,它把我带到另一个屏幕,在那个屏幕上我添加更多的联系人到表。但当我从那个屏幕回到我的片段时,观察者并没有被html" target="_blank">调用。这意味着返回时不会调用datachanged()
方法。
我知道,当我从我的碎片到另一个activity时,观察者变得不活跃,但当我回来时,它又活跃了。因此,根据文档:
通常,LiveData只在数据发生变化时才提供更新,并且只提供给活动的观察者。这种行为的一个例外是,当观察者从非活动状态变为活动状态时,也会收到一个更新。此外,如果观察器第二次从非活动变为活动,则只有在值自上次变为活动以来发生了更改时才接收更新。
我原以为会叫观察者,但没有。我是不是错过了什么。我正在为我的DB实现使用空间。
不是创建新的viewModel实例,而是使用activity视图模型。下面的代码将对您有所帮助。
val模型:ActivityViewModel()
如何创建模型?试着用片段的activity而不是片段来做:
viewModel = ViewModelProviders.of(activityOfYourFragment).get(YourViewModelClass.class);
我尝试使用这个实现ViewModel。但观察者从未被调用。 基本上,这个应用程序在SAMPLE_URL上发出网络请求,将JSON转换为列表,并通过BookView显示列表。这个应用程序在没有ViewModel的情况下工作得很好。使用ViewModel,应用程序会运行,但Observer从未被调用,也没有显示任何数据。 我在这里做错了什么? BookActivity类: BookViewModel类
此外,为什么Viewmodel不能观察到它自己的LiveData的变化?
在onViewCreated中,我设置了Observer对象,以便在LiveData中所做的任何更改都可以在这里得到更改通知: 在ViewModel类中,我将LiveData参数设置为: 在init中,我设置了一个观察者:
我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。现在我希望将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从数据提取类返回的LiveData对象。observe方法需要一个LifecycleOwner对象作为第一个参数,但我的ViewModel中显然没有这个对象,而且我知道我不应该在ViewModel中保留对ac
试图让LiveData与Room一起工作: 因为我观察到tdao.getall(),所以我希望在我的活动中,当同步完成时,它会刷新日历。现在,您必须重新加载该活动,以获取在执行同步后放入数据库的数据。我对Room和LiveData很陌生。有什么想法吗?希望我没有拿出太多的代码,这是从一个相当大的应用程序到目前为止。