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. Ajax前端调后台方法

    后台对当前页面类进行注册 Ajax.Utility.RegisterTypeForAjax(typeof(Login));//Login 当前类名 在方法上面加 [Ajax.AjaxMethod(Aj ...

  2. ABCD四个人说真话的概率都是1/3。假如A声称B否认C说D是说谎了,那么D说过的那句话真话的概率是多少

    ABCD四个人说真话的概率都是1/3.假如A声称B否认C说D是说谎了,那么D说过的那句话 真话的概率是多少 记"A声称B否认C说D说谎"为X,那么由贝叶斯公式,所求的 P(D真)P ...

  3. hive-0.12.0-cdh5.1.0安装

    先前条件: 要先安装好MYSQL 下载:hive-0.12.0-cdh5.1.0.tar.gz,并解压到安装目录 1. 添加环境变量 修改/etc/profile文件. #vi /etc/profil ...

  4. Entity Framework Code-First(11):Configure One-to-One

    Configure One-to-Zero-or-One Relationship: Here, we will configure One-to-Zero-or-One relationship b ...

  5. C# BackgroundWorker(异步线程)

    日期:2018年11月28日 环境:Windows 10,VS2015 前言  .NET 类库中提供了一个快捷使用多线程的帮助类BackgroundWorker,能够快速创建一个新的线程,并能报告进度 ...

  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. 图像的读取,显示与保存(基于skimage模块)

    一 skiamge模块 skimage包的全称是scikit-image SciKit (toolkit for SciPy) ,它对scipy.ndimage进行了扩展,提供了更多的图片处理功能.它 ...

  8. filter、map、reduce区别

    1.filter filter(function,sequence)-->list,tuple or string 1)       参数func是自定义的过滤函数,在函数func(item)中 ...

  9. ProtoBuf练习(一)

    基础数据类型 protobuf语言的基础字段类型相当于C++语言的基础类型 工程目录结构 $ ls proto/ TFixed.proto TInt.proto TScalar.proto TStr. ...

  10. unity 3d 之合并网格和贴图(combine mesh and texture)

    https://www.cnblogs.com/eangulee/p/3877824.html unity 3d 之合并网格和贴图(combine mesh and texture)   本人是个小白 ...