用kotlin好久了,最近发现上手学了一下android新的DataBinding特性(虽然已经出了好久了),
但是每个对象都需要添加:

set(value) {          field = value     notifyChange()}

这就很烦,然后突然想到了可以使用委托这个kotlin的特性来配合完成统一实现:

notifyChange()

下面是代码

首先新建一个抽象类,然后集成DataBinding的BaseObservable

// 抽象类 继承baseObservable 因为自己建立抽象类后,可方便后面添加或者修改信息abstract class BaseRecyclerModel() : BaseObservable() {     // 内部属性委托类,使用泛型,就可以做到一个类,全局通用,不管是什么类型都可以// 该委托类是给可为空对象使用    protected class BaseRecyclerModelDelegate<T : BaseRecyclerModel, V> {             private var default: V? = null //默认值,可为空        constructor()        constructor(default: V?) {                 this.default = default        }        operator fun getValue(thisRef: T, property: KProperty<*>): V? {     // 获取泛型值            return default        }        operator fun setValue(thisRef: T, property: KProperty<*>, value: V?) {     // 设置泛型值            default = value            thisRef.notifyChange()// 因为T必须是继承BaseRecyclerModel,所以我们可以直接使用notifyChange来进行更新数据        }    }// 内部属性委托类,使用泛型,就可以做到一个类,全局通用,不管是什么类型都可以// 该委托类是给不可为空对象使用,所以必须给默认值    protected class BaseRecyclerModelNotNullDelegate<T : BaseRecyclerModel, V>( private var default: V) {             operator fun getValue(thisRef: T, property: KProperty<*>): V {     // 获取泛型值            return default        }        operator fun setValue(thisRef: T, property: KProperty<*>, value: V) {     // 设置泛型值            default = value            thisRef.notifyChange()// 因为T必须是继承BaseRecyclerModel,所以我们可以直接使用notifyChange来进行更新数据        }    }}

好的,接下来就可以新建一个model类。来给DataBinding进行绑定

class TestModel() : BaseRecyclerModel() {         var name: String? by BaseRecyclerModelDelegate() // 使用可为空委托类进行委托    var clickSize: Int by BaseRecyclerModelNotNullDelegate(0)// 使用 不 可为空委托类进行委托    var clickSize1: Long by BaseRecyclerModelNotNullDelegate(0)// 使用 不 可为空委托类进行委托    var clickSize2: Float by BaseRecyclerModelNotNullDelegate(0f)// 使用 不 可为空委托类进行委托    var clickSize3: Double by BaseRecyclerModelNotNullDelegate(0.0)// 使用 不 可为空委托类进行委托    var test: Test? by BaseRecyclerModelDelegate()// 使用可为空委托类进行委托    fun clickSizeToString(): String {             return clickSize.toString()    }    fun clickSize2ToString(): String {             return clickSize2.toString()    }    override fun toString(): String {             return "$name,$clickSize,$clickSize1,$clickSize2,$clickSize3,$test"    }}

这样就可以实现两个委托类,全局DataBinding绑定都不需要在手写notifyChange方法了!
注意:使用属性委托后,@Bindable将无法使用了,就不能进行局部单个变量的数据更新 ,只能进行整个model类数据的更新!

更多相关文章

  1. 箭头函数的基础使用
  2. NPM 和webpack 的基础使用
  3. Python list sort方法的具体使用
  4. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  5. android 使用html5作布局文件: webview跟javascript交互
  6. Android(安卓)Resource介绍和使用
  7. "Failed to fetch URL https://dl-ssl.google.com/android/repos
  8. 使用NetBeans搭建Android开发环境
  9. android ndk编译x264开源(用于android的ffmpeg中进行软编码)

随机推荐

  1. 关闭程序
  2. Android Native Development Kit (NDK)
  3. Version Code 版本设置
  4. Android 滑动开关控件
  5. Android MediaPlayer
  6. Android 学习之- 单选按钮、复选框、状态
  7. Android中下载文件的使用
  8. Android apk to library
  9. android canvas 画闹钟 圆弧
  10. Android Drawable scale