如何将自定义 MutableLiveData 转换为自定义 LiveData?
How do I cast custom MutableLiveData to custom LiveData?
假设有2个类:
class MyLiveData:LiveData<Int>()
class MyMutableLiveData:MutableLiveData<Int>()
允许从 MutableLiveData
转换为 LiveData
:
val ld1=MutableLiveData<Int>()
val ld2:LiveData<Int> = ld1 //ok
但是你不能这样转换你自己的实现:
val mutable=MyMutableLiveData()
val immutable:MyLiveData = mutable //type missmatch
我知道 MutableLiveData 扩展了 LiveData 这就是为什么它们是 castable.But 我不能 MyMutableLiveData
扩展 MyLiveData
因为在这种情况下它不会可变
有什么解决方法吗?
UPD:我想我需要展示扩展 LiveData
的动机。我正在尝试实现 MutableLiveDataCollection
,它不仅通过 setValue/postValue
通知值变化但也可以修改值,例如添加新的 elements.I 很惊讶没有针对此的本地解决方案。
无论如何要观察 modify
事件必须有额外的观察 method.And 此方法必须在不可变部分内又名 LiveDataCollection
因为视图将调用 it.Inheritance 是这里恕我直言的自然解决方案。
关键思想在于 MutableLiveData
class.The 这个 class 唯一做的事情 - 它是否改变 setValue/postValue
methods.I 上的访问修饰符可以做同样 trick.Therefore 最终代码将是:
open class LiveDataCollection<K,
L:MutableCollection<K>,
M:Collection<K>>: LiveData<L>() {
private var active=false
private var diffObservers = ArrayList<Observer<M>>()
fun observe(owner: LifecycleOwner, valueObserver: Observer<L>, diffObserver: Observer<M>) {
super.observe(owner,valueObserver)
diffObservers.add(diffObserver)
}
protected open fun addItems(toAdd:M) {
value?.addAll(toAdd)
if (active)
for (observer in diffObservers)
observer.onChanged(toAdd)
}
override fun removeObservers(owner: LifecycleOwner) {
super.removeObservers(owner)
diffObservers= ArrayList()
}
override fun onActive() {
super.onActive()
active=true
}
override fun onInactive() {
super.onInactive()
active=false
}
}
class MutableLiveDataCollection<K,L:MutableCollection<K>,
M:Collection<K>>: LiveDataCollection<K,L,M>() {
public override fun addItems(toAdd:M) {
super.addItems(toAdd)
}
public override fun postValue(value: L) {
super.postValue(value)
}
public override fun setValue(value: L) {
super.setValue(value)
}
}
假设有2个类:
class MyLiveData:LiveData<Int>()
class MyMutableLiveData:MutableLiveData<Int>()
允许从 MutableLiveData
转换为 LiveData
:
val ld1=MutableLiveData<Int>()
val ld2:LiveData<Int> = ld1 //ok
但是你不能这样转换你自己的实现:
val mutable=MyMutableLiveData()
val immutable:MyLiveData = mutable //type missmatch
我知道 MutableLiveData 扩展了 LiveData 这就是为什么它们是 castable.But 我不能 MyMutableLiveData
扩展 MyLiveData
因为在这种情况下它不会可变
有什么解决方法吗?
UPD:我想我需要展示扩展 LiveData
的动机。我正在尝试实现 MutableLiveDataCollection
,它不仅通过 setValue/postValue
通知值变化但也可以修改值,例如添加新的 elements.I 很惊讶没有针对此的本地解决方案。
无论如何要观察 modify
事件必须有额外的观察 method.And 此方法必须在不可变部分内又名 LiveDataCollection
因为视图将调用 it.Inheritance 是这里恕我直言的自然解决方案。
关键思想在于 MutableLiveData
class.The 这个 class 唯一做的事情 - 它是否改变 setValue/postValue
methods.I 上的访问修饰符可以做同样 trick.Therefore 最终代码将是:
open class LiveDataCollection<K,
L:MutableCollection<K>,
M:Collection<K>>: LiveData<L>() {
private var active=false
private var diffObservers = ArrayList<Observer<M>>()
fun observe(owner: LifecycleOwner, valueObserver: Observer<L>, diffObserver: Observer<M>) {
super.observe(owner,valueObserver)
diffObservers.add(diffObserver)
}
protected open fun addItems(toAdd:M) {
value?.addAll(toAdd)
if (active)
for (observer in diffObservers)
observer.onChanged(toAdd)
}
override fun removeObservers(owner: LifecycleOwner) {
super.removeObservers(owner)
diffObservers= ArrayList()
}
override fun onActive() {
super.onActive()
active=true
}
override fun onInactive() {
super.onInactive()
active=false
}
}
class MutableLiveDataCollection<K,L:MutableCollection<K>,
M:Collection<K>>: LiveDataCollection<K,L,M>() {
public override fun addItems(toAdd:M) {
super.addItems(toAdd)
}
public override fun postValue(value: L) {
super.postValue(value)
}
public override fun setValue(value: L) {
super.setValue(value)
}
}