android 使用Kotlin operator 泛型属性委托配合DataBinding,实现2个委托类,全局binding通用
程序员文章站
2022-03-12 21:33:57
用kotlin好久了,最近发现上手学了一下android新的DataBinding特性(虽然已经出了好久了),但是每个对象都需要添加:set(value) { field = value notifyChange()}这就很烦,然后突然想到了可以使用委托这个kotlin的特性来配合完成统一实现:notifyChange()下面是代码首先新建一个抽象类,然后集成DataBinding的BaseObservable// 抽象类 继承baseObservable 因为自己建...
用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类数据的更新!
本文地址:https://blog.csdn.net/qq_19306415/article/details/111839263