当前位置:网站首页>学习MVVM笔记(一)
学习MVVM笔记(一)
2022-07-05 04:06:00 【一禅-小和尚】
MVVM
model :数据层,包含数据实体和对数据实体的操作
View :界面层,对应Activity XML view 负责数据显示以及用户交互
ViewModel :关联层 将model 和view 进行绑定,model或者View 更改时,实时刷新对方
注意:
1.View只做和UI相关的工作,不涉及任何业务逻辑,不涉及操作数据,不处理数据。UI和数据严格的分开
2.ViewModel只做和业务逻辑相关的工作,不涉及任何和UI相关的操作,不持有控件引用,不更新UI。
DataBinding 是谷歌官方推荐的一个库,DataBinding 库来写声明的layouts文件,可以用最少的代码来绑定你的app逻辑和layouts文件 ,DataBinding是一个support库
(1)搭建环境
在app的build.gradle文件中添加
android {
.... dataBinding {
enabled = true } }
(2)编写layout文件
起始标签是layout,接下来是data元素一个view元素,这个view元素就是没有使用DataBinding的layout文件的根元素
在data内描述一个name的变量属性,使其可以在layout中使用,type为绑定的data对象
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.example.mvvmdemo.User" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_name"
android:text="@{user.mUserName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_age"
android:text='@{
user.mUserage + ""}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</layout>
data对象:
package com.example.mvvmdemo;
public class User {
public final String mUserName;
public final int mUserage;
public User(String userName, int userAge) {
this.mUserName = userName;
mUserage = userAge;
}
}
(3)Binding数据
默认情况下,一个Binding类会基于layout文件的名称而产生,将其转换成(首字母大写的命名规范,并加Binding后缀) ,上述的layout文件是activity_main.xml ,因此生成的类名是ActivityMainBinding。此类包含从layout属性到layout的views中的所有bindings(包括user变量) ,而且还知道怎么给Binding表达式分配值,创建bindings的最简单的inflating(layout文件和Activity/Fragment的链接)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
User user = new User("haha" , 22);
binding.setUser(user);
}
}
**如果在ListView 或者RecyclerView adapter使用DataBinding时,会使用
**
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false); //or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
还需要注意的是:如果将User类中的变量改成私有的会报错的。
Found data binding errors. ****/ data binding error ****msg:Could not find accessor demo.com.databindingdemo.User.mUserName
(4)事件处理
数据绑定允许编写表达式来处理view分派的事件,事件属性名字取决于监听器方法名字。
public class MyHandler {
public void myOnClick(View view){
Toast.makeText(view.getContext(),"hello",Toast.LENGTH_SHORT).show();
}
public boolean myOnLongClick(View view){
Toast.makeText(view.getContext(),"hello world",Toast.LENGTH_SHORT).show();
return true;
}
}
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="handlers" type="com.heyy.databingexample.MyHandler"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测试事件绑定"
android:onClick="@{handlers::myOnClick}"
android:onLongClick="@{handlers::myOnLongClick}"/>
</LinearLayout>
</layout>
(5)深入DataBinding用法
import :零个或者多个import元素可能在data元素中使用,这些只用在你的layout文件中添加引用
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.example.mvvmdemo.User" />
<import type="android.view.View"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_name"
android:text="@{user.mUserName}"
android:visibility="@{user.mUserage == 22 ? View.VISIBLE : View.GONE}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_age"
android:text='@{
user.mUserage + ""}'/>
当类名有冲突时,可以使用alias重新命名
<import type="android.view.View"
alias="test"/>
android:visibility="@{user.mUserage == 22 ? test.VISIBLE : test.GONE}"
导入的类型还可以在表达式中使用static属性和用法
public class StringUtls {
public static String translateStr(String str){
return str+"haha";
}
}
<import type="com.example.mvvmdemo.StringUtls"/>
android:text="@{StringUtls.translateStr(user.mUserName)}"
(6)Data对象
DataBinging 允许我们创建可观察的对象,字段和集合,当我们数据发生改变时,要通知其他的对象就可以使用DataBinding
Observable对象
实现android.databinding.Observable接口的类可以允许附加一个监听器到Bound对象,以便监听对象上的所有属性的变化。
一个BaseObervabke的基类为实现监听器注册机制而创建。
public void setmUserName(String mUserName) {
this.mUserName = mUserName;
notifyPropertyChanged(BR.user);
}
Observable 集合
Oberservable集合允许控件访问这些data对象,ObservableArraMap 用于键是引用类型,如string
ObservableArrayMap<String, Object> user = new ObservableArrayMap<>(); user.put("name", "Jack"); user.put("age", 17);
<data>
<import type="android.databinding.ObservableMap"/>
<variable name="user" type="ObservableMap<String, Object>"/> </data>
<TextView
android:text='@{
user["name"]}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text='@{
String.valueOf(1 + (Integer)user["age"])}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
Observable 字段
ObservableFields是包含具有单个字段的Observable对象。
<data>
<variable
name="itemViewModel"
type="com.autoai.project.home.viewmodel.AppItemViewModel" />
</data>
使用
android:text="@{itemViewModel.appTitle}"
类
public class AppItemViewModel {
public ObservableField<String> appTitle = new ObservableField<>();
}
边栏推荐
- Why can't all browsers on my computer open web pages
- Threejs Internet of things, 3D visualization of factory
- 阿里云ECS使用cloudfs4oss挂载OSS
- Laravel8 export excel file
- 快手、抖音、视频号交战内容付费
- 【看完就懂系列】一文6000字教你从0到1实现接口自动化
- 小程序中实现文章的关注功能
- Threejs realizes rain, snow, overcast, sunny, flame
- ABP vNext microservice architecture detailed tutorial - distributed permission framework (Part 1)
- Basic function learning 02
猜你喜欢
mysql的七种join连接查询
面试字节,过关斩将直接干到 3 面,结果找了个架构师来吊打我?
Official announcement! The third cloud native programming challenge is officially launched!
Longyuan war "epidemic" 2021 network security competition web easyjaba
Is there a sudden failure on the line? How to make emergency diagnosis, troubleshooting and recovery
Online text line fixed length fill tool
Uni app change the default component style
NEW:Devart dotConnect ADO.NET
EasyCVR平台出现WebRTC协议视频播放不了是什么原因?
[C language] address book - dynamic and static implementation
随机推荐
在线SQL转Excel(xls/xlsx)工具
MindFusion. Virtual Keyboard for WPF
测试开发是什么?为什么现在那么多公司都要招聘测试开发?
ActiveReportsJS 3.1 VS ActiveReportsJS 3.0
Summary of scene design
The development of mobile IM based on TCP still needs to keep the heartbeat alive
provide/inject
provide/inject
C语言课设:影院售票管理系统
How is the entered query SQL statement executed?
Pyqt5 displays file names and pictures
Deep learning - LSTM Foundation
Use threejs to create geometry and add materials, lights, shadows, animations, and axes
Threejs Internet of things, 3D visualization of farms (I)
Web components series (VII) -- life cycle of custom components
Interview summary: This is a comprehensive & detailed Android interview guide
Threejs clicks the scene object to obtain object information, and threejs uses raycaster to pick up object information
Threejs realizes rain, snow, overcast, sunny, flame
Open graph protocol
10种寻址方式之间的区别