DataBinding (三) Observable

2024-02-28 08:08
文章标签 observable databinding

本文主要是介绍DataBinding (三) Observable,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

BaseObservable
ViewModel 的值变化之后,如果需要画面做相应的刷新,那么可以继承 BaseObservable。

private static class User extends BaseObservable {private String firstName;private String lastName;@Bindablepublic String getFirstName() {return this.firstName;}@Bindablepublic String getLastName() {return this.lastName;}public void setFirstName(String firstName) {this.firstName = firstName;notifyPropertyChanged(BR.firstName);}public void setLastName(String lastName) {this.lastName = lastName;notifyPropertyChanged(BR.lastName);}
}


在 set 方法里面,使用 notifyPropertyChanged 来通知 UI 刷新,notifyPropertyChanged 只会刷新具体的值,notifyChange 方法则会刷新所有的值。 
BR 的域则是通过在 get 方法上加 @Bindable 生成的。

Observable Fields
继承自 BaseObservable 的方法有点复杂,DataBinding 还提供了一种简单的写法—-ObservableField。

private static class User {public final ObservableField<String> firstName =new ObservableField<>();public final ObservableField<String> lastName =new ObservableField<>();public final ObservableInt age = new ObservableInt();
}


直接把属性定义成 ObservableField 类型的,并且修饰符需要是 public final 的。 
除了 ObservableField,还可以使用 ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, ObservableParcelable。 
访问值得时候,可以使用 get set 方法。

user.firstName.set("Google");
int age = user.age.get();


Observable Collections
如果使用 Map,List 等保存数据。DataBinding 也提供了 ObservableArrayMap,ObservableArrayList。

ObservableArrayMap

ObservableArrayMap<String, Object> user = new ObservableArrayMap<>();
user.put("firstName", "Google");
user.put("lastName", "Inc.");
user.put("age", 17);
<data><import type="android.databinding.ObservableMap"/><variable name="user" type="ObservableMap<String, Object>"/>
</data>
…
<TextViewandroid:text='@{user["lastName"]}'android:layout_width="wrap_content"android:layout_height="wrap_content"/>
<TextViewandroid:text='@{String.valueOf(1 + (Integer)user["age"])}'android:layout_width="wrap_content"android:layout_height="wrap_content"/>


ObservableArrayList

ObservableArrayList<Object> user = new ObservableArrayList<>();
user.add("Google");
user.add("Inc.");
user.add(17);

 

<data><import type="android.databinding.ObservableList"/><import type="com.example.my.app.Fields"/><variable name="user" type="ObservableList<Object>"/>
</data>
…
<TextViewandroid:text='@{user[Fields.LAST_NAME]}'android:layout_width="wrap_content"android:layout_height="wrap_content"/>
<TextViewandroid:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'android:layout_width="wrap_content"android:layout_height="wrap_content"/>

 

这篇关于DataBinding (三) Observable的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/754903

相关文章

【MVVM】Data Binding高级用法-Observable、动态生成Binding Class(三)

设置View的id 虽然说Data Binding这种分层模式使得我们对数据的传递简单明了,一般情况下我们可以不设置View的id,不使用findViewById即可对View进行数据上一系列的操作,不过有时候根据情况我们需要对某些View设置id,但是还是可以不findViewById即可得到该控件的对象,因为设置id后ViewDataBinding类会自动生成对应的控件对象,如: <c

观察都模式Observable与Observer的运用(单指拖放)

在Java中通过Observable类和Observer接口实现了观察者模式。一个Observer对象监视着一个Observable对象的变化,当Observable对象发生变化时,Observer得到通知,就可以进行相应的工作。例如在文档/视图结构中,文档被修改了,视图就会得到通知。       java.util.Observable中有两个方法对Observer特别重要,一个是set

dialog中 使用DataBinding数据绑定

kotlin代码实现 class InventoryErrorGoodDialog(context: Context) : BaseDialog(context, R.style.Theme_Dialog_Default) {private var dataBindingView: ViewDataBinding? = nullinit {dataBindingView = DataBindi

Databinding xml例子

https://juejin.im/entry/59104e43128fe1005857ee5f 一篇文章链接 仅仅展示数据绑定成功后xml使用 android:text="@{String.valueOf(index + 1)}"android:visibility="@{age > 13 ? View.GONE : View.VISIBLE}"android:transitionN

Databinding的 xml 数据绑定使用

XML中绑定数据支持的表达式 数学 + - / * %字符串连接 +逻辑 && ||二进制 & | ^一元运算 + - ! ~三元运算 ?:判断是否为空 ??(例:android:text="@{user.name ?? user.defaultName}",相当于android:text="@{user.name !=null ? user.name : user.defaultName}")

DataBinding简介

优点: 省去了findViewById()兼容到Android2.1(API 7)不使用反射,保证了性能支持绝大部分的 Java 写法最大程度减少绑定应用程序逻辑与视图所必需的代码支持双向绑定,即数据改变时可更新视图,反之亦然支持在任意线程更新数据(RecyclerView 和 ListView的数据除外 )避免了因数据导致的空指针,当绑定的数据无效时,视图会显示绑定数据类型的默认值 Andr

null cannot be cast to non-null type android.databinding.ViewDataBinding

如果Build.gradle和Layout文件配置正确,仍无法生成ViewDataBinding类。 经测试,Gradle的sync无效,clean project无效,invalidate and restart无效,但是Build->Rebuild Project生效了。 还不行的话,使用ViewDataBinding抽象类的setVariable方法,也可以生效。 AS版本:3.1.3

Android studio 配置 lambda 和 dataBinding

在build.gradle(Module:app)文件里配置 apply plugin: ‘me.tatarka.retrolambda’ android{ compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } 在

Kontlin+databinding报错:Error: Unresolved reference: databinding

今天在使用Kontlin+databinding时,意料之中的报错: Error:Unresolved reference: databinding Error:Unresolved reference: FragmentDataBinding 下面记录一下解决方案: 在项目的build.gradle中获取到当前Android plugin版本,比如我的是:

Cannot resolve method compose(rx.observable.transformer)

ApiService 中Observable的包倒错了,应该是import io.reactivex.Observable; 不是这个 import android.database.Observable;