Android架构Android Android开发精选

MVVM Light Toolkit使用指南

2016-06-15  本文已影响26796人  Kelin

概述

MVVM Light Toolkit是一个Android MVVM 轻量级工具库,主要目的是更快捷方便的构建Android MVVM应用程序,工具库添加了一些Data Binding 不支持的属性,还有添加对控件事件的封装,同时提个一个全局消息通道方便ViewModel 之间的通信,Toolkit主要包括两部分BindingMessenger,接下来,我们分别说明下这两个模块的作用和使用方法。

源码:
Github:https://github.com/Kelin-Hong/MVVMLight

compile 'com.kelin.mvvmlight:library:1.0.0'

Binding

MVVM Binding Schematic Diagram

由上图我们可以看到,在View和ViewModel的绑定中,包含两种绑定,一种是数据的绑定(比如:TextView:text),另外一种命令绑定,命令绑定我们可以理解为事件绑定,(比如:Button:click),但是目前Databinding 并不完全支持命令的绑定, 而且对Data的绑定的支持也不完善(比如说不支持AdapterView对DataSource的绑定),那么在MVVM LightBinding我们添加了部分Data绑定支持Command绑定的支持。

当然ImageView还支持其他属性

placeholderImageRes :图片还没有下载完成时的替换图片
request_width : 请求图片的宽度,会自动帮你裁剪
request_height:请求图片的高度,会自动帮你裁剪

接下来看下示例:


image.gif

对于ListView、RecyclerView 和 ViewPager 等AdapterView使用起来就更加简单了,在布局文件添加bind:itemView(子布局模板),bind:items(数据源)还有bind:layoutManager就能ok了,完全不需要写Adapter相关的东西。

  <android.support.v7.widget.RecyclerView  
     android:layout_width="match_parent"   
     android:layout_height="match_parent"   
     bind:itemView="@{viewModel.itemView}"   
     bind:items="@{viewModel.itemViewModel}"   
     bind:layoutManager="@{LayoutManagers.linear()}"

然后Java 代码中在ViewModel定义itemView和itemViewModel就可以了列表就能展示出来了

public final ObservableList<ViewModel>  itemViewModel = new  ObservableArrayList<>(); 
public final ItemView itemView = ItemView.of(BR.viewModel, R.layout.layoutitem_list_view);

动画示例:

listview_databinding.gif

关于AdapterView 数据源绑定问题主要还是Google的DataBinding框架还不够完善,相信不久后肯定有更好的方案出来,让我们更加方便把数据源和布局模板绑定到ListView上,当然现在也有一些开源库帮我们把这个部分做好了,我们也不重复造轮子,就直接使用了关于AdapterView的一些数据绑定扩展,https://github.com/evant/binding-collection-adapter 给了比较详细的描述,基本能满足大部分AdapterView的需求。

接下来列举目前MVVM Light 工具库支持的一些Data Binding的属性:

目前整理的一些常用属性和控件可能不足,我们也不太可能能把所有可用的控件和控件关联的属性全部做一些封装,希望开发者自己可以在需要的时候去继承相应的类扩展更多的属性。

bind:onLoadMoreCommand: RecyclerView 在滑到最底部的时候自动触发这个事件,这个事件的处理者是一个ReplyCommand<Integer>类型的变量

接下来我们在ViewModel 里面的定义一个ReplyCommand<Integer> 变量

   public final ReplyCommand<Integer> loadMoreCommand = new ReplyCommand<>(
    (count) -> {
        /*count 代表当前RecyclerView 有多少个Item,通过这个值我们可以
          得到当前应该去加载第几页的数据*/
         int page=count / LIMIT;
         loadData(page)
    });

对于处理RecyclerView 下拉加载更多,我们之前的做法可能需要去写各种代码来判断是否滑动底部,在OnScrollListener 里面做一些计算然后才知道滑到底部了,但是如果用封装好的Command事件,你的ViewModel里面的代码将非常简洁,只要简要的声明一个 ReplyCommand<Integer>,它就能自动传一个当前List中Item的总数给你,你要做的只是专注你的业务处理(比如 加载数据),ViewModel 里面只处理数据,不处理控件,没有任何控件的引用,所以UI的状态和变化都由数据来绑定控制的,这样数据就成了主角,我们在ViewModel 里面只要和数据打交道就可以了。

动画示例:

listview load more

同时对于我最常见的点击事件,我们也做对了click事件的封装,封装成一个clickCommand,接受的参数是一个无参的ReplyCommand:


动画示例:

clickCommand.gif

关于下拉刷新控件SwipeRefreshLayout的下拉刷新事件也简单封装成另一个ReplyCommand

动画示例:

refresh.gif

接下来列举目前MVVM Light 工具库支持的一些Command Binding的属性:

以上的Command有继承效应,即ImageView、TextView是View的子类,所以它们都拥有View 扩展的Data Binding和Command Binding 如:clickCommand 等。

注:###

Messenger###

引入messenger最主要的目的就实现ViewModel和ViewModel的通信,也可以用做View和ViewModel的通信,但是并不推荐这样做。ViewModel主要是用来处理业务和数据的,每个ViewModel都有相应的业务职责,但是在业务复杂的情况下,可能存在交叉业务,这时候就需要ViewModel和ViewModel交换数据和通信,这时候一个全局的消息通道就很重要的。接下来我们简单看一下messenger的使用:


示例:


注:###

1、Messenger 一定要取消注册,不然会造成严重的内存泄露
2、Messenger 的TOKEN在命名的时候要注意,最好和相关的ViewModel结合起来,避免在同一个App出现两个相同的Token,这样会把消息发到其他你不知道的地方,造成潜在的BUG!

刚新建了博客答疑交流群,对博客内容有任何疑问或者我的几个开源库有任何使用的问题,还有喜欢捣鼓Android MVVM 同学,可以加入此群,大家一块探讨交流,共同学习😁

博客答疑交流群
上一篇下一篇

猜你喜欢

热点阅读