Android中级——MVVM

MVVM

  • MVVM是什么?
  • MVVM实现
    • 前提
    • Model
    • ViewModel
    • View

MVVM是什么?

Model-View-ViewMode架构,可看作MVP改进版,将此前Presenter的逻辑操作交给ViewMode中的Binder去处理

在这里插入图片描述

  • Mode:封装数据存储及相关操作逻辑,与MVC/MVP不同的是会提供一系列实体类与UI绑定,ViewModel修改这些数据后将数据变化告诉View
  • View:处理界面逻辑但不参与业务逻辑,显示ViewModel提供的数据
  • ViewModel:视图模型与视图状态的合称,为View提供一个可供显示的数据模型并收集、处理这些数据,内部的Binder用于双向绑定,还可包含多个Child ViewModel

MVVM实现

前提

在build.gradle中android节点添加如下代码(最低SDK版本为API7,Gradle版本为1.5.0-alpha1)

dataBinding{enabled = true
}

Model

创建数据实体类LoginInfo

  • 继承BaseObservable
  • getXXX()方法通过@Bindable注解表示该方法所返回的数据被修改时会更新UI
  • setXXX()方法调用notifyPropertyChanged()告诉DataBinding该字段被更改
public class LoginInfo extends BaseObservable {private String mUser;private String mPassword;public LoginInfo(String user, String password) {mUser = user;mPassword = password;}@Bindablepublic String getUser() {return mUser;}public void setUser(String user) {mUser = user;notifyPropertyChanged(BR.user);}@Bindablepublic String getPassword() {return mPassword;}public void setPassword(String password) {mPassword = password;notifyPropertyChanged(BR.password);}
}

ViewModel

LoginModel封装维护LoginInfo、点击事件、文本改变事件

public class LoginModel {private static final String DEF_USER = "song";private static final String DEF_PASSWORD = "123";public LoginInfo mInfo;private OnLoginListener mListener;public LoginModel(OnLoginListener listener) {mListener = listener;mInfo = new LoginInfo("", "");}public TextWatcher getUserTextWatcher() {return new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {mInfo.setUser(s.toString());}};}public TextWatcher getPasswordTextWatcher() {return new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {mInfo.setPassword(s.toString());}};}public interface OnLoginListener {void onLoginSuccess();void onLoginFail();}public void onLoginClick(View view) {if (mInfo.getUser().equals(DEF_USER) && mInfo.getPassword().equals(DEF_PASSWORD)) {mListener.onLoginSuccess();} else {mListener.onLoginFail();}}
}

View

xml文件根节点变为layout,布局分为

  • 数据部分:声明所使用到的数据实体类以及构造该对象时的引用名
  • UI部分:常规控件,可直接使用数据实体类对象中的字段、方法
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variablename="model"type="com.demo.demo0.LoginModel" /></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_horizontal"android:orientation="vertical"><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:addTextChangedListener="@{model.getUserTextWatcher}"android:hint="User"android:text="@{model.mInfo.getUser}" /><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:addTextChangedListener="@{model.getPasswordTextWatcher}"android:hint="Password"android:text="@{model.mInfo.getPassword}" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="@{model.onLoginClick}"android:text="Login" /></LinearLayout></layout>

MainActivity开启线程3秒后修改数据会显示在UI

  • 通过DataBindingUtil.setContentView设置布局,布局名字为R.layout.ab_cd,则对应类为AbCdBinding,为其设置Model
public class MainActivity extends AppCompatActivity implements LoginModel.OnLoginListener {private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);LoginModel model = new LoginModel(this);binding.setModel(model);new Thread(new Runnable() {@Overridepublic void run() {SystemClock.sleep(3000);model.mInfo.setUser("New User");model.mInfo.setPassword("New Password");}}).start();}@Overridepublic void onLoginSuccess() {Log.d(TAG, "onLoginSuccess: ");}@Overridepublic void onLoginFail() {Log.d(TAG, "onLoginFail: ");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/111505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

URL、域名和网址的区别

网址、域名和URL 都用于描述在互联网上定位资源的标识符&#xff0c;通常它们可以互换使用&#xff0c;但严格来说有区别&#xff1a; URL&#xff08;Uniform Resource Locator&#xff09;&#xff1a;URL是统一资源定位符的缩写&#xff0c;它是一个包含地址信息的完整字符串…

Kali Linux 安装搭建 hadoop 平台 详细教程

1&#xff09;前期环境准备&#xff1a;&#xff08;虚拟机、jdk、ssh&#xff09; 2&#xff09;SSH相关配置 安装SSH Server服务器&#xff1a;apt-get install openssh-server 更改默认的SSH密钥 cd /etc/ssh mkdir ssh_key_backup mv ssh_host_* ssh_key_backup 创建新…

【C++进阶(八)】C++继承深度剖析

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 继承 1. 前言2. 继承的基本概念3. 继承关系和访…

酷开会员值得回味的经典老剧还记得吗?酷开系统家庭影院带你重温

那些年&#xff0c;大家的娱乐生活主要集中在那一台9寸的黑白电视机中&#xff1b;那些年&#xff0c;家家户户的孩子们晚上都会聚到电视机前欢声笑语&#xff1b;那些年&#xff0c;是诸多经典的电视剧陪伴了很多人的闲暇时光……那些年陪伴我们成长&#xff0c;在记忆中熠熠生…

下笔如有神:用VS Code写markdown

文章目录 Markdown All in One快捷键指令 输出PDFMarkdown Preview Enhancedmarkdown基本语法 Markdown All in One VS Coode中最推荐的Markdown插件是Markdown All in One&#xff0c;下文简称为mdAIO。千万别搜完markdown后下一个叫Markdown的插件&#xff0c;这个插件的名字…

新年学新语言Go之四

一、前言 任何编程语言都有类型系统&#xff0c;类型系统解决了数据的存取问题&#xff0c;它决定了使用这个类型需要开辟内存空间大小以及数据是如何存放的&#xff0c;也解决如何读出数据&#xff0c;因为在内存中相同二进制值不同类型的含义是不一样的&#xff0c;关于Go基…

Oracle的立场:官网更换首页与以色列站在一起

Oracle公司的官网&#xff0c;更换了首页内容&#xff0c;明确表明立场&#xff1a;Oracle与以色列站在一起。 声明指出&#xff1a; Oracle谴责针对以色列及其公民的恐怖袭击。Oracle将为其员工、以色列政府和国防机构提供一切必要的支持。 Magen David Adom是一家为以色列公民…

MySQL 数据库类型介绍及使用场景

INT、TINYINT、SMALLINT、MEDIUMINT、BIGINT&#xff08;整数类型&#xff09; 整数类型又称数值型数据&#xff0c;数值型数据类型主要用来存储数字。不同的数据类型提供不同的取值范围&#xff0c;可以存储的值范围越大&#xff0c;所需的存储空间也会越大。 MySQL 主要提供…

1024,毕业后工作的五个月

入职 一晃一下又到了1024&#xff0c;彼时已经成为打工人在写分享了&#xff0c;自己已经搬砖5个月了&#xff0c;总感觉4月份拍毕业照、去川渝毕业旅行看plmm还是在昨天&#xff0c;但五月下旬入职到现在已经5个月了。给大家简单的share一下工作和生活。 在5月初光速毁约ks入…

《数据结构、算法与应用C++语言描述》使用C++语言实现数组队列

《数据结构、算法与应用C语言描述》使用C语言实现数组队列 定义 队列的定义 队列&#xff08;queue&#xff09;是一个线性表&#xff0c;其插入和删除操作分别在表的不同端进行。插入元素的那一端称为队尾&#xff08;back或rear&#xff09;&#xff0c;删除元素的那一端称…

在 Python 3 中释放 LightGBM 的力量:您的机器学习大师之路

机器学习是 Python 占据主导地位的领域,它一直在给全球各行各业带来革命性的变化。要在这个不断变化的环境中脱颖而出,掌握正确的工具是关键。LightGBM 就是这样一个工具,它是一个强大且快速的梯度提升框架。在这份综合指南中,我们将通过实际示例和示例数据集从基础知识到高…

保姆级阿里云ESC服务器安装nodejs或Linux安装nodejs

1. 创建node文件夹 默认 /opt 下边 /opt/node 也可建到其他地方&#xff0c;如/usr/local/node 等 创建后切换到文件夹下 cd /opt/node cd /opt/node2. 下载node并解压 使用命令下载node wget https://nodejs.org/dist/v18.12.0/node-v18.12.0-linux-x64.tar.xz wget https…

WebRTC janus安装编译教程

janus编译 系统 ubuntu 22.04 1.更新系统 apt-get update -y2.安装依赖 apt install libmicrohttpd-dev libjansson-dev \libssl-dev libsofia-sip-ua-dev libglib2.0-dev \libopus-dev libogg-dev libcurl4-openssl-dev liblua5.3-dev \libconfig-dev pkg-config libtool …

系列十二、Redis的主从复制

一、概述 主从复制架构仅仅用来解决数据的冗余备份&#xff0c;从节点仅仅用来同步数据。 二、架构图 三、搭建主从复制 3.1、准备三台机器并修改配置 # 准备三台机器并修改配置 说明&#xff1a;由于是个人笔记本&#xff0c;开启3个虚拟机比较消耗内存&#xff0c;所以使用…

快如闪电的扩容:秒级启动,弹性伸缩让您无忧

文章目录 快速扩容&#xff1a;秒级启动&#xff0c;弹性伸缩服务器秒级启动服务秒级启动升级JDK的版本通过将应用程序打包成WAR文件并部署到已经启动的Tomcat服务器上来实现秒级启动使用Spring Cloud Function和云原生技术来构建无服务器应用程序&#xff0c;可以实现秒级启动…

UniGUI 登录全屏 退出全屏(使浏览器全屏)

// 全屏 function fullScreen() { var element document.documentElement; if (element.requestFullscreen) { element.requestFullscreen(); } else if (element.msRequestFullscreen) { element.msRequestFullscreen(); } else if (element…

WPF ListView 鼠标点击,移动改变背景色不启作用

构建数据源 <Window.Resources><x:ArrayExtension x:Key"stringList"xmlns"clr-namespace:System;assemblymscorlib"Type"String"><String>第一行</String><String>第二行</String><String>第三行<…

封装hfex-icon的plugin

hfex-icon 的plugin配置 Install npm i hfex-icon-plugin -D使用 v1.0.2版本 vue.config.js const HfexIconPlugin require(hfex-icon-plugin) module.exports {configureWebpack:{plugins:[...HfexIconPlugin.plugins]} }v1.1.1版本 在v1.1.0版本中&#xff0c;重新使用…

《动手学深度学习 Pytorch版》 9.5 机器翻译与数据集

机器翻译&#xff08;machine translation&#xff09;指的是将序列从一种语言自动翻译成另一种语言&#xff0c;基于神经网络的方法通常被称为神经机器翻译&#xff08;neural machine translation&#xff09;。 import os import torch from d2l import torch as d2l9.5.1 …

云表|低代码开发崛起:重新定义企业级应用开发

低代码开发这个概念在近年来越来越受到人们的关注&#xff0c;市场对于低代码的需求也日益增长。据Gartner预测&#xff0c;到2025年&#xff0c;75&#xff05;的大型企业将使用至少四种低代码/无代码开发工具&#xff0c;用于IT应用开发和公民开发计划。 那么&#xff0c;为什…