之前了解了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的效果了。