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 访问 3的更多相关文章

  1. DataBinding初探 数据绑定的用法 ,import 集合类型,绑定的表达式,访问集合类型2

    数据绑定的用法 import语法   <data> <import type="android.view.view"/> </data>   如 ...

  2. jface databinding:部分实现POJO对象的监测

    在前一篇博文<jface databinding/PojoBindable实现对POJO对象的支持  >中,已经知道直接对POJO对象进行修改,是不能被绑定的UI组件知道的,在上一篇文章中 ...

  3. 手把手带你走进MVP +Dagger2 + DataBinding+ Rxjava+Retrofit 的世界

    0.0 Android开发现在的变化用一个词来形容就是 :翻天覆地 越来越多的项目使用了MVP + Rxjava+Retrofit +Dagger2 + DataBinding等等东西.. 但是这些东 ...

  4. 1. DataBinding - offical tutorial

    1. DataBinding - offical tutorial android DataBinding tutorial 构建环境 数据与布局文件的绑定 data binding 表达式 数据对象 ...

  5. MVVM技术 - 的实现 @{}来进行 调用那个 DataBinding方法

    new Material Design 支持哭 还有 Data Binding 结束   使用DataBindign 结束 我们很方面的实现 MVVM设计模式   什么是MVVM model 呢.   ...

  6. ViewModel、LiveData、DataBinding

    ViewModel ViewModel的引入 如果系统销毁或重新创建界面控制器,则存储在其中的任何临时性界面相关数据都会丢失.例如,应用的某个 Activity 中可能包含用户列表.因配置更改而重新创 ...

  7. 【Android Jetpack高手日志】DataBinding 从入门到精通

    前言 DataBinding 数据绑定库是 Android Jetpack 的一部分,借助该库可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源.我个人觉得,使用 DataBin ...

  8. C# Web应用调试开启外部访问

    在用C#开发Web应用时有个痛点,就是本机用VS开启Web应用调试时外部机器无法访问此Web应用.这里将会介绍如何通过设置允许局域网和外网机器访问本机的Web应用. 目录 1. 设置内网访问 2. 设 ...

  9. 图片访问实时处理的实现(nodejs和php)

    我在访问时光网.网易云音乐等网站时,发现将它们页面中的一些图片URL修改一下就可以得到不同尺寸的图片,于是思考了其实现方案,我的思路是:URL Rewrite + 实时处理 + 缓存,对用户请求的UR ...

随机推荐

  1. [poj3259]Wormholes(spfa判负环)

    题意:有向图判负环. 解题关键:spfa算法+hash判负圈. spfa判断负环:若一个点入队次数大于节点数,则存在负环.  两点间如果有最短路,那么每个结点最多经过一次,这条路不超过$n-1$条边. ...

  2. 9、samtool view

    参考:https://www.sogou.com/link?url=DOb0bgH2eKh1ibpaMGjuy6YnbQPc3cuKbWqIy1k6SBFomuBEhdSpHkUUZED5fr2OTk ...

  3. Django 的认证系统

    Django自带的用户认证 auth 模块 from django.contrib import autu django.contrib.auth 中提供了许多方法, 这里主要介绍其中三个: auth ...

  4. HTML5与CSS3实例教程(第2版) 附源码 中文pdf扫描版

    HTML5和CSS3技术是目前整个网页的基础.<HTML5与CSS3实例教程(第2版)>共分3部分,集中讨论了HTML5和CSS3规范及其技术的使用方法.这一版全面讲解了最新的HTML5和 ...

  5. Window Live Writer在Win7下安装提示错误“OnCatalogResult:0x80190194”

    1.在C:\Users\All Users\Microsoft\WLSetup\Logs下(All Users默认是隐藏文件夹),有两个Window Live的安装日记记录文件,打开第一个找到ERRO ...

  6. 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 ...

  7. 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 ...

  8. Python中配置文件解析模块-ConfigParser

    Python中有ConfigParser类,可以很方便的从配置文件中读取数据(如DB的配置,路径的配置).配置文件的格式是: []包含的叫section, section 下有option=value ...

  9. 2017-10-23 NOIP模拟赛

    叉叉 题目描述 现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现的和四次出现的字母a连一条线,第五次出现的和六次出现的字母a连一条线.. ...

  10. bzoj3681: Arietta(网络流)

    传送门 主席树优化建图? 然而我连代码都看不懂 贴个题解好了->这里 //minamoto #include<iostream> #include<cstdio> #in ...