DataBinding 访问 3

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:可观察量

时间: 2025-01-14 00:32:53

DataBinding 访问 3的相关文章

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

数据绑定的用法 import语法 <data> <import type="android.view.view"/> </data> 如果类名相同,可以启用别名 <import type="android.view.view" /> <import type ="com.example.real.estate.View" alias="Vista" /> import

Android官方数据绑定框架DataBinding

一.Data Binding是什么? 2015年的Google IO大会上,Android 团队发布了一个数据绑定框架(Data Binding Library),官方原生支持 MVVM 模型.以后可以直接在 layout 布局 xml 文件中绑定数据了,无需再 findViewById 然后手工设置数据了.其语法和使用方式和 JSP 中的 EL 表达式非常类似. Data Binding Library 是一个 support 库,支持 Android 2.1+ 版本 (API level 7

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

0.0 Android开发现在的变化用一个词来形容就是 :翻天覆地 越来越多的项目使用了MVP + Rxjava+Retrofit +Dagger2 + DataBinding等等东西.. 但是这些东西对于木有用过的同学们开起来还是比较头疼的. 转载请标明出处:http://blog.csdn.net/wingichoy/article/details/51981756 网上有很多介绍他们的教程,但是都比较详细(我听到有童鞋问:详细还不好?? 其实他们最好的学习方式还是边敲边踩坑边学,一下介绍的

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

new Material Design 支持哭 还有 Data Binding 结束 使用DataBindign 结束 我们很方面的实现 MVVM设计模式 什么是MVVM model 呢. MVVM 是 Model - View - ViewModel 的简称 View 负责显示,ViewModel 跟Model 和view 进行双向绑定:当View 有用户输入后,ViewModel 通知Model 更新数据,同时处理Model 数据更新后,ViewModel 通知View更新 也就是说View

使用AXIS2为Client访问WebService

使用AXIS2,可以方便的构建WebService的服务器端,也可以很方便的作为Cilent,来访问别的WebService. 下面根据工作中的经历,整理了一下,作为Cilent访问WebService的要点. 根据Axis2的官方文档,Client的DataBinding方式有3种,最简单的好像是ADB,那么我就选用的ADB. 1.普通方式(http 不通过proxy,对方也没有利用SSL) // Generate Client RPCServiceClient serviceClient =

ViewModel、LiveData、DataBinding

ViewModel ViewModel的引入 如果系统销毁或重新创建界面控制器,则存储在其中的任何临时性界面相关数据都会丢失.例如,应用的某个 Activity 中可能包含用户列表.因配置更改而重新创建 Activity 后,新 Activity 必须重新提取用户列表.对于简单的数据,Activity 可以使用 onSaveInstanceState() 方法从 onCreate() 中的捆绑包恢复其数据,但此方法仅适合可以序列化再反序列化的少量数据,而不适合数量可能较大的数据,如用户列表或位图

2.24 AndroidViewModel 让ViewModel 访问全局资源

本次的示例是一个简单的加减法程序: 当程序被关闭后,在开启之后会读取之前的数据,载入程序当中.数据不会丢失(主要使用AndroidViewModel) AndroidViewModel 是ViewModel的一个子类,可以直接调用getApplication(),由此来访问应用的全局资源 public class MyViewModel extends AndroidViewModel {   直接继承自AndroidViewModel然后在 MyViewModel 这个类中,可以直接用 get

Sqlserver通过链接服务器访问Oracle的解决办法

转自http://blog.sina.com.cn/s/blog_614b6f210100t80r.html 一.创建sqlserver链接服务(sqlserver链接oracle)  首先sqlserver 链接oracle可以通过两个访问接口: “MSDAORA” 和“OraOLEDB.Oracle” 1.“MSDAORA”访问接口是由Microsoft OLE DB Provider for Oracle提供的,这里建议不使用此接口进行链接.通过该访问接口建立的链接服务器在进行查询orac

phpstudy无法访问主页,提示You don&#39;t have permission to access / on this server解决办法

1.输入localhost提示:You don't have permission to access / on this server. 新版phpStudy为了安全,取消Apache和nginx列出目录内容. phpStudy如何禁止或允许站点目录列表 请使用『其他选项菜单』-『phpStudy设置』-『允许目录列表』,打上对勾表示允许目录列表,去掉对勾表示禁止目录列表. 2.配置多域名的虚拟主机总是失败,提示You don't have permission to access / on