android 使用Kotlin operator 泛型属性委托配合DataBinding,实现2个委托类,全局binding通用
16lz
2022-07-21
用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类数据的更新!
更多相关文章
- 箭头函数的基础使用
- NPM 和webpack 的基础使用
- Python list sort方法的具体使用
- 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
- android 使用html5作布局文件: webview跟javascript交互
- Android(安卓)Resource介绍和使用
- "Failed to fetch URL https://dl-ssl.google.com/android/repos
- 使用NetBeans搭建Android开发环境
- android ndk编译x264开源(用于android的ffmpeg中进行软编码)