Android MVVN 使用入门

article/2025/9/30 9:17:18

MVVM(Model-View-ViewModel)是一种基于数据绑定的设计模式,它与传统的 MVC 和 MVP 模式相比,更加适合处理复杂的 UI 逻辑和数据展示。在 Android 开发中,MVVM 通常使用 Data Binding 和 ViewModel 实现。

在这里插入图片描述

下面是一个简单的示例,介绍如何在 Android 中使用 MVVM。

首先,我们需要在项目中添加 Data Binding 和 ViewModel 相关依赖:

android {...dataBinding {enabled = true}
}dependencies {...implementation 'androidx.lifecycle:lifecycle-viewmodel:2.4.0'implementation 'androidx.lifecycle:lifecycle-livedata:2.4.0'
}

接着,我们创建一个 Model 类,用于存储数据:

data class User(val name: String, val age: Int)

然后,我们创建一个 ViewModel 类,用于处理数据逻辑:

class UserViewModel : ViewModel() {private val _user = MutableLiveData<User>()val user: LiveData<User>get() = _userinit {_user.value = User("张三", 18)}fun changeUserName(newName: String) {val oldUser = _user.value ?: return_user.value = oldUser.copy(name = newName)}
}

在上面的代码中,我们使用了 LiveData 来管理数据,并且提供了一个 changeUserName() 方法,用于修改用户的名字。

接下来,我们创建一个布局文件,用于展示数据:

<layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variablename="viewModel"type="com.example.sample.UserViewModel" /></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:text="@{viewModel.user.name}"android:layout_width="wrap_content"android:layout_height="wrap_content" /><Buttonandroid:text="修改名字"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="@{() -> viewModel.changeUserName(`李四`)}"/></LinearLayout>
</layout>

在上面的代码中,我们使用了 Data Binding 来绑定 ViewModel,并且使用了双向数据绑定来展示用户的名字。同时,我们还提供了一个按钮,用于修改用户的名字。

最后,我们在 Activity 中使用 ViewModel 和 Data Binding 来展示数据:

class MainActivity : AppCompatActivity() {private lateinit var binding: ActivityMainBindingprivate val viewModel by viewModels<UserViewModel>()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = DataBindingUtil.setContentView(this, R.layout.activity_main)binding.lifecycleOwner = thisbinding.viewModel = viewModel}
}

在上面的代码中,我们使用了 viewModels() 方法来创建 ViewModel,并且使用 Data Binding 来绑定 ViewModel 和布局文件。同时,我们还指定了 Activity 为布局文件的生命周期所有者,以便 LiveData 正确地进行数据更新。

综上所述,以上就是一个简单的 Android MVVM 示例代码。在实际开发中,MVVM 可以更好地分离业务逻辑和 UI 展示,使代码更加清晰和易于维护。


http://chatgpt.dhexx.cn/article/Swk2MFhj.shtml

相关文章

mvnw的使用

1、什么是mvnw mvnw是Maven Wrapper的缩写。我们安装Maven时&#xff0c;默认系统所有项目都会使用全局安装的这个Maven版本。但对于某些项目来说&#xff0c;它可能必须使用某个特定的Maven版本&#xff0c;这时就可以使用Maven Wrapper&#xff0c;它可以负责给这个特定的项…

快速查找参考文献影响因子——ScholarScope

前言&#xff1a; 最初看到的关于查看影响因子的插件有&#xff1a;pubmedy, pubmed plus 和 scholar scope. 试了pubmedy&#xff0c;找到的版本没有用。 PubMed 是一个提供生物医学方面的论文搜寻以及摘要&#xff0c;并且免费搜寻的数据库。它的数据库来源为MEDLINE。其核心…

新手刚学js遇到的ie6问题

2019独角兽企业重金招聘Python工程师标准>>> 1.前段时间遇到一个需求&#xff0c;需要让图片在点击tab的时候加载。如果那个tab是由a标签组成的&#xff0c;这时候你就需要在click之后return false。不然坑爹的ie6是没法显示图片的。 2.有个需求是&#xff0c;做一…

查看文章影响因子的插件_查询文献可实时显示影响因子与分区排名的2个强大浏览器插件...

首先,看下我们普通的PubMed文献查找页面,是下图这样子的: 可是装了两个国产神器之后,文献的检索结果列表是下图这样的,可以实时查看文章的影响因子、研究领域的排名,以及全文下载链接、引文格式等。 而这两个神器其实只是两款非常小的浏览器插件:PubMedy和Scholarscope。…

python 贪吃蛇游戏代码

第一步&#xff1a;蛇形 运行IDLE&#xff0c;打开一个新的文本编辑窗口。输入以下的代码&#xff1a; # -*- coding: UTF-8 -*- # 1 - 引入模块 import pygame from pygame.locals import * import sys,random,time,math# 2 - 初始化pygame pygame.init() fpsClock pygame.…

简单的贪吃蛇

最近都在忙着复习考试&#xff0c;忙里偷闲&#xff0c;抽出时间写了个贪吃蛇&#xff0c;没时间写详细的思路了&#xff0c;代码里有比较详细的注释&#xff0c;有兴趣的同学可以自己看看。&#xff08;感觉写的相对来说还是比较简短的&#xff0c;如果有什么写的不好或是不对…

简单的贪吃蛇代码,可上机运行

贪吃蛇无敌版&#xff0c;可穿墙&#xff0c;英文输入法小写字母wasd操作。 #include<stdio.h> #include<string.h> #include<windows.h> #include<time.h> #include<conio.h>#define up w #define down s #define left a #define right d #def…

cmd贪吃蛇(cmd贪吃蛇怎么做)

贪吃蛇代码-贪吃蛇的围墙代码怎么&#xff1f;贪吃蛇的围墙代码怎么写 哈哈……避邪[哈哈] 贪吃蛇在哪下载啊 我的工享里有 在dos环境下c语言编程编一个贪吃蛇游戏 程序设计及说明 该类规定游戏的范围大小。 Snake 用该类生成一个实例蛇 snake 该类用于实现对蛇的操作控制&…

C++实现cmd界面简单贪吃蛇游戏

贪吃蛇的玩法我想应该大家都是耳熟能详了。但是这游戏虽然简单&#xff0c;但是编写的难度对一个刚刚学完c,准备考研的苦逼大学生来说却是一件非常艰难的事情。 date:10月3日&#xff0c;国庆节的头3天&#xff0c;大家在外玩耍我却苦逼的在这里写代码痛苦ing&#xff0c;不知…

手敲最基础C语言代码----“贪吃蛇”

C语言创作游戏----第二弹----贪吃蛇&#xff08;无限吃&#xff09; 主函数系列&#xff1a; 创建引入头文件----方便查看代码&#xff01;&#xff01; #include<stdio.h> #include<Windows.h> #include<stdlib.h> #include<conio.h> #include<tim…

创建链表和遍历链表算法演示

#include <stdio.h> #include <malloc.h> #include <string.h> #include <stdlib.h>typedef struct Node {int data; //数据域struct Node * pNext; //指针域}Node, *pNode;//函数声明 pNode create_list(); void traverse_list(pNode pHead); int…

C++ 创建链表

本文旨在解决两个问题&#xff1a; 1、如何写一个创建链表函数 2、为什么对于单个节点必须要new&#xff0c;而不能使用& 1、如何写一个创建链表函数 代码如下 ListNode* createListNode(vector<int> input) {ListNode dummy ListNode(-1);ListNode* pre &d…

单链表创建

单链表的创建与操作 链表作为基本的数据结构&#xff0c;学习好链表的创建与操作是数据结构入门的基础。 &#xff08;小白make for myself&#xff09; 单链表的创建 typedef struct Node {int data;struct Node* next; }Node;//结构体创建&#xff0c;也可以使用*Node取址…

动态链表的创建

#include <stdio.h> //List结构样式 typedef struct node { int data; struct node *next; }Node; //创建head的空链 Node *createList() { Node *head (Node *)malloc(sizeof(Node)); if(NULL head) exit(-1); head->next NULL; return head; } Node *insertList(…

C++创建一个链表

这个是在参加面试的时候遇到的题目&#xff0c;说句实话&#xff0c;我当时不懂。 后面查了资料&#xff0c;里面写的比较仔细就不多说了。 #include <iostream> using namespace std; struct node {int data;node* next;node(int data, node* next NULL) {this->d…

如何在Python中创建与使用链表(单链表)

如何在Python中创建与使用链表&#xff08;单链表&#xff09; 最近用Python语言在Leetcode中刷题&#xff0c;接触到不少关于链表的题&#xff0c;学校目前还没有开设数据结构的课程&#xff08;开设的话应该也是以C/C语言写的&#xff09;。 因为不太了解链表使用方式&#…

循环链表的创建

循环链表的创建以及基本操作 上篇我们讲了运用头插法和尾插法创建单链表的方法&#xff0c;和两种方法的比较。 接着我们学习循环链表的创建。 只要学会了单链表的创建&#xff0c;循环链表的创建就变得很简单。 循环链表创建 单链表的结构&#xff1a; 循环链表&#xff1a…

单链表的创建

单链表类型定义 单链表是由一串结点组成的&#xff0c;其中每个结点都包含指向下一个结点的指针&#xff0c;最后一个结点的指针为空&#xff1b; 假设结点只包括一个整数和指向下一结点的指针 typedef struct node{int data;struct node *next; }LNode,*LinkList; //LNode为…

创建双向链表(详解)

双向链表操作 在学习了单链表之后&#xff0c;就顺带学习了双链表的操作。 什么是双链表&#xff1f; 双链表顾名思义&#xff0c;就是链表由单向的链变成了双向链。 使用这种数据结构&#xff0c;我们可以不再拘束于单链表的单向创建于遍历等操作&#xff0c;大大减少了在使…

如何构建一个简单链表

如何构建一个简单链表 一、 含构造函数和默认实参的结构体 typedef struct node {int data;struct node* next;node(int data 0, struct node* next NULL): data(data), next(next) {}} node; 二、 创建一个一定长度的链表 (一) 错误样例&#xff1a; int n 3;node* head …