小而美的android adapter库设计:支持MultiType | 掘金技术征文

目前这个项目已经开源到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

  1. 支持在列表中装载多种viewType的item。每一个item对应一种布局文件以及一种ViewModle;
  2. 基于data binding库设计,所以支持经过data binding技术(在XML文件中配置)完成adapter的构建、数据加载以及其余data binding相应的技术实现;
  3. 支持在item的view视图被data binding构建以后,对view视图执行更多的配置操做。好比当item是一个图标的时候,可能须要对图标进行更多自定义的属性配置。这时候能够经过data binding的注解技术实现(若是你很熟悉data binding的话),也能够经过decorator对象的接口回调进行设置。
  4. 支持在data bingding的视图和数据绑定以后,接收回调,执行额外的操做;
  5. 实现了ListView、ViewPager、RecyclerView、ExpandableListView对应的adapter

目前还不完善的功能;架构

  1. 当你使用的是RecyclerView的时候,只能经过ViewHolder的factory构建本身的ViewHolder实例,并在ViewHolder中对view进行自定义配置,不能使用decorator对象开放的接口进行前置的视图配置
  2. adapter当中的ViewDataBinding对象还不支持自定义的DataBindingComponent
  3. 其余可能须要但还没被支持的属性。。。

代码总体类图

代码设计概述

上面的类图基本上描述了代码中的结构,用两个表达式阐述整个库的功能实现就是:mvvm

adapter = ViewManager + ViewModle + Factory
ViewModle = Decorator + model(data)工具

ViewManager

ViewManager的设计初衷其实就是为了管理adapter须要装载的各类item的样式。每一个adapter在初始化的时候都必须构建一个ViewManager的实例,这个ViewManager的实例标识了这个adapter须要加载的item的所有类型。布局

在库当中,我将每一个item抽象成了一个ItemView的对象, 主要包含了两个属性,一个是对应的布局文件ID,一个是item所绑定的data的索引值,也就是data binding中BR.java当中的值。而ViewManager则封装了对ItemView的操做逻辑,使得item视图选择对外部是透明的。post

ViewManager当中核心的逻辑就只有两个部分:gradle

  • 经过ViewManager的内部类Builder构建ViewManager实例的时候的put()方法。全部adapter须要支持的item类型都应该使用这个方法进行添加;
  • ViewManager当中的select()方法,主要是根据当前须要布局的item类型,选择加载合适的布局文件以及数据绑定;

另外ViewManager当中还包含了一个 NO_VARIABLE_BINDING 的常量值,当item不须要进行数据绑定的时候,可使用这个标志位进行标识。

Decorator

当咱们使用data binding技术以后,data binding库会自动的为咱们初始化视图,而且将数据与视图进行绑定。可是不少时候,当咱们使用的是一些复杂的item视图类型的时候,咱们须要对item里面的视图进行不少的配置操做。好比说咱们在item当中加载的是一个图标的时候,咱们须要对图标进行不少的属性配置。这种状况下,若是纯粹的依赖data binding的话,可能须要咱们经过注解@BindAdapter完成相应的设置。若是不习惯这种作法的话,咱们这个时候就可使用decorator对象了。

Decorator是一个接口,包含两个接口方法:

  • void onViewCreated(ViewDataBinding dataBinding);

这个方法会在视图被data binding库加载以后回调

  • void onDataBinded(ViewDataBinding dataBinding);

这个方法会在视图与数据绑定以后被回调。

目前的实现中,ViewModle能够经过依赖注入增长这个接口的实现,而ViewModle对象是咱们list装载的item数据内容。也就是说每一个item其实都具有一个Decorator的实现。当咱们须要对item的视图进行更多的配置的时候,就能够实现这个接口,并注入到咱们的ViewModle里面。

ViewModel

咱们库当中的list装载的内容要求都是ViewModel的子类。也就是说咱们须要将实际应用的model再进行封装一层。
在库当中的实现,我仍是经过依赖注入将model(data)数据注入到ViewModel当中,并且咱们能够往ViewModel注入更多的数据,也能够将一些交互的事件的实如今ViewModel当中。

Factory

库当中的全部的adapter都实现了对应的工厂接口方法,咱们能够经过实现工厂方法返回咱们须要的自定义的adapter类型。默认都会提供一个DEFAULT的工厂,返回对应的adpter的基类。

AnnotationController

这个类是库当中处理data binding相关注解的实现中枢。库提供了经过在XML当中配置属性,完成adpter的构建以及数据绑定的操做。若是你很熟悉data binding的使用方法的话,你能够经过添加对应的XML属性设置就能够完成adapter的绑定了,很是的简单快捷。若是你不熟悉这样的方式,也可使用传统的在java代码中进行实例化和设置操做。

愿景

目前这个库的设计还比较初期,功能也只是完成了几本覆盖,而且由于是基于data binding技术设计的,所以项目当中必须在gradle当中打开data binding的开关才能够。接下来会针对实际应用中的需求不断完善这个库的功能。

另外data binding在项目中只是负责了数据与视图绑定的操做,对于库当中其余的核心功能以及整个库的架构是没有强耦合的,所以咱们彻底能够经过开放数据绑定的逻辑接口方法,就可以实现一个不依赖data binding的adapter库。

目前这个项目我已经开源到GitHub上面,有兴趣的同窗能够star一下,也能够欢迎fork这个仓库,一块儿改进。DataBindingAdapter.

若是你喜欢这篇文章,欢迎收藏。也欢迎你关注我,一块儿讨论更多的问题,感谢你宝贵的时间阅读这篇文章,谢谢!

掘金技术征文活动

相关文章
相关标签/搜索