【发布时间】:2019-07-03 20:00:52
【问题描述】:
我正在尝试使用泛型实现 viewmodel 观察者,这样做我不需要 7 个观察者,因为我从 7 个不同的 Fragment 收集数据。
目标
由于这 7 个片段将数据存储在不同的 ArrayLists 类型中,因此我创建了一个通用 ViewModel 类来将该数据传递给我的主 Activity(片段持有者)
SharedViewModel
class SharedViewModel<T>: ViewModel() {
var data:MutableLiveData<ArrayList<T>> = MutableLiveData()
fun setData(anyData:ArrayList<T>){
data.value = anyData
}
val getAnyData:LiveData<ArrayList<T>>
get() = data
}
这样做,我只需在每个片段内设置任何数组数据类型
(activity as MainActivity).getViewModelInstance().setData(xArray)
在我的 MainActivity 中,我想检查 xArray 数据类型是否与在 MainActivity 全局声明的类型相同,如果它们相等,则应将当前数组数据值分配给新的空数组
主要活动
private var xArray = arrayListOf<Xclass>()
onCreate()
...
viewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)
viewModel.getAnyData.observe(this, Observer { it:ArrayList<out Any?>
if(it == xArray){
xArray.addAll(it)
}
})
目的
如果我这样做,我会阻止在我的 MainActivity 中为每个片段执行 7 个观察者,而只需使用不同的数组类型更新一个观察者,比较它们并重新签名它们将减少代码,并且对我的架构来说更容易。
问题
有两个问题
- 提到的第一个是如何将观察者在我的 MainActivity 中获得的当前 ArrayList 与我声明的数组进行比较。他们应该检查 it 和 xArray 是否是同一类型的
ArrayLists -
第二个错误是这个
(作为 MainActivity 的活动).getViewModelInstance().setData(xArray)
在.setData(xArray),其突出显示的红色表示Required: Nothing, Found:ArrayList<Xclass>。这很奇怪,因为 SharedViewModel 的 setData 需要传递 Any ArrayList。
谢谢
【问题讨论】:
-
现在最重要的是检查数组是否来自同一类型,我找到了 isArrayOf 方法但它只比较数组的内容而不是定义的类型
标签: android kotlin mvvm fragment viewmodel