用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://www.uj5u.com/yidong/241871.html
標籤:其他
上一篇:Android 布局優化方案
