Android

MVVM -- 2 databind 绑定事件和页面刷新使用

2020-10-09  本文已影响0人  清汤白面

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="改变用户信息" />
    </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;
    }
}

这样我们的点击事件 就搞定了。

3.更改用户信息的数据 刷新界面

我们就在按钮的点击事件中去更改用户信息

1.方法(直接重新设置下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,就是对BaseObservableField个一个封装。归根到底就是用的观察者模式,监听数据是否有改变,然后刷新界面。

用法如下:
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();
    }
}

运行

原来这就是那来自北方的南蛮汉子 2020-10-10 11.15.08(1).gif

关于Livedata 结合 databind 我放在后面再更新

a

上一篇下一篇

猜你喜欢

热点阅读