Android MVVM简单使用

        MVVM 是 Model-View-ViewModel 的简写,是M-V-VM三部分组成。它本质上就是 MVC 的改进版。MVVM 就是将其中的 View 的状态和行为抽象化,其中 ViewModel 将视图 UI 和业务逻辑分开,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。

        MVVM采用双向数据绑定,view中数据变化将自动反映到 viewmodel上,反之,model中数据变化也将会自动展示在页面上。把 Model 和 View 关联起来的就是 ViewModel。ViewModel 负责把 Model 的数据同步到 View 显示出来,还负责把 View 的修改同步回 Model。

一、DataBinding简单使用

       使用 MVVM 首先要用到 DataBinding,所以我们先简单了解一下 DataBinding 的使用。DataBinding 是一个实现数据和UI绑定的框架,同时也是实现MVVM模式所依赖的工具。

1、配置DataBinding

        在 app 的 build.gradle 文件中配置 DataBinding。

android {
    ....
    dataBinding {
        enabled = true
    }
}

2、生成DataBinding布局

        在 Android 的 xml 布局文件的根布局使用 Alt + 回车键自动生成 DataBinding 布局。




    
        
        
    

    

        

        

        

data标签下为此布局中使用的属性

@{}:单向绑定,数据变化视图内容更新

@={}:双向绑定,视图内容变化,数据也会变化,多用于输入框

3、实体数据

public class User {
    private String name;
    private String userInput;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUserInput() {
        return userInput;
    }

    public void setUserInput(String userInput) {
        this.userInput = userInput;
    }
}

4、Activity代码

public class BindingActivity extends AppCompatActivity {
    private ActivityBindingBinding binding;
    private User user;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_binding);

        user = new User();
        user.setName("张三");
        binding.setUser(user);//绑定User 

        binding.setActivity(this);//绑定Activity
    }

    public void onclick(View view){
        user.setName(user.getUserInput());
        binding.setUser(user);//更新数据
    }
}

        这里还可以做进一步优化,省略点击事件中的更新数据,修改实体类代码

public class User extends BaseObservable {
    private String name;
    private String userInput;

    @Bindable
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        notifyPropertyChanged(BR.name); //更新数据
    }

    public String getUserInput() {
        return userInput;
    }

    public void setUserInput(String userInput) {
        this.userInput = userInput;
    }
}

二、MVVM框架实现

1、生成DataBinding布局




    
        
    

    

        

        

        

2、实现MVVMViewModel

public class MVVMViewModel extends BaseObservable {
    private MVVMModel mvvmModel;
    //EditText数据
    private String userInput;
    //网络返回数据
    private String result;

    public MVVMViewModel(Application application){
        mvvmModel = new MVVMModel();
    }

    public void getData(View view){
        mvvmModel.getHttpData(userInput, new MCallback() {
            @Override
            public void onSuccess(String text) {
                setResult(text);
            }

            @Override
            public void onFailed() {
                setResult("数据获取失败");
            }
        });
    }

    @Bindable
    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
        notifyPropertyChanged(BR.result);
    }

    public String getUserInput() {
        return userInput;
    }

    public void setUserInput(String userInput) {
        this.userInput = userInput;
    }
}
public class MVVMModel {

    //模拟网络请求获取数据
    public void getHttpData(String user, MCallback callback){
        Random random = new Random();
        boolean isSuccess = random.nextBoolean();
        if (isSuccess){
            callback.onSuccess("数据获取成功:" + user);
        } else {
            callback.onFailed();
        }
    }
}
public interface MCallback {

    void onSuccess(String text);

    void onFailed();
}

3、Activity代码

public class MVVMActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMvvmBinding binding =
                DataBindingUtil.setContentView(this, R.layout.activity_mvvm);

        //绑定ViewModel
        MVVMViewModel mvvmViewModel = new MVVMViewModel(getApplication());
        binding.setViewModel(mvvmViewModel);
    }
}

你可能感兴趣的:(开发基础,android)