LiveData Observer未被呼叫

时间:2018-10-10 11:08:09

标签: android android-livedata

我有一个片段和一个对应的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来执行数据库。

3 个答案:

答案 0 :(得分:0)

如何创建模型?尝试使用片段的活动来代替片段:

viewModel = ViewModelProviders.of(activityOfYourFragment).get(YourViewModelClass.class);

答案 1 :(得分:0)

没有完整的代码,我不能确定哪一部分出错了。 我可能建议您检查以下几件事:

  1. 通过使用SQLite3直接检查记录,确保将联系人真正添加到下一个活动中
  2. 您的DAO也将加载这些新添加的记录
  3. 通过使用ViewModelProviders.of
  4. ,您的LiveData对象是同一对象。

通常不会调用您的OnChanged,因为您的数据未更改,或者您意外地新建了LiveData对象,因此在新建LiveData对象之后没有区别

答案 2 :(得分:0)

不要创建新的 viewModel 实例,而是使用活动视图模型。下面的代码会帮助你。

val 模型:由 activityViewModels() 提供的 MyViewModel