【发布时间】:2018-03-08 03:13:27
【问题描述】:
我无法创建一个 Android 架构组件 ViewModel,它将多个 LiveData 模型组合成一个 LiveData 类以供我的 Fragment 观察。我想对 Fragment 隐藏模型详细信息,并通过各个模型响应外部数据更改。
问题是我需要 ViewModel 来观察模型的变化,但 ViewModel 不是 LifecycleOwner,所以它无法观察。由于我不想将 LiveData 对象传递给 UI,所以我被卡住了。
这可能吗?我是否需要为我的模型放弃 LiveData 并求助于不同的观察模式/工具?
编辑:添加了伪代码。我的实际课程更加复杂和冗长。我希望我的意图是可以理解的。
// OneDataModel.kt
class oneDataModel {
val oneDataElement = ""
}
// AnotherDataModel.kt
class anotherDataModel {
val anotherDataElement = 19
}
// OneDataRepository.kt
class OneDataRepository {
val oneDataSet = MutableLiveData<MutableList<oneDataModel>>()
private val dataListener = object: ChildEventListener {
override fun onChildAdded(snapshot: DataSnapshot, p1: String?) {
val newChild = snapshot.getValue(oneDataModel::class.java)
if (newChild != null) {
oneDataSet.value?.add(newChild)
}
}
}
init {
oneDataSet.value = mutableListOf<oneDataModel>()
OneNetworkDataTable.addListener(dataListener)
}
}
// AnotherDataRepository.kt
class AnotherDataRepository {
var anotherDataSet = MutableLiveData<MutableList<anotherDataModel>>()
private val dataListener = object: ChildEventListener {
override fun onChildAdded(snapshot: DataSnapshot, p1: String?) {
val newChild = snapshot.getValue(anotherDataModel::class.java)
if (newChild != null) {
anotherDataSet.value?.add(newChild)
}
}
}
init {
anotherDataSet.value = mutableListOf<anotherDataModel>()
AnotherNetworkDataTable.addListener(dataListener)
}
}
// ComposedViewModel.kt
class ComposedViewModel: ViewModel() {
class ComposedItem {
var dataName: String = "" // From OneDataRepository items
var dataValue: Int = -1 // From AnotherDataRepository items
}
var publishedDataSet = MutableLiveData<MutableList<ComposedItem>>()
//***
//*** WHAT GOES HERE? HOW DO I LISTEN TO EACH OF THE DATA REPOSITORIES AND BUILD UP COMPOSED
//*** ITEMS FOR THE UI?
//***
}
// MyFragment.kt
class MyFragment : Fragment() {
private val composedViewModel: ComposedViewModel by lazy { ViewModelProviders.of(activity).get(ComposedViewModel::class.java) }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_feed, container, false)
recyclerView.adapter = UIAdapter
composedViewModel.publishedDataSet.observe(this, Observer {
UIAdapter.notifyDataSetChanged()
})
return view
}
}
【问题讨论】:
-
您能否为您的问题提供一些示例代码?没有代码很难理解。
-
希望我的想法是正确的。您想要做的事情是删除语句中的 livedata “publishedDataSet”composeViewModel.publishedDataSet.observe(...,...) 以及片段如何具有视图模型并且可以自动观察并更新 UI ?
-
谢谢@Long Ranger,自从我被卡住后,这就是我在分支上采用的方法。我不喜欢的是我的 ViewModel 基本上是空的,只是传递了 LiveData 存储库成员。这意味着 Fragment 和 Adapter 必须了解数据库模式才能知道从哪里获得他们需要的东西。感觉更像是 MVC 或 MVP,我不认为 AAC 打算这样做。
标签: android android-architecture-components