慕课课程学习地址:android开发中的mvc_mvp_mvvm
学习代码地址:github
简介
MVVM是Model-View-ViewModel的简写,MVVM在MVP的基础上实现了数据视图的绑定(DataBinding),当数据变化时,视图会自动更新;视图变化时,数据也会自动更新。
优点:相对于mvp 实现了数据和视图的双向绑定,极大的简化代码
databinding使用
1、使用databinding:在app/build.gradle 里的android标签下添加
dataBinding{
enabled = true
}
2、打开xml文件,选中根目录,alt+enter convert to data binding layout 即可
3、打开对应的java文件,将setcontentView代码删除,使用databinding
//setContentView(R.layout.activity_main);
ActivityMainBinding binding;
binding= DataBindingUtil.setContentView(this, R.layout.activity_main);
4、如果xml里需要使用实体类的属性,则需要在根布局layout里的data标签下添加:
然后再textview或者button按钮里使用:
<data>
<variable
name="account"
type="com.imfondof.mvvmdemo.Account" />
</data>
<TextView
......
android:text="@{account.name + '|'+account.level}"
/>
java代码里只需要添加数据即可
account = new Account("22", 100);
binding.setAccount(account);
5、添加单击事件
xml里需要添加当前view
<data>
<variable
name="activity"
type="com.imfondof.mvvmdemo.MainActivity" />
</data>
<Button
......
android:onClick="@{activity.onclick}" />
java代码里添加方法
public void onclick(View view) {
account.setLevel(account.getLevel()+1);
binding.setAccount(account);
}
6、设置实体类,无需每次改动数据后setAccount,改动后自动更新
(1)将实体类 继承BaseObservable ,在getLevel方法前添加注解 getLevel,并在setLevel方法里添加notifyPropertyChanged(BR.level);【其中BR.level是生成的】
(2)java代码里只需要更改数据,无需set方法了
public class Account extends BaseObservable {
private String name;
private int level;
public Account(String name, int level) {
this.name = name;
this.level = level;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Bindable
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
notifyPropertyChanged(BR.level);
}
}
public void onclick(View view) {
account.setLevel(account.getLevel() + 1);
}
7、单向绑定?双向绑定?
以上的demo属于单向绑定,即数据更改了 UI自动更新
双向绑定是:同时,UI更改了之后数据也更新:xml里在@后面添加一个等号即可
android:onClick="@={activity.onclick}"
使用MVVM实现需求
(学习代码地址:github)
V层:获取用户输入;显示成功/失败界面
VM层:业务逻辑处理,数据更新
M层:查询账号数据
步骤:
1、提供view(即Activity)、viewmodel、model三层
2、布局修改为databinding布局
3、view与ViewModel之间通过DataBinding进行通信
4、获取数据显示在界面上
代码:github
问题:
1、无法找到BR文件?
rebuild项目即可
2、在activity里需要点击按钮,请求权限时,需要怎么做?
使用Livedata
- Livedata是一个可以被观察的数据持有者,它可以通过添加观察者的方式来让其他组件观察它的变更
- LiveData遵从应用该程序的生命周期(LiveData的观察者已经销毁,则LiveData不会通知观察者)