我有一个片段和一个对应的viewmodel类。我从fragment 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()
})
片段中有一个按钮,该按钮将我带到另一个屏幕,在该屏幕上,我向table添加了更多联系人。但是当我从屏幕上回到片段时,观察者不会被召唤。这意味着当我回来时dataChanged()
方法没有被调用。
我知道,当我从片段中转到另一个活动时,观察者将变为非活动状态,但是当我返回时,它将再次变为活动状态。因此,根据文档:
通常,LiveData仅在数据更改时才将更新传递给活动的观察者。 此行为的一个例外是,观察者从非活动状态更改为活动状态时也会收到更新。此外,如果观察者第二次从非活动状态更改为活动状态,则只有在该值自上次变为活动状态以来已发生更改时,它才会收到更新。
我期望观察员会被召唤,但不会。我错过了什么吗?我正在使用Room来执行数据库。
答案 0 :(得分:0)
如何创建模型?尝试使用片段的活动来代替片段:
viewModel = ViewModelProviders.of(activityOfYourFragment).get(YourViewModelClass.class);
答案 1 :(得分:0)
没有完整的代码,我不能确定哪一部分出错了。 我可能建议您检查以下几件事:
通常不会调用您的OnChanged,因为您的数据未更改,或者您意外地新建了LiveData对象,因此在新建LiveData对象之后没有区别
答案 2 :(得分:0)
不要创建新的 viewModel 实例,而是使用活动视图模型。下面的代码会帮助你。
val 模型:由 activityViewModels() 提供的 MyViewModel