当前位置: 首页 > 知识库问答 >
问题:

未调用LiveData观察器

於彬
2023-03-14

我有一个片段和一个相应的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实现使用空间。

共有2个答案

拓拔坚
2023-03-14

不是创建新的viewModel实例,而是使用activity视图模型。下面的代码将对您有所帮助。

val模型:ActivityViewModel()

田意致
2023-03-14

如何创建模型?试着用片段的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很陌生。有什么想法吗?希望我没有拿出太多的代码,这是从一个相当大的应用程序到目前为止。