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. jquery 图片轮换

    jquery 图片轮换 1.下载jquery.superslide.2.1.1.js (百度搜索) 2.下载Jquery-1.4.1.js(百度搜索下载) 准备工作好了,下面开始实现 3.html & ...

  2. 值得细细品读的URL资源

    Web安全渗透方面的资源指南: 知乎综合问答:https://www.zhihu.com/question/21914899 渗透测试经典演练系统:http://www.freebuf.com/sec ...

  3. 07_ddms透视图介绍

    通过ADB(Android Debug Bridge)安卓调试桥把你的Eclipse(集成开发环境)和你的设备连接在一起.有时候ADB可能会被其他的东西占用.例如WPS会跟你抢ADB(抢端口).如果你 ...

  4. Flask17 Flask_Script插件的使用

    1 什么是Flask_Script 可以对flask应用做一些统一的操作 flask_script官网:点击前往 2 安装flask_script pip install -i https://pyp ...

  5. Robot Framework 接口自动化介绍

    接口测试的重要性大家应该都清楚,就不多说了,本文中主要介绍接口测试如何在robot framework自动化测试框架中进行. 一.环境依赖 1.安装robot framework环境,本文中不做讲解 ...

  6. Ubuntu下crontab命令的用法

    cron是一个Linux下的后台进程,用来定期的执行一些任务.因为我用的是Ubuntu,所以这篇文章中的所有命令也只能保证在Ubuntu下有效,但其他系统应该也差不多. 想要让cron执行你指定的任务 ...

  7. Python实现R包brainwaver中的compute.FDR函数

    FDR(false discovery rate),是统计学中常见的一个名词,翻译为伪发现率,其意义为是 错误拒绝(拒绝真的(原)假设)的个数占所有被拒绝的原假设个数的比例的期望值. compute. ...

  8. python 学习笔记12(事件驱动、IO多路复用、异步IO)

    阻塞IO和非阻塞IO.同步IO和异步IO的区别 讨论背景:Linux环境下的network IO. 1.先决条件(几个重要概念) 1.1.用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32 ...

  9. Asp.Net 遍历 循环 显示所有COOKIS,SESSION,Applocation

    在C#中循环显示SESSIOn: Response.Write("<br>Session的所有值:<br>"); foreach (string obj i ...

  10. 使用mount命令挂载CDROM

    Linux显示所有的目录都在一个目录树下,而于他们位于哪一个驱动器/硬件无关.在Linux下的磁盘内容作为子目录形式出现的.可移动介质的内容不会自动出现在这些自目录的,我们必须通过挂载驱动器来实现. ...