MVVM中的Model
我们可以用任何POJO 作为 data binding 的 Model,
但是直接修改POJO对象,不能直接更新UI
android的 dataBinding 模块 给提供了通知机制,有3中类型的通知机制,分别对应于
类(Observable),
字段(ObservableField),
集合类型(Observable Collections)
dataBinding模块 的机制 ,是 通知 模式
有3中类型的通知机制
类 (Observable)
字段(ObservalbeField)类型
集合(Observable Collections)
把这些observable 对象绑定到 View 后,当 observable 对象更新后UI会自动更新,是因为observable对象绑定到了view
observable 对象 更新后 -->UI会自动更新 ,同时,observable 对象是和view绑定一起的。
======================================================
Observalbe objects 用法
我们需要把 POJO 继承自 BaseObservable ,才能通过 通知UI的能力
private static class User extends BaseObservable{
private String firstName;
private String lastName;
@Bindabel // Bindable标签在编译时会自动生成类 BR,
// 但是Model中的数据发生改变时候,我们在Set方法中调用 notifyPropertyChanged 会通知UI更新。
public String getFirstName(){
return this.firstName;
}
@Bindable
public String getLastName(){
return this.lastName
}
public void setFirstName(String firstName){
this.firsName = firstName;
notifyPropertyChanged(BR.firstName);
}
public void setLastName(String lastName){
this.lastName = lastName;
notifyPropertyChanged(BR.lastName);
}
}
======================================================
ObservableFields用法
创建支持Observable的POJO类,还是有些麻烦
ObservableFields可以简化我们的POJO对象:
private static class User extends BaseObservable{
public final ObservableField<String> firstName = new ObservableField<>();
public final ObservableField<String> lastName = new ObservableField<>();
public final ObservableInt age = new ObservableInt();
}
可以通过一下方式访问 和 修改字段值
user.firsName.set("Google");
int age = user.age.get();
对应基础数据类型有 ObaservableInt ,ObservableFloat,ObservableBoolean 等可以使用
===============================================================
Observable Collections 用法
DataBinding中提供了一些支持通知机制的集合类型,比如 ObservableArrayList,ObservableArrayMap.
ObservableArrayMap的使用跟Map一样
ObservableArrayMap<String,Object> user= new ObservableArrayMap<>();
user.put("firstName","Google");
user.put("lastName","Inc.");
user.put("age",17);
在Layout中使用ObservableArrayMap中的数据
<data>
<import type="android.databinding.ObservableMap"/>
<variable name ="user" type ="ObservableMap<String ,Object>"/>
</data>
...
<TextView
android:text ="@{user["lastName"]}"
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"
/>
==========================================================================
MVVM中的ViewModel
android 中的ViewModel是自动生成的Binding类(继承自android.databinding.ViewDataBinding)
创建Binding对象
我们一般使用Binding对象的静态方法创建Binding对象:
MyLayoutBinding binding = MyLayoutBinding.inflate(laoutInflater);
MyLayoutBinding bingding = MyLayoutBinding.inflate(LayoutInflater,viewGroup,false);
有时候,我们需要使用DataBingdingUtil创建Binding对象
ViewDataBinging binding = DataBindingUtil.inflate(LayoutInflater,layoutId,parent,attachToParent);
ViewDataBinding binding = DataBindingUtil.bindTo(viewRott,layoutId);
设置View的id
使用DataBingding以后,我们一般不需要设置View的id,但是我们有时候也会需要的,设置id后,
ViewDataBinding类会自动生成对应的字段,比如:
<layout xmlns:android ="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.User" />
</data>
<LinearLayout
android :orientation ="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text ="@{user.firstName}"
android:id="@id/firstName"
/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"
android:id="@+id/lastName"/>
/LinearLayout>
对应的id会自动生成
public final TextView firstName;
public final TextView lastName;
========================================================
Variables
在layout中data区域定义的变量,或自动在Binding类中生成的get/set方法
<data>
<import type="android.graphics.drawable.Drawable" />
<variable name ="user" type="com.example.User" />
<variable name="image" type="Drawable" />
<variable name="note" type="String"/>
</data>
生成的方法如下
public abstract com.example.User getUser();
public abstract Drawable getImage();
public abstract void setImage(Drawable image);
public abstract String getNote();
public abstract void setNote(String note);
=====================================================================
Dynamic Variables
我们无法知道确切的binding类,比如RecyclerView Adapter可以使用任意的layout.
所以我们的binding类需要动态生成。
我们需要在onBindViewHolder方法中给变量赋值,比如我们的layout中声明了一个item变量,
我们通过BindingHolder的getBinding返回一个binding对象,调用setVariable方法给item变量赋值
public void onBindViewHolder(BindingHolder holder,int position){
final T item = mItems.get(position);
holder.getBinding().setVariable(BR.item,item);
holder.getBinding().executePendingBindings();
}
binding 对象需要在onCreateViewHolder中创建
ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()),R.layout.list_item,viewGroup,flase);
BindingHolder holder = new BindingHolder(binding.getRoot());
holder.setBinding(binding);
Holder: 持有人
inflate ;膨胀
Observable:可观察量
- DataBinding初探 数据绑定的用法 ,import 集合类型,绑定的表达式,访问集合类型2
数据绑定的用法 import语法 <data> <import type="android.view.view"/> </data> 如 ...
- jface databinding:部分实现POJO对象的监测
在前一篇博文<jface databinding/PojoBindable实现对POJO对象的支持 >中,已经知道直接对POJO对象进行修改,是不能被绑定的UI组件知道的,在上一篇文章中 ...
- 手把手带你走进MVP +Dagger2 + DataBinding+ Rxjava+Retrofit 的世界
0.0 Android开发现在的变化用一个词来形容就是 :翻天覆地 越来越多的项目使用了MVP + Rxjava+Retrofit +Dagger2 + DataBinding等等东西.. 但是这些东 ...
- 1. DataBinding - offical tutorial
1. DataBinding - offical tutorial android DataBinding tutorial 构建环境 数据与布局文件的绑定 data binding 表达式 数据对象 ...
- MVVM技术 - 的实现 @{}来进行 调用那个 DataBinding方法
new Material Design 支持哭 还有 Data Binding 结束 使用DataBindign 结束 我们很方面的实现 MVVM设计模式 什么是MVVM model 呢. ...
- ViewModel、LiveData、DataBinding
ViewModel ViewModel的引入 如果系统销毁或重新创建界面控制器,则存储在其中的任何临时性界面相关数据都会丢失.例如,应用的某个 Activity 中可能包含用户列表.因配置更改而重新创 ...
- 【Android Jetpack高手日志】DataBinding 从入门到精通
前言 DataBinding 数据绑定库是 Android Jetpack 的一部分,借助该库可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源.我个人觉得,使用 DataBin ...
- C# Web应用调试开启外部访问
在用C#开发Web应用时有个痛点,就是本机用VS开启Web应用调试时外部机器无法访问此Web应用.这里将会介绍如何通过设置允许局域网和外网机器访问本机的Web应用. 目录 1. 设置内网访问 2. 设 ...
- 图片访问实时处理的实现(nodejs和php)
我在访问时光网.网易云音乐等网站时,发现将它们页面中的一些图片URL修改一下就可以得到不同尺寸的图片,于是思考了其实现方案,我的思路是:URL Rewrite + 实时处理 + 缓存,对用户请求的UR ...
随机推荐
- [poj3259]Wormholes(spfa判负环)
题意:有向图判负环. 解题关键:spfa算法+hash判负圈. spfa判断负环:若一个点入队次数大于节点数,则存在负环. 两点间如果有最短路,那么每个结点最多经过一次,这条路不超过$n-1$条边. ...
- 9、samtool view
参考:https://www.sogou.com/link?url=DOb0bgH2eKh1ibpaMGjuy6YnbQPc3cuKbWqIy1k6SBFomuBEhdSpHkUUZED5fr2OTk ...
- Django 的认证系统
Django自带的用户认证 auth 模块 from django.contrib import autu django.contrib.auth 中提供了许多方法, 这里主要介绍其中三个: auth ...
- HTML5与CSS3实例教程(第2版) 附源码 中文pdf扫描版
HTML5和CSS3技术是目前整个网页的基础.<HTML5与CSS3实例教程(第2版)>共分3部分,集中讨论了HTML5和CSS3规范及其技术的使用方法.这一版全面讲解了最新的HTML5和 ...
- Window Live Writer在Win7下安装提示错误“OnCatalogResult:0x80190194”
1.在C:\Users\All Users\Microsoft\WLSetup\Logs下(All Users默认是隐藏文件夹),有两个Window Live的安装日记记录文件,打开第一个找到ERRO ...
- C# Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
一.问题描述 在做C# 的 Guid 转换时,出现这个问题:Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-x ...
- Note: ENDBOX: Scalable Middlebox Functions Using Client-Side Trusted Execution
ENDBOX enable secure networking by client-Side trusted execution. What ENDBOX is a scalable middlebo ...
- Python中配置文件解析模块-ConfigParser
Python中有ConfigParser类,可以很方便的从配置文件中读取数据(如DB的配置,路径的配置).配置文件的格式是: []包含的叫section, section 下有option=value ...
- 2017-10-23 NOIP模拟赛
叉叉 题目描述 现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现的和四次出现的字母a连一条线,第五次出现的和六次出现的字母a连一条线.. ...
- bzoj3681: Arietta(网络流)
传送门 主席树优化建图? 然而我连代码都看不懂 贴个题解好了->这里 //minamoto #include<iostream> #include<cstdio> #in ...