Android学习之MVVM开发模式

来源:互联网 发布:数据库中关系的定义 编辑:程序博客网 时间:2024/05/07 05:32

MVVM简介

  之前使用过MVP模式来写项目, 已经基本会用了,是时候学学MVVM了。MVVM是Model-View-ViewModel的简写。它是将“数据模型数据双向绑定”的思想作为核心,因此在View和Model之间没有联系,通过ViewModel进行交互,而且Model和ViewModel之间的交互是双向的,因此视图的数据的变化会同时修改数据源,而数据源数据的变化也会立即反应到View上。
  在Android中,MVVM 设计模式是使用Data Binding实现的(官网传送门:DataBinding文档地址,需要科学上网;或者DataBinding国内文档地址,可直接访问),下面就来看如何使用吧:
  要使用Data Dinding,先要确定你的Android Studio版本,只有在1.3以上的版本才支持,然后要在gradle文件中添加如下几行代码来开启databinding:

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

然后就可以开始使用了:

一、基本使用

1、布局:最外层变成了layout,如下:

<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android">    <data>        <variable name="user" type="com.guifa.databindingdemo.User" />    </data>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="vertical">        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@{user.firstName}" />        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@{user.lastName}" />    </LinearLayout></layout>

其中在layout中引入data使用节点,在data中定义variable节点,name表示变量的名称,type表示变量的类型,也就是我们的javabean。

2、编写Java对象类(POJO)for User:

package com.guifa.databindingdemo;/** * Created by GuiFa on 2017/11/3 */public class User {    private final String firstName;    private final String lastName;    public User(String firstName, String lastName) {        this.firstName = firstName;        this.lastName = lastName;    }    public String getFirstName() {        return this.firstName;    }    public String getLastName() {        return this.lastName;    }}

3.绑定数据

package com.guifa.databindingdemo;import android.databinding.DataBindingUtil;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import com.guifa.databindingdemo.databinding.ActivityMainBinding;/** * @author GuiFa * @description * @date 2017/11/3 */public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);        User user = new User("Test", "User");        binding.setUser(user);    }}

  其中的 ActivityMainBinding 类是 DataBinding 框架为我们自动生成的 , 它是根据我的XML 文件名字生成的 , 比如我的 XML 文件名字是 activity_main,那么生成的类就会取消下划线并且在最后加上 Binding 就得到了 ActivityMainBinding。这个类的实例可以通过 DataBindingUtil.setContentView 来得到。这个类里面有我们 XML 文件里所有的控件信息,由此 , 也再也不需要去 findViewById 了。
  最后直接运行项目,便可以将内容显示在UI界面上了,如下图:


  运行效果图

二、事件处理

  
  下面举个例子,给一个Button添加点击事件:

1、创建个MyHandlers类并定义点击方法,方法中我定义了个toast:

package com.guifa.databindingdemo;import android.view.View;import android.widget.Toast;/** * @author GuiFa * @version V1.0 * @date 2017/11/8 */public class MyHandlers {    public void onClickFriend(View view) {        Toast.makeText(view.getContext(), "点击测试", Toast.LENGTH_SHORT).show();    }}

2、在节点中添加variable:

<data>    // ...    <variable        name="handlers"        type="com.guifa.databindingdemo.MyHandlers" /></data>

3、添加布局文件并添加onClick属性

<Button    android:id="@+id/btn"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:onClick="@{handlers::onClickFriend}"    android:text="点击测试" />

其中onCLick是这么定义的:@{}是固定形式,handlers是上边variable中定义的name,加上“::”,后面跟上自己定义的方法的名字。(官方文档给出的是“::”,实际些项目的时候也可以使用“.”,即android:onClick=”@{handlers.onClickFriend}”)

4、在activity中添加代码:

package com.guifa.databindingdemo;import android.databinding.DataBindingUtil;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import com.guifa.databindingdemo.databinding.ActivityMainBinding;/** * @author GuiFa * @description * @date 2017/11/3 16:18 */public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);        // User user = new User("Test", "User");        // binding.setUser(user);        MyHandlers myHandlers = new MyHandlers();        binding.setHandlers(myHandlers);    }}

最后运行起来就能看到toast效果了。

三、加载图片

  ImageView加载网络图片时,可以使用DataBinding的扩展,我们可以自定义属性,@BindingAdapter 就可以现实:

1、在节点中添加variable:

<data>    // ...    <variable        name="imageUrl"        type="String" /></data>

3、添加布局文件并添加自定义属性“app:image=“””

<ImageView    android:layout_width="match_parent"    android:layout_height="wrap_content"    app:image="@{imageUrl}" />

4、写加载图片的方法,这里我使用了glide加载图片的框架,同时加上“@BindingAdapter({“image”})”

package com.guifa.databindingdemo;import android.databinding.BindingAdapter;import android.widget.ImageView;import com.bumptech.glide.Glide;/** * @author GuiFa * @version V1.0 * @date 2017/11/17 */public class LoadImage {    @BindingAdapter({"image"})    public static void imageLoader(ImageView imageView, String imageUrl) {        Glide.with(imageView.getContext()).load(imageUrl).into(imageView);    }}

5.在MainActivity中添加代码:

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);// 加载网络图片binding.setImageUrl("http://timgsa.baidu.com/timgimage&quality=80&size=b9999_10000&sec=1510907859844&di=963a9e3a88b59553d3e4873911cec47e&imgtype=0&src=http%3A%2F%2Fimg.qqzhi.com%2Fupload%2Fimg_5_2322916868D349000605_23.jpg");

未完待续……

原创粉丝点击