问题标签 [mutablelivedata]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
81 浏览

android - 出于数据绑定的目的,在 LiveDatas 中构建分层数据的好方法是什么?

使用数据绑定,我如何才能最好地构造数据以本地化 UI 重绘,仅对应于较大 LiveData 的一个小方面?

我的 UI 是一个表示Workout的片段,其中包含 s的集合TableLayout,每个对应于一个Group。每个TableLayouts 都有一个TableRow对应于Lift s' Set的 s 集合。用户可以将Lift添加到Group(UI 必须反映这一点),也可以将Set添加到Lift(UI 必须反映这一点)。

现在,这一切都是通过一个返回 LiveData 的 Room 查询获取的(这是 Workout->Groups->Lifts->Sets 的层次结构)。

现在的问题是,如果您更改集合的一个属性,它会触发整个 LiveData 的观察者。在通知数据已更改之前,我可以编写一些检查唯一性的东西,但这需要一些复杂的深度相等的东西。

或者,我可以获取 LiveData,然后为每个组获取 LiveData(作为具有Set的Lift的层次结构)。然后更改集合将触发 Lift 更改并重绘 UI 的该部分,而不是整个 UI。

尽管如此,如果你这样做,比如说,将文本放入一个集合(触发数据库更新)将重绘包含集合的片段,并且焦点从正确的事情上消失。

最终,您将如何构建一个大的数据层次结构,所有这些数据同时显示在屏幕上,以最大限度地减少通过 LiveData 更改 + 数据绑定触发的 UI 重绘?

0 投票
0 回答
462 浏览

android - ViewModel 中的静态键

有另一个程序员编写的项目。里面有这样的代码

每次向 ViewModel 添加一些数据时,此 keyId 都会递增:

然后以这种方式得到它:

我最近才开始学习 LiveData,我不清楚这个 id 提供了什么以及如何使用它?我的印象是我将数据绑定到某个键,然后使用该键检索它 =) 但这会引起很多问题。

PS 项目写的不好,所以可能这是某种拐杖,但是由于缺乏LiveData的经验,我无法理解这个

0 投票
1 回答
350 浏览

android-architecture-components - 如何更改 LiveData 中类的特定属性值>(在我的情况下是 LiveData>) 使用 MediatorLiveData

Item.kt

然后我进行查询以获取表中的所有项目,它返回

然后在viewModel中我想将选择(true)accordig应用于Mutablelivedata selectionId,选择id包含MutableLiveData<Long>(它包含一个id LiveData<List<Item>>

MyViewModel.kt代码如下所示

如果是List<Item>我可以做这样的事情

但我不知道如何使用 Mediator LiveData 来实现这一点。请帮我

0 投票
1 回答
1134 浏览

android - ViewModel 和 LiveData 在应用程序关闭后不会被删除。为什么?

我刚开始学习android开发,遇到了问题,很高兴得到任何帮助。

当我点击“用户存在?” 按钮,请求被发送到服务器,服务器返回一个用户或 null(在我的例子中,总是 null,因为在服务器上没有创建用户)。

点击观察者中的按钮后,日志中显示如下:

用户结果 onChanged

用户结果非空

用户结果 false null

也就是说,一切正常。

当我通过按“返回”按钮关闭应用程序时,我在日志中看到 onDestroy 被称为活动,而 onCleared 被称为 ViewModel。

但是,如果我什至在一小时后再次运行该应用程序,则会立即显示日志(无需按下按钮):

用户结果 onChanged

用户结果非空

用户结果 false null

但是,如果在关闭应用程序后我通过操作系统清理所有正在运行的应用程序,那么日志中不会显示任何内容。

为什么关闭应用程序一小时后 ViewModel 和 LiveData 仍未删除?我想我做错了什么,请帮助我理解我的错误是什么。感谢。

视图模型

存储库

活动

0 投票
1 回答
90 浏览

android-databinding - 如何数据绑定 livedata 对象(android)

今天我有一些关于 mvvm 和 android 上的数据绑定的问题,

我正在尝试在视图上绑定对象属性。

我有一个具有一些属性的对象(模型),例如:

我有一个带有 livedata 的 ViewModel,如下所示:

最后,我有这样的看法:

我看到我们可以在“Android 开发者”关于“LiveData”的视频中做到这一点:https ://youtu.be/OMcDk2_4LSk?t=102

她说它可以在 3.1+ 版本的 Android 工作室中使用。但这对我不起作用。

0 投票
1 回答
1300 浏览

android-databinding - 对象字段更改时 LiveData 更新值

今天我尝试使用 LiveData (MutableLiveData) 对象来获得一些动态值。(在 MVVM 模式中)

我使用了这样的模型对象:

我使用这样的 ViewModel:

在 MainFragment 中:

在视图中:

当我的模型的值(out1,out2)更新(执行计算时)时,我想更新我的视图。

我怎样才能做到这一点 ?

0 投票
1 回答
1493 浏览

kotlin - 列表的 LiveData 通知观察者而不调用 setValue 或 postValue

MutableLiveData我的视图模型中有这样的:

我将端点调用的结果添加到LiveData如下所示:

据我所知,MutableLiveData不应该通知它Observers ,除非你在它上面执行 a setValueor postValue,但此时当我的代码运行时,Observers 会收到更改的通知。

这怎么可能?


更新:

我遇到了一种更奇怪的行为,这个测试通过了,但是列表被打印了一次:[]

0 投票
5 回答
9345 浏览

android - 数据绑定和 MutableLiveData 的问题

2019 年 11 月更新 - 它现在在最新版本上按预期工作。

原帖:

我正在通过公开公开的函数 setRefreshing(应用程序:XML 中的刷新)将 MutableLiveData 绑定到我的 SwipeRefreshLayout 并且当时一切正常......但是让我们介绍一下我的应用程序架构。

当我根据刷新状态更改其值时,我有带有 MutableLiveData 的抽象 ViewModel。

然后我有两个从这个抽象继承的 ViewModel(让我将它们命名为 FirstViewModel 和 SecondViewModel),命名为 BaseRefreshViewModel。首先,我有两个几乎相同的 XML 文件,仅在第一个 XML 中导入 FirstViewModel 和第二个 - 对应的 SecondViewModel 时与“数据”节点不同。

我太可怕了,所以我将它合并到一个 XML 中并导入这个 BaseRefreshViewModel (list_layout.xml):

然后编译器开始发疯 - 它说:

好的,所以我编写了自己的 BindingAdapter(当然在 SwipeRefreshLayout 中更改为 app:refresh):

仍然是同样的问题,然后我将 BindingAdapter 更改为:

它开始编译,但在运行我的应用程序后出现错误:

没有狗屎夏洛克...有趣的是,当我将 XML 文件中的导入从 BaseRefreshViewModel 更改为 FirstViewModel/SecondViewModel 时,即使没有我的 BindingAdapter,它也开始编译得很好(我当然不能这样,因为我有一个不同的列表我绑定到我的适配器的 ViewModels 中的对象)。

这是我在片段中的 ViewModel 初始化:

和 ViewModel 本身:

如何在不返回创建两个导入了不同 ViewModel 的 XML 文件的情况下超越这一点?

我使用 Android Studio 3.5 Beta 5 只是为了利用 DataBinding 改进的错误消息。

更新:

当我将 MutableLiveData 更改为 ObservableBoolean() 时,它编译并运行良好......但我不想坚持这一点,我想使用 LiveData 及其生命周期优势。它只是显示了我认为现在数据绑定编译器是如何被窃听的。

概括:

WORKING(两个不同的xml,几乎一样)

  • BaseRefreshViewModel (isRefreshing: MutableLiveData)
    • 第一视图模型
      • first_list_layout.xml(导入 FirstViewModel)
    • 第二视图模型
      • second_list_layout.xml(导入 SecondViewModel)

工作(一个 xml 文件,但不是 LiveData)

  • BaseRefreshViewModel (isRefreshing: ObservableBoolean)
    • 第一视图模型
      • list_layout.xml(导入 BaseRefreshViewModel)
    • 第二视图模型
      • list_layout.xml(导入 BaseRefreshViewModel)

不工作(一个带有 LiveData 的 xml 文件)

  • BaseRefreshViewModel (isRefreshing: MutableLiveData)
    • 第一视图模型
      • list_layout.xml(导入 BaseRefreshViewModel)
    • 第二视图模型
      • list_layout.xml(导入 BaseRefreshViewModel)
0 投票
2 回答
220 浏览

android - 如何使数据绑定与 xml 属性一起工作?

我正在设置我的EdittextCheckBox与我的视图模型挂钩。我已经在我的 ViewModel 上设置了变量,isActive并且currentValue我想将它们的值初始化为 xml,以便当用户到达 Fragment 时,当前值也设置为表单字段。

我已经尝试添加android:checked="@{viewModel.isActive}"CheckBoxandroid:text="@{viewModel.currentValue}"EditText但是它没有产生任何结果。

现在,我的解决方法是通过片段初始化表单字段值:

这是我的代码:

我想要的结果是,当viewModel已经初始化currentEntity并更新了isActiveandcurrentValue时,它也会反映在 xml.xml 中。我认为到目前为止的实际输出对于currentValueisActive

0 投票
1 回答
325 浏览

android - MutableLiveData 不会触发 loadAfter 使用 PagedList 从 Android ROM 获取

我的 ROM 上存储了 70 个项目,我想获取 15 个分页数量。到目前为止,我阅读了许多有关相关问题的帖子,但没有一个对我有用。

loadAfter未触发的一些可能原因:

解决方案1getItem内部调用onBindViewHolder

submitList解决方案2:调用PagedListAdapter

解决方案3:替换ListAdapterPagedListAdapter

我认为DataBinding这很好,因为一切正常而无需尝试分页。

我正在嘲笑我的数据源以了解正在发生的事情。一些功能被暂停,因为它们应该有来自需要它的 ROM 的数据。我的代码状态如下:

适配器

分段

视图模型

存储库

制造商页面列表

数据源

常数

我在这里想念什么?