欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

相关标签: android kotlin