我有一个片段和一个相应的视图模型类。我在片段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 仅在数据更改时提供更新,并且仅向活动观察者提供更新。此行为的一个例外是,当观察程序从非活动状态更改为活动状态时,它们也会收到更新。此外,如果观察者第二次从非活动更改为活动,则仅当值自上次变为活动以来发生更改时,它才会收到更新。
我期待观察者被召唤,但它不是.我错过了什么吗?我正在使用空间进行数据库实现。
如何创建模型?尝试使用片段而不是片段的活动来执行此操作:
viewModel = ViewModelProviders.of(activityOfYourFragment).get(YourViewModelClass.class);
不要创建新的视图模型实例,而是使用活动视图模型。下面的代码将为您提供帮助。
val model: MyViewModel by activityViewModels((