我无法创建一个Android Architecuture组件ViewModel,它将多个LiveData模型组合成一个LiveData类,供我的Fragment观察 . 我想隐藏片段中的模型细节,并通过各个模型响应外部数据更改 .
问题是我需要ViewModel来观察模型更改,但ViewModel不是LifecycleOwner,因此无法观察 . 由于我不想将LiveData对象传递给UI,因此我陷入困境 .
这可能吗?我是否需要为我的模型放弃LiveData并采用不同的观察模式/工具?
Edit: 补充了伪代码 . 我的实际课程更加复杂和冗长 . 我希望我的意图是可以理解的 .
// 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
}
}
2 回答
希望我的工作满足你的问题 .
我之前制作了一个示例项目,现在将另一个假的liveata集成到这个视图模型中 . Difference of the file
使用MediatorLiveData类将多数据源包装为一个 .
FeedEntryListViewModel.java
在Activity中,您仍然可以使用该语句获取复合
View Model Constructor添加实时数据并绑定到复合实时数据
我建议采取不同的方法:
使用反应流(RxJava)来表示您的模型
使用架构组件中的
lifecycle-reactivestreams
将RxJava Observable转换为LiveData .通过使用RxJava,您可以轻松地将可观察对象合并在一起,并仅使用
LiveData
将该组合公开给视图 . 我建议仅使用LiveData
将状态公开给视图(Fragment
或Activity
) .我写了一篇关于如何做到这一点的article . 你可能会发现它很有用 .