type=“com.lihang.databindinglover.User”/>

Activity里的使用都是非常简单的,如果有不明白,稍后放出链接。

这里还有特殊功能,比如我们再布局预览页面。通常会使用 **tools:text=“中间的”**来预览布局,这个时候可以通过

使用default的时候,即使是studio3.5里,也不提示,不过不影响。还有一点,在DataBinding里,已经处理了null。所以这个时候你在Activity里给user设置为null。也不会崩溃

二、DataBinding在Fragment和RecyclerView里的使用

在Fragment的使用和Activity里的使用一样。获取根目录的方式如下。

//注意获取根布局是
View view = activityAlisBinding.getRoot();

这里重点介绍下再recyclerView里的用法。我们以前是不是写ViewHolder写的烦了?用上了DataBinding后,这么告诉你一个ViewHolder就能搞定一切需要的ViewHolder

先看下我们的唯一的ViewHolder。首先提下,自动生成的Binding的父类都是ViewDataBinding。我是把ViewHolder单独拉出来了。这样大家都能用:

public class NewViewHolder extends RecyclerView.ViewHolder {
public ViewDataBinding binding;

public NewViewHolder(ViewDataBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
}

在Adapter里只需要职业

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
ItemNewOrderBinding binding = DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), R.layout.item_new_order, viewGroup, false);
return new NewViewHolder(binding);
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
NewViewHolder newViewHolder = (NewViewHolder) viewHolder;
//如果是多布局,那么对binding进行一个 instansof的一个判断就好。这样我们的ViewHolder永远只需要一个
ItemNewOrderBinding binding = (ItemNewOrderBinding) newViewHolder.binding;
binding.txtName.setText(“这样就能使用了!!”);
}

三、单向数据绑定

单向绑定可以理解为,改变了bean对象里的数据,就会自动改变我们xml的显示。这里涉及到3个类: BaseObservable、ObservableField、ObservableCollection。看这个名字就知道有点类似观察者模式

3.1、BaseObservable

首先我们定义个以Dog类

public class Dog extends BaseObservable {

//如果是public修饰的,直接用@Bindable
@Bindable
public String name;
//如果是private修饰的,则在get方法使用@Bindable
private String color;

public void setDataOnlyName(String name, String color) {
this.name = name;
this.color = color;
//只刷name字段
notifyPropertyChanged(com.lihang.databindinglover.BR.name);
}

public void setDataAll(String name, String color) {
this.name = name;
this.color = color;
//刷新全部字段
notifyChange();
}
…//省略部分代码
}

这里我同事改变了name和color的颜色,说明

  • bean对象需要继承 BaseObservable
  • @Bindable 标注用来表示哪个字段需要单向绑定。public修饰的可以直接用@Bindable绑定。private修饰的需要在get()方法上用@Bindable标注
  • notifyChange();刷新所有字段,notifyPropertyChanged(com.lihang.databindinglover.BR.name);刷新单个字段。注意这里说的刷新全是被@Bindable绑定的。如果BR.name出不来。建议build下项目
  • 还有不明白的可以在末尾链接demo看:单向数据绑定 – BaseObservable.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RJp53fcU-1638161226426)(https://user-gold-cdn.xitu.io/2019/9/26/16d6b8c92e5b5e33?imageslim)]

继承了BaseObservable的bean对象,还可以监听刷新了哪

dog.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
@Override
public void onPropertyChanged(Observable sender, int propertyId) {
if (propertyId == com.lihang.databindinglover.BR.name) {
Log.e(“看看刷新了哪”, “刷新了name”);
} else if (propertyId == com.lihang.databindinglover.BR._all) {
Log.e(“看看刷新了哪”, “全部全部”);
} else {
Log.e(“看看刷新了哪”, “未知错误~”);
}
}
});

3.2、ObservableField

其实这个ObservableField就是对BaseObservable的简化,不用继承,不用主动调刷新代码。
这个时候我们顶一个Human类

public class Human {
//这里必须是常量,ObservableField<参数类型>
//其实写上了下面一句,就是BaseObservable,set,get, @Bindable,刷新都封装了。直接看构造方法
public final ObservableField name = new ObservableField<>();
//其中也封装了基本数据类型:ObservableInt等
public final ObservableInt age = new ObservableInt();

public Human(String name,int age){
this.name.set(name);
this.age.set(age);
}

}

Activity和xml里的操作和之前的一样,改变数据,自动改变xml只需要:

//简直太方便了吧
human.name.set(“玉玑子”);
human.age.set(15);

3.3、ObservableCollection

一看就是集合,这里和我们常用的 List Map一样。只不过这里的ObservableList、ObservableMap是封装好的。当我们改变集合里的数据时。xml也会改变。唯一要注意的是,在xml里引用这些集合的时候<类型>,这些符号,会影响xml格式所以要转义。用< 代表<;用&gt代表>(这些转义符,同样支持Mark Down);想了解更多可自行百度 DataBinding转义符。

这里遇到一个坑,就是你的default = “默认值” 这个默认值最好不是data里的引用。不然会报错哦。这里我们带入index = 0 带入,把key = name。代入,然后动态改变,集合里这2个值:

@Override
public void onClick(View v) {
int randowInt = new Random().nextInt(100);
switch (v.getId()){
case R.id.btn_index:
//改变list的第一项
list.add(0,“list的值” + randowInt);
break;
case R.id.btn_key:
map.put(“name”,“map的值” + randowInt);
break;
}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ec7QcQyL-1638161226457)(https://user-gold-cdn.xitu.io/2019/9/26/16d6c70ee17e1648?imageslim)]

四、双向数据绑定

意思就是你改变bean对象里的值,他会主动改变xml的显示,改变xml的里的值,他会把bean对象里的属性改变了。 这里我们用1个TextView显示数据;用1个EditTextView绑定bean对象,再用1个Button可以动态查询bean对象里的属性值

bean对象绑定xml显示:单向绑定是@{属性值},双向绑定则是@={属性值},效果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zOouDFcM-1638161226458)(https://user-gold-cdn.xitu.io/2019/9/27/16d71eb112bf0b8d?imageslim)]

五、在include 和 viewStub中使用

5.1 在include中使用。

include的布局如下:

<LinearLayout
android:layout_width=“match_parent”
an

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

droid:layout_height=“match_parent”
android:orientation=“vertical”>

Activity里引用include这样:

注意:app:user="@{user}"。第一个user是include里name的引用。第二user是当前传入的值。

5.2、viewStub中的使用

简单介绍下viewStub:被viewStub包裹的。即使页面显示的时候,被包裹的布局也不会加载,除非调用inflate。这样算是对布局卡顿的优化了。include则算是代码里的布局优化。

直接放Activity布局了。被包裹的布局和上面的include一样

activity里:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_viewstub);
binding = DataBindingUtil.setContentView(this, R.layout.activity_viewstub);
User user = new User(“我爱学习”, 18);
binding.viewStub.getViewStub().inflate();
binding.setUser(user);
}

六、@BindingAdapter的使用。

这里比较重要的用法是,当我们的imageView需要加载网络url时,假如用的是glide去加载,这个时候就需要使用@BindingAdapter。 这个需要一个辅助类:new一个辅助类后,xml里就可以使用了。有点像Dagger2

public class DataBindingHelper {
//用@BindingAdapter标注,有点类似自定义属性,后面是属性名,方法体类似得到属性值后去做的事情。
//第一个参数:是当前的控件类型,其实也可以写成View,但是要加载还是要判断是否是imageView
//第二个参数:是网络加载的url。
@BindingAdapter(“imageWithGlide”)
public static void loadImage(ImageView imageView, String url) {
Glide.with(imageView).load(url)
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.ic_launcher)
.transition(withCrossFade())
.centerCrop()
.into(imageView);
}

//@BindingAdapter还能修改系统属性值,这是修改textView的属性,意思只要使用DataBinding给textView设置setText值的,
//都会加上后面这段 " - 我是通过方法加的"
//我这里先注释掉了。不然整个项目的textView都会加上整个,如果要测试,可以打开
//@BindingAdapter(“android:text”)
//public static void setText(TextView textView, String testStr) {
// textView.setText(testStr + " - 我是通过方法加的");
//}
}

我们的xml就是专业:

activity里就是设置imageUrl和testStr的值。太简单就不写了。

七、DataBinding布局里支持的语法

支持的语法:

  • 算术 + - / * %
  • 字符串合并 +
  • 逻辑 && ||
  • 二元 & | ^
  • 一元 + - ! ~
  • 移位 >> >>> <<
  • 比较 == > < >= <=
  • Instanceof
  • Grouping ()
  • character, String, numeric, null
  • Cast
  • 方法调用
  • Field 访问
  • Array 访问 []
  • 三元 ?:

不支持的语法:

  • this
  • super
  • new
  • 显示泛型调用
    rue"
    app:imageWithGlide="@{imageUrl}" />

activity里就是设置imageUrl和testStr的值。太简单就不写了。

七、DataBinding布局里支持的语法

支持的语法:

  • 算术 + - / * %
  • 字符串合并 +
  • 逻辑 && ||
  • 二元 & | ^
  • 一元 + - ! ~
  • 移位 >> >>> <<
  • 比较 == > < >= <=
  • Instanceof
  • Grouping ()
  • character, String, numeric, null
  • Cast
  • 方法调用
  • Field 访问
  • Array 访问 []
  • 三元 ?:

不支持的语法:

  • this
  • super
  • new
  • 显示泛型调用

Android从零开始搭建MVVM架构(1),企业级项目实战讲解相关推荐

  1. Android从零开始搭建MVVM架构(1)————DataBinding

    在真正接触并使用MVVM架构的时候,整个人都不好了.因为个人觉得,MVVM相对于MVC.MVP学习难度比较大,设计的知识点不是一点半点.所以想慢慢记录下自己的成长.如有错误希望指正. 从零开始搭建MV ...

  2. Android从零开始搭建MVVM架构(1)

    **<Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义>无偿开源 徽信搜索公众号[编程进阶路]** 那么在Activity设置数据和设置点击事件(意思设置了 ...

  3. Android从零开始搭建MVVM架构(1),kotlin扩展函数原理

    使用default的时候,即使是studio3.5里,也不提示,不过不影响.还有一点,在DataBinding里,已经处理了null.所以这个时候你在Activity里给user设置为null.也不会 ...

  4. Android从零开始搭建MVVM架构(3)——ViewModel

    ViewModel类是被设计用来以可感知生命周期的方式存储和管理 UI 相关数据,ViewModel中数据会一直存活即使 activity configuration发生变化. ViewModel有什 ...

  5. Android从零开始搭建MVVM架构(4,android面试基础题记不住

    前言 九月裸辞从长沙跑到上海,跑了一个月的面试,本月中旬终于拿到了爱奇艺的高级工程师offer. 做Android开发整4年有余,但是这一年才是最充实的,我花一年时间努力,送给了自己一个完美的蜕变! ...

  6. 企业级项目实战讲解!javamap排序规则

    一.服务发布简介 分布式系统架构下,服务发布是一件很麻烦的事情,特别是在构建自动发布流程和灰度测试的策略两个核心方面.通常情况下如果不涉及数据层面的灰度流程,服务可以灰度上线,或者滚动上线,这两种方式 ...

  7. 企业级项目实战讲解!java类内部定义枚举

    蚂蚁一面 ⼀⾯就做了⼀道算法题,要求两⼩时内完成,给了⻓度为N的有重复元素的数组,要求输出第10⼤的数.典型的TopK问题,快排算法搞定.算法题要注意的是合法性校验.边界条件以及异常的处理.另外,如果 ...

  8. 企业级项目实战讲解!java的war包能直接改名么

    Java核心架构笔记大致如下 0~1年: Java基础(基本语法.面向对象.继承.多态.接口和抽象类.异常.内部类.集合.泛型.反射.I/O等) Web编程(Servlet+MySQL数据库+商品管理 ...

  9. 企业级项目实战讲解!我凭借这份PDF的复习思路,薪资翻倍

    前言 今年的金三银四已经过去一大半了,在这其中参与过不少面试,2021都说工作不好找,这也是对开发人员的要求变向的提高了. 之前在Github上收获15K+star的Java核心神技(这参数,质量多高 ...

最新文章

  1. 2022-2028年中国毛纺行业研究及前瞻分析报告
  2. bash shell命令(2)
  3. 浅析机器学习中的自由度
  4. jenkins页面中英文切换配置
  5. 《python核心编程第二版》第5章习题
  6. 主流浏览器和内核及Web标准
  7. UML的奥妙 - 学习UML笔记(1)
  8. java项目功能详情介绍,JAVAEE—spring的详细介绍
  9. Fellow观点:AI框架下的医疗影像教学
  10. oracle的汇总模板,Oracle EBS汇总模板建立问题处理
  11. js web端扫码枪对接
  12. css配色大全和色彩原理
  13. Backtrader量化回测8——手续费
  14. traceroute 详解及结果出现*的分析
  15. Cubieboard2折腾手记(一)
  16. 数字证书与数字签名(图文并茂)详解
  17. 用计算机弹c哩c哩数字,C哩C哩 - 在线打字测试(dazi.kukuw.com)
  18. 丙烯酰胺php泥浆,大桥钻孔灌注桩清孔施工方法
  19. 云时代阿里服务器的演进与展望
  20. Vs2017 窗口移动vs直接卡死

热门文章

  1. auto实现自动刷快手极速版金币功能
  2. phpword 模板替换并导出教程
  3. html5点击复制文本框内容,js实现点击按钮复制文本功能
  4. 服务器安全主要包括哪些?
  5. python paramiko_Python2.7 paramiko模块
  6. 只用十几行python代码向靓仔打招呼?这不分分钟~
  7. jQuery学习--jQuery 删除元素
  8. 00003 不思议迷宫.0009.6:一键翻开石板捡取物品
  9. 使用POI读取Excel表格中数据
  10. 支付宝数字门店是什么?怎么帮助商家实现数字化?分享一下我的思路