对象字段更改时的 LiveData 更新

2023-11-24

我将 Android MVVM 架构与 LiveData 结合使用。我有一个这样的对象

public class User {
    private String firstName;
    private String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

我的视图模型看起来像这样

public class InfoViewModel extends AndroidViewModel {
    MutableLiveData<User> user = new MutableLiveData<>();

    public InfoViewModel(@NonNull Application application) {
        super(application);
        User user = new User();
        user.setFirstName("Alireza");
        user.setLastName("Ahmadi");

        this.user.setValue(user);
    }

    public LiveData<User> getUser(){
        return user;
    }

    public void change(){
        user.getValue().setFirstName(user.getValue().getFirstName() + " A ");
    }
}

如何确保用户对象中的某些字段发生更改时观察者会收到通知?顺便说一句,对我来说,将这些数据保存在单独的对象中并且不要在 ViewModel 中使用诸如字符串之类的主要值非常重要。


我认为 android 没有为此推荐任何最佳实践。我建议您使用使用更干净且更少样板代码的方法。

如果您正在使用 android 数据绑定LiveData您可以采用以下方法:

你的 POJO 对象看起来像这样

public class User extends BaseObservable {
    private String firstName;
    private String lastName;

    @Bindable
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
        notifyPropertyChanged(BR.firstName);
    }

    @Bindable
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
        notifyPropertyChanged(BR.lastName);
    }
}

所以你已经有了一个类,只要它的属性发生变化就会发出通知。因此,您可以在 MutableLiveData 中使用此属性更改回调来通知其观察者。您可以为此创建一个自定义 MutableLiveData

public class CustomMutableLiveData<T extends BaseObservable>
        extends MutableLiveData<T> {


    @Override
    public void setValue(T value) {
        super.setValue(value);

        //listen to property changes
        value.addOnPropertyChangedCallback(callback);
    }

    Observable.OnPropertyChangedCallback callback = new Observable.OnPropertyChangedCallback() {
        @Override
        public void onPropertyChanged(Observable sender, int propertyId) {

            //Trigger LiveData observer on change of any property in object
            setValue(getValue());

        }
    };


}

然后您需要做的就是在视图模型中使用此 CustomMutableLiveData 而不是 MutableLiveData

public class InfoViewModel extends AndroidViewModel {

    CustomMutableLiveData<User> user = new CustomMutableLiveData<>();
-----
-----

因此,通过这样做,您可以通知视图和 LiveData 观察者,而无需对现有代码进行少量更改。希望能帮助到你

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对象字段更改时的 LiveData 更新 的相关文章

  • 如何使用 ProGuard 将所有方法保留在类中

    我使用 ProGuard 来优化我的 Android 应用程序 然而 对于 Android 仪器测试 我需要一些 但不是全部 类来保留所有成员 我尝试了各种方法 最后一个是 keepclassmembers public class com
  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • Android Studio 3.0.0 不允许 DOCTYPE

    升级到Android Studio 3 0 0 同步并更新gradle插件 出现以下错误 Error DOCTYPE not allowed if function http apache org xml features disallow
  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • Android NDK 中使用“dynamic_cast”时出现“UnsatisfiedLinkError”

    我是 Android 开发新手 我面临下一个问题 当我使用 C 代码时 动态演员 表达方式 不满意的链接错误 当我在模拟器上启动应用程序时出现 但是当我在没有它的情况下运行应用程序时 一切正常 我的意思是 LogCat 没有任何错误 我尝试
  • Firebase 数据库快速入门处理计数的方式安全吗?

    我想为文章点赞创建一个增量字段 我指的是这个链接 https firebase google com docs database android save data save data as transactions https fireb
  • 安卓无法玩ogg

    有人知道这是什么意思吗 ogg使用phonegap is Media播放 它使用MediaPlayer 05 26 15 41 50 007 1160 3631 E AudioFlinger no more track names avai
  • GridView 中多次调用 getView()

    我的 Activity 由包含 40 多个元素的 GridView 组成 开始活动后 用户最多可以看到 15 个项目 3 行 每行 5 个项目 我在 getView 正文中编写传递给获取 View 的 LogCat 编号 Log i get
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • Retrofit-2 内容类型问题

    我的 Api 接受 Content Type application json 作为标头 我按照改造文档中所述完美设置了标题 Headers Content Type application json POST user classes C
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • Renderscript 示例构建错误

    所以我想尝试使用 RenderScript 的示例 并在 Eclipse 中导入了 HelloWorld 但它给了我这样的错误 2011 10 25 13 10 48 HelloWorld home mileoresko workspace
  • Android:应用内计费V3超时返回哪个响应码?

    出现网络超时情况时 Google Play 应用内结算服务 ice er V3 将返回哪些响应状态代码 它的所有功能都是统一的吗 我将在这里描述我的发现 我通过拔掉主机插头 在安装了全功能 GP GP Store V3 10 10 GP S
  • 如何防止布局的方向改变,而不是整个屏幕/活动的方向改变

    我需要一个子布局 可以是任何布局 例如FrameLayout or RelativeLayout 忽略方向变化并始终保持横向 但不是它的父级或任何其他兄弟布局 视图 它们应该相应地改变它们的方向 因此 我不能使用setRequestedOr
  • Firebase ANR - 甚至不使用 firebase

    随着 GMS 的最新更新 引入了新的 ANR 如果您退出应用程序 然后返回 则 ANR 就会初始化 线程跟踪似乎指向 Firebase 但我什至从未开始使用 Firebase 我猜它一定是新的 GMS 包的一部分 06 11 00 34 0
  • Android Studio IDE 上的“文本/设计”选项卡缺少新的 Android 项目

    如何在创建新项目期间自动创建的 Activity main xml 文件的 src main res layout 文件夹中启用文本 设计选项卡 如果我右键单击并在所述文件夹上创建 xml 文件 则设计 文本选项卡存在 有什么建议吗 谢谢
  • Android - 如何更改 TimePicker 中的文本颜色?

    我正在使用 TimePicker 到 LinearLayout 中 背景颜色 黑色 但是 我看不到 TimePicker 中的数字 并且我需要在布局中将背景颜色设置为黑色 如何更改 TimePicker 中的 textColor 我已经尝试
  • 在 Honeycomb Android 3.0 中显示 Action Bar 菜单项的图标

    我正在使用 Honeycomb android 3 0 开发 Android 应用程序 我正在尝试在 Action Bar 中显示菜单 菜单有一个图标和标题 当我们单击菜单项时 它会以下拉列表的形式显示其项目 它是下拉列表中带有项目名称但不
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创
  • 当ScrollView滚动到底部时加载更多数据

    我有一个带有动态加载内容的滚动视图 有时可能会有很多内容 所以我想在用户滚动到底部时加载更多内容 我搜索了合适的方法 发现了两种 onScrollChanged and getScrollY 但我不知道如何将它用于我的目的 请给我一些建议

随机推荐

  • UseShellExecute=false 时无法提升权限

    我想启动一个具有提升权限但具有隐藏窗口的子进程 实际上是相同的控制台应用程序 我接下来做 var info new ProcessStartInfo Assembly GetEntryAssembly Location UseShellEx
  • 如何从文件中读取特定格式的数据?

    我应该从类似于此格式的文件中读取输入和参数 Add id 324 name john name2 doe num1 2009 num2 5 num2 20 问题是我不允许使用 fgets 我尝试使用 fscanf 但不知道如何忽略 并分隔字
  • 无法调用“事件”命令:应用程序已被破坏

    因此 我今天正在调试一些代码 并注意到输出中出现一条新消息 can t invoke event command application has been destroyed while executing event generate w
  • 键盘辞职降低了弹出窗口的高度

    我在 ios 4 3 上遇到了一个奇怪的问题 我的一个屏幕处于横向模式 单击按钮会出现一个弹出窗口 我的弹出窗口有一个搜索栏 每当键盘出现时 它会自动将我的弹出窗口向上推 当我退出键盘时 弹出窗口的高度减小 这只是 ios 4 3 上的问题
  • C++ 类中的函数指针表

    我正在尝试在类中创建一个函数指针表 我在网上找不到任何这样的例子 大多数都涉及在类之外使用成员函数指针 例如 class Test typedef void Test FunctionType FunctionType table 0x10
  • 我可以覆盖 inline !important 吗?

    如果你有 div style display none important div 有没有办法覆盖样式表中的样式以使其显示 最好使用与此类似的东西 div display block important 首先我要说的是一般是内联样式can被
  • std::string 运算符 + 与 stringstream 的性能[重复]

    这个问题在这里已经有答案了 我正在将旧的代码库从使用字符串的自定义实现迁移到使用 std string 我们的一位工程师担心这可能会导致性能问题 因为我们使用 和 来连接相对较长的字符串 他特别关心的是当字符串动态增长时如何分配内存 他建议
  • 背景图片有理想的尺寸吗?

    例如 1x1 图像加载速度会比 2x2 图像加载速度更快吗 尺寸会更小 但浏览器的工作量必须是原来的两倍 对吧 那么 背景图像是否有理想的尺寸和形状 正方形与矩形 我知道这可能不太重要 但我有兴趣知道 谢谢 我认为您的图像没有 理想 尺寸
  • Telerik 控件布局问题 - Visual Studio 2013

    我最近在我的计算机上安装了 Visual Studio 2013 和 2012 我们有几个使用 Telerik 控件的 Web 应用程序 ASP NET 和 MVC 今天 我注意到手风琴控件 扩展器 已完全展开 其中的内容一个又一个地堆叠在
  • [] 和 {} 与 list() 和 dict() 相比,哪个更好? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我知道它们本质上是同一件事 但就风格而言 哪一个用于创建空列表或字典更好 更Pythonic 就速度而言 它与空列表 字典没有竞争 gt gt gt from timeit import
  • Python BigQueryallowLargeResults 与 pandas.io.gbq

    我想使用用于读取 BigQuery 的 Pandas 库数据 如何允许较大的结果 对于非 Pandas BigQuery 交互 可以这样实现this Pandas 的当前代码 sProjectID project id sQuery SEL
  • 使用 ASP.Net 实现多语言网站

    我正在使用 ASP Net 实现一个多语言网站 语言为英语 法语和阿拉伯语 请注意 阿拉伯语的方向是 RTL 实施多语言支持的最佳方式是什么 我计划使用 Net 本地化功能 但网站文本存储在数据库中 对于控件 表单控件 我可以使用 resx
  • 跟踪栏仅在最终值上触发事件,而不会在时间值发生变化时触发事件

    我正在开发一个非常基本的 C Visual Studio 表单应用程序 但在让轨迹栏按照我想要的方式运行时遇到一些问题 因此希望社区中的某个人可以为此提供解决方案 我所拥有的是一个非常基本的应用程序 主要部分是一个值为 0 到 100 的轨
  • 解释 GetKeyState / GetCursorPos 的错误

    有时我会收到客户的错误报告 但我无法解释 在 Delphi 中的 Application Run 之后 我收到以下错误 EOSError System error Code 5 Access denied Call Stack Inform
  • 查找已排序数组中不重复的元素

    资料来源 微软面试问题 是的 您可以使用排序来降低复杂性O log n 通过二分查找 由于数组已排序 因此在缺失元素之前 每个值都占据位置2 k and 2 k 1在数组中 假设从 0 开始索引 所以你转到数组的中间 比如索引h 并检查任一
  • oracle中执行存储过程后是否会发生自动提交?

    我在oracle DB中有3个表 我正在编写一个程序来根据某些条件删除所有 3 个表中的一些行 我在程序中一一使用了所有三个删除语句 在执行上述存储过程时 执行时是否发生自动提交 否则 我是否需要在最后手动编码提交 数据库级别没有自动提交
  • SQL 选择不同的子字符串,就像搞乱了如何

    我有一个表 其中的字段与此类似 ANIMAL FISH 54 FISH 30 DOG 12 CAT 65 CAT 09 BIRD 10 FISH 31 DOG 10 该领域稍后可能会添加新的动物 例如 GOAT 72 DOG 20 我想做的
  • 如何跨模块存储应用程序设置[重复]

    这个问题在这里已经有答案了 我收到了一个离开我们公司的开发人员的项目 不太复杂 但看起来不太好看 所以问题是 应用程序有一些模块 其中一个是存储一些应用程序的 设置 选项 不是所有可能的选项 只说两个 foo and bar 当应用程序启动
  • 为什么lua中的某些平台第一个随机数总是相同?

    考虑以下 lua 代码片段 local time os time for 1 10 do time time 1 print Seeding with time math randomseed time for i 1 5 do print
  • 对象字段更改时的 LiveData 更新

    我将 Android MVVM 架构与 LiveData 结合使用 我有一个这样的对象 public class User private String firstName private String lastName public St