目前这个项目已经开源到GitHub上面,欢迎你们关注
github.com/lemon-yang/…java
android data binding library为咱们提供了一个页面与数据绑定的技术,尤为是android gradle plugin在2.2的版本以后,更是开始支持了双向绑定以及lambada表达式,使得data binding的技术更加成熟,而将data bingding技术结合的mvvm设计结构也愈来愈获得更多的关注。在前面个人文章里面,已经从源码的角度,讲述了data binding库的一些实现细节。如今结合data binding的技术实现一个adapter库。android
声明:这个库是在看了GitHub上面的一个开源项目binding-collection-adapter,而后结合本身的理解以及一些实际的经验进行了优化和代码总体结构的调整。对于源码中优秀的工具类,我都没有修改,按照原来的进行保留,并在文件头标明了文件的出处。git
目前已经完成的功能:github
目前还不完善的功能;架构
上面的类图基本上描述了代码中的结构,用两个表达式阐述整个库的功能实现就是:mvvm
adapter = ViewManager + ViewModle + Factory
ViewModle = Decorator + model(data)工具
ViewManager的设计初衷其实就是为了管理adapter须要装载的各类item的样式。每一个adapter在初始化的时候都必须构建一个ViewManager的实例,这个ViewManager的实例标识了这个adapter须要加载的item的所有类型。布局
在库当中,我将每一个item抽象成了一个ItemView的对象, 主要包含了两个属性,一个是对应的布局文件ID,一个是item所绑定的data的索引值,也就是data binding中BR.java当中的值。而ViewManager则封装了对ItemView的操做逻辑,使得item视图选择对外部是透明的。post
ViewManager当中核心的逻辑就只有两个部分:gradle
另外ViewManager当中还包含了一个 NO_VARIABLE_BINDING 的常量值,当item不须要进行数据绑定的时候,可使用这个标志位进行标识。
当咱们使用data binding技术以后,data binding库会自动的为咱们初始化视图,而且将数据与视图进行绑定。可是不少时候,当咱们使用的是一些复杂的item视图类型的时候,咱们须要对item里面的视图进行不少的配置操做。好比说咱们在item当中加载的是一个图标的时候,咱们须要对图标进行不少的属性配置。这种状况下,若是纯粹的依赖data binding的话,可能须要咱们经过注解@BindAdapter完成相应的设置。若是不习惯这种作法的话,咱们这个时候就可使用decorator对象了。
Decorator是一个接口,包含两个接口方法:
这个方法会在视图被data binding库加载以后回调
这个方法会在视图与数据绑定以后被回调。
目前的实现中,ViewModle能够经过依赖注入增长这个接口的实现,而ViewModle对象是咱们list装载的item数据内容。也就是说每一个item其实都具有一个Decorator的实现。当咱们须要对item的视图进行更多的配置的时候,就能够实现这个接口,并注入到咱们的ViewModle里面。
咱们库当中的list装载的内容要求都是ViewModel的子类。也就是说咱们须要将实际应用的model再进行封装一层。
在库当中的实现,我仍是经过依赖注入将model(data)数据注入到ViewModel当中,并且咱们能够往ViewModel注入更多的数据,也能够将一些交互的事件的实如今ViewModel当中。
库当中的全部的adapter都实现了对应的工厂接口方法,咱们能够经过实现工厂方法返回咱们须要的自定义的adapter类型。默认都会提供一个DEFAULT的工厂,返回对应的adpter的基类。
这个类是库当中处理data binding相关注解的实现中枢。库提供了经过在XML当中配置属性,完成adpter的构建以及数据绑定的操做。若是你很熟悉data binding的使用方法的话,你能够经过添加对应的XML属性设置就能够完成adapter的绑定了,很是的简单快捷。若是你不熟悉这样的方式,也可使用传统的在java代码中进行实例化和设置操做。
目前这个库的设计还比较初期,功能也只是完成了几本覆盖,而且由于是基于data binding技术设计的,所以项目当中必须在gradle当中打开data binding的开关才能够。接下来会针对实际应用中的需求不断完善这个库的功能。
另外data binding在项目中只是负责了数据与视图绑定的操做,对于库当中其余的核心功能以及整个库的架构是没有强耦合的,所以咱们彻底能够经过开放数据绑定的逻辑接口方法,就可以实现一个不依赖data binding的adapter库。
目前这个项目我已经开源到GitHub上面,有兴趣的同窗能够star一下,也能够欢迎fork这个仓库,一块儿改进。DataBindingAdapter.
若是你喜欢这篇文章,欢迎收藏。也欢迎你关注我,一块儿讨论更多的问题,感谢你宝贵的时间阅读这篇文章,谢谢!