type=" com.lihang.data binding lover.user " /
在Activity中使用非常简单,如果有不明白的地方,以后会发出链接。
这里还有重新布局预览页面等特殊功能。 通常使用**tools:text=“中间”**预览布局,但此时可以通过
使用default时,即使是studio3.5里,也不会提示,但不会影响。 另一个数据绑定已经处理了空值。 所以这个时候你在活动中将用户设置为空。 也不会崩溃
二、在片段和回收视图中使用数据绑定与在片段中使用和在活动中使用相同。 获取根目录的方法如下。
//注意获取根布局
view view=activityalisbinding.get root (;
这里重点介绍recyclerView的使用方法。 我们厌倦了以前ViewHolder写的东西了吗? 使用数据绑定,我会告诉你,一个viewholder可以解决所有需要的viewholder
先看看我们唯一的ViewHolder。 首先,自动生成的绑定的父类都是视图数据绑定。 我单独拉出了ViewHolder。 为了大家都能使用:
publicclassnewviewholderextendsrecyclerview.view holder {
公共视图数据绑定绑定;
publicnewviewholder (查看数据绑定) {
super (绑定. get root ) );
this.binding=binding;
}
}
Adapter只需要职业
@Override
publicrecyclerview.viewholderoncreateviewholder (view group,int viewType ) {
itemneworderbindingbinding=data binding util.inflate (layoutinflater.from (view group.get context (),r.layout.inding )
returnnewnewviewholder (绑定;
}
@Override
publicvoidonbindviewholder (recycler view.viewholderviewholder,int position ) {
newviewholdernewviewholder=(newviewholder ) viewholder;
//如果是多布局,对绑定做出instansof的一个判断即可。 这样我们永远只需要一个ViewHolder
itemneworderbindingbinding=(itemneworderbinding ) newViewHolder.binding;
binding.txtName.setText (“这样就可以使用了! ”);
}
三.单向数据绑定可以理解为,更改bean对象中的数据时,我们的xml显示会自动改变。 在这里,BaseObservable、ObservableField、ObservableCollection您可以看到,这个名字类似于观察者模式
3.1、BaseObservable首先定义Dog类
publicclassdogextendsbaseobservable {
如果被public修饰,则直接使用@Bindable
@Bindable
公共字符串名称;
private修饰时,在get方法中使用@Bindable
私密字符串颜色;
publicvoidsetdataonlyname (字符串名称,字符串颜色)。
this.name=name;
this.color=color;
只刷name字段
notifypropertychanged (com.lihang.data绑定lover.br.name );
}
publicvoidsetdataall (字符串名称,字符串颜色)。
this.name=name;
this.color=color;
//刷新所有字段
通告更改(;
}
…//省略部分代码
}
p>这里我同事改变了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(“看看刷新了哪”, “未知错误~”);
}
}
});
其实这个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);
一看就是集合,这里和我们常用的 List Map一样。只不过这里的ObservableList、ObservableMap是封装好的。当我们改变集合里的数据时。xml也会改变。唯一要注意的是,在xml里引用这些集合的时候<类型>,这些符号,会影响xml格式所以要转义。用< 代表<;用>代表>(这些转义符,同样支持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是mhdmy的引用。第二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);
}
这里比较重要的用法是,当我们的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布局里支持的语法 支持的语法: 算术 + - / * %字符串合并 +逻辑 && ||二元 & | ^一元 + - ! ~移位 >> >>> <<比较 == > < >= <=InstanceofGrouping ()character, String, numeric, nullCast方法调用Field 访问Array 访问 []三元 ?: 不支持的语法: thissupernew显示泛型调用rue"
app:imageWithGlide="@{imageUrl}" />
activity里就是设置imageUrl和testStr的值。太简单就不写了。
七、DataBinding布局里支持的语法 支持的语法: 算术 + - / * %字符串合并 +逻辑 && ||二元 & | ^一元 + - ! ~移位 >> >>> <<比较 == > < >= <=InstanceofGrouping ()character, String, numeric, nullCast方法调用Field 访问Array 访问 []三元 ?: 不支持的语法: thissupernew显示泛型调用