android 使用Kotlin operator 泛型属性委托配合DataBinding,实现2个委托类,全局binding通用

用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类数据的更新!

你可能感兴趣的:(android,kotlin,android,kotlin)