[英]LiveData Observer not getting called
我有一个片段和一个相应的视图模型类。 我从片段onActivityCreated
方法上从 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()
})
我的片段中有一个按钮,可将我带到另一个屏幕,在该屏幕上,我将更多联系人添加到表格中。 但是当我从那个屏幕回到我的片段时,观察者没有被调用。 这意味着当我回来时不会调用dataChanged()
方法。
我知道,当我从我的片段转到另一个活动时,观察者变得不活跃,但是当我回来时它又变得活跃。 所以根据文档:
通常,LiveData 仅在数据更改时才提供更新,并且仅向活动的观察者提供更新。 这种行为的一个例外是观察者在从非活动状态变为活动状态时也会收到更新。 此外,如果观察者第二次从非活动状态变为活动状态,则只有在自上次变为活动状态后该值发生变化时,它才会收到更新。
我期待观察者被调用,但它不是。 我是不是错过了什么。 我正在使用 Room 来实现我的数据库。
你如何创建模型? 尝试使用片段的活动而不是片段来做到这一点:
viewModel = ViewModelProviders.of(activityOfYourFragment).get(YourViewModelClass.class);
使用活动视图模型,而不是创建新的 viewModel 实例。 下面的代码会帮助你。
val 模型:MyViewModel by activityViewModels()
我有一个片段和一个对应的viewmodel类。 我从片段onActivityCreated
方法上从数据库获取包装为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()
})
我的片段中有一个按钮,该按钮将我带到另一个屏幕,在该屏幕上,我向表格添加了更多联系人。 但是当我从屏幕上回到片段时,没有调用观察者。 这意味着我回来时不会调用dataChanged()
方法。
我知道,当我从片段中转到另一个活动时,观察者将变为非活动状态,但是当我返回时,它将再次变为活动状态。 因此,根据文档:
通常,LiveData仅在数据更改时才将更新传递给活动的观察者。 此行为的一个例外是,当观察者从非活动状态更改为活动状态时,他们也会收到更新。 此外,如果观察者第二次从非活动状态更改为活动状态,则仅当值自上次变为活动状态以来已发生更改时,它才会收到更新。
我期望观察员会被召唤,但不会。 我错过了什么吗? 我正在使用Room进行数据库实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.