1.xml里面
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
>
<data>
<variable
name="user"
type="com.melo.app.mvvm.UserInfo" />
<variable
name="click"
type="com.melo.app.mvvm.MainActivity" />
</data>
<LinearLayout
...>
<TextView
...
android:text="@{user.name}"
/>
<TextView
...
android:text="@{user.sex}"
/>
<Button
...
android:onClick="@{(v)->click.changeText(v)}"
android:text="改變用戶(hù)信息" />
</LinearLayout>
</layout>
2.activity中
public class MainActivity extends AppCompatActivity {
UserInfo userInfo;
ActivityMainBinding viewDataBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
userInfo = new UserInfo("德瑪西亞", "男"));
viewDataBinding.setUser(userInfo);
viewDataBinding.setClick(this);
}
public void changeText(View view) {
Toast.makeText(this, userInfo.getName(), Toast.LENGTH_SHORT).show();
}
}
public class UserInfo {
String name;
String sex;
public UserInfo(String name, String sex) {
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
這樣我們的點(diǎn)擊事件 就搞定了淆衷。
3.更改用戶(hù)信息的數(shù)據(jù) 刷新界面
我們就在按鈕的點(diǎn)擊事件中去更改用戶(hù)信息
1.方法(直接重新設(shè)置下user)
int i = 0;
public void changeText(View view) {
userInfo.setName("德瑪西亞" + i);
i++;
Toast.makeText(this, userInfo.getName(), Toast.LENGTH_SHORT).show();
viewDataBinding.setUser(userInfo);
}
2.利用BaseObservable
public class UserInfo extends BaseObservable {
@Bindable
String name;
@Bindable
String sex;
public UserInfo(String name, String sex) {
this.name = name;
this.sex = sex;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
notifyPropertyChanged(BR.sex);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}
}
public class MainActivity extends AppCompatActivity {
UserInfo userInfo;
ActivityMainBinding viewDataBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
userInfo = new UserInfo("德瑪西亞","男");
viewDataBinding.setUser(userInfo);
viewDataBinding.setClick(this);
}
int i = 0;
public void changeText(View view) {
userInfo.setName("德瑪西亞" + i);
i++;
Toast.makeText(this, userInfo.getName(), Toast.LENGTH_SHORT).show();
}
}
3.利用ObservableField
源碼中可以看到ObservableField是繼承BaseObservableField杭煎,就是對(duì)BaseObservableField個(gè)一個(gè)封裝催蝗。歸根到底就是用的觀察者模式赤赊,監(jiān)聽(tīng)數(shù)據(jù)是否有改變铣耘,然后刷新界面宅倒。
用法如下:
1.xml布局文件不變
public class UserInfo {
ObservableField<String> name;
ObservableField<String> sex;
public UserInfo(ObservableField<String> name, ObservableField<String> sex) {
this.name = name;
this.sex = sex;
}
public ObservableField<String> getName() {
return name;
}
public void setName(ObservableField<String> name) {
this.name = name;
}
public ObservableField<String> getSex() {
return sex;
}
public void setSex(ObservableField<String> sex) {
this.sex = sex;
}
}
public class MainActivity extends AppCompatActivity {
UserInfo userInfo;
ActivityMainBinding viewDataBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
userInfo = new UserInfo(new ObservableField<String>("德瑪西亞"), new ObservableField<String>("男"));
viewDataBinding.setUser(userInfo);
viewDataBinding.setClick(this);
}
int i = 0;
public void changeText(View view) {
userInfo.getName().set("德瑪西亞" + i);
i++;
Toast.makeText(this, userInfo.getName().get(), Toast.LENGTH_SHORT).show();
}
}
運(yùn)行
關(guān)于Livedata 結(jié)合 databind 我放在后面再更新
a