之前了解了UI的元件跟data之间是如何进行绑定的,那麽在当data发生改变时,又该如何及时让data的变化反应在ui上呢?这时可以使用单向绑定的方法执行。
1.使用BaseObservable
2.使用ObservableField
刷新ui有2种方式:
1.notifyChange();
更新所有的UI
2.notifyPropertyChanged();
只更新绑定的UI
首先在model里extends BaseObservable
public class DataItem extends BaseObservable {
@Bindable //一定要新增@Bindable注解,不然编译时会出错
private String name;
private String Msg ;
private boolean colorChange;
public boolean isColorChange() {
return colorChange;
}
public void setColorChange(boolean colorChange) {
this.colorChange = colorChange;
notifyChange();//在setter方法中加入notifyChange();
}
public String getMsg() {
return Msg;
}
public void setMsg(String msg) {
Msg = msg;
notifyChange();//在setter方法中加入notifyChange();
}
@Bindable
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
notifyChange();//在setter方法中加入notifyChange();
}
}
在UI跟DATA做绑定
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{dataItem.name}"
android:textSize="40sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{dataItem.msg}"
android:textSize="40sp"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onSendMsg"
android:text="click1"
android:textSize="40sp" />
<Button
android:layout_width="50sp"
android:layout_height="50sp"
android:layout_marginLeft="180dp"
app:heart="@{dataItem.colorChange}" />
MainActivity2的部分
public class MainActivity2 extends AppCompatActivity{
ActivityMain2Binding main2Binding;
DataItem dataItem;
ClickHandler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
init();
}
private void init() {
main2Binding=DataBindingUtil.setContentView(this,R.layout.activity_main2);
dataItem=new DataItem();
main2Binding.setDataItem(dataItem);
handler=new ClickHandler(MainActivity2.this);
main2Binding.setHandler(handler);
}
public void onSendMsg(View view) {
if (!dataItem.isColorChange()) {
dataItem.setName("eles123");
dataItem.setMsg("Welcome eles's note.");
dataItem.setColorChange(true);
}else {
dataItem.setColorChange(false);
dataItem.setName("eles");
dataItem.setMsg("hello");
}
}
这样就完成了BaseObservable的使用方法了
那麽接下来换ObservableField
ObservableField这个类是接收泛型,可以直接更新UI
先建立一个model
public class DataItem2 {
public final ObservableField<String> name=new ObservableField<>();
public final ObservableField<String> Msg=new ObservableField<>();
}
xml都差不多
<variable
name="observableData2"
type="com.example.newtest.databindView.DataItem2" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{observableData2.name}"
android:textSize="40sp"/>
activity
public void click2(View view) {
count=(int)(Math.random()*10)+1 ;//设乱数
dataItem2.name.set("eles"+count);
}
使用ObservableField的set方法就可以看到更新UI的效果了。
<<: [Day15]程序菜鸟自学C++资料结构演算法 – 二元树的基本应用
>>: Angular 深入浅出三十天:表单与测试 Day14 - 单元测试实作 - 被保人 by Reactive Forms
各位好 小弟就是大家口中所说的 文组工程师 去年四月资策会java班毕业,後来因疫情到去年底才上工 ...
运用到的观念: 利用vertical-align: middle;调整图片预设多余的空间 使用po...
第二种启动相机的方法 昨天勾选 Camera 的 Auto Start 来启动相机。 今天使用第二种...
(续上) 无变异比较 & 拉许模型 教育评量的领域,对「能力」有大量的衡量需求。其中有一个值...
设计大纲 设计CTA的用意一方面是让结尾不会来得太突然,另一方面是想在网页的最後再来一个「Call ...