我正在使用Room库和Lifecycles开发一个android应用程序。当前,我有两个List Livedata,并通过使用MediatorLivedata和一个recyclerview适配器具有一个Observable流。该应用程序在tablayout中有两个选项卡,每个选项卡都有自己的列表,这些列表具有相同的数据类型但值不同。例如,Livedata1 = Tab1,Livedata2 = Tab2
[当用户选择tab2时,列表更改为tab2,然后返回Tab1,列表更改为tab1并更新tab1中的当前项目,即使我没有更改此选项卡,列表也更改为tab2。
如何解决该问题?
我已经尝试在“用户更改”选项卡上删除MediatorLivedata中的数据源,但问题仍然相同
// ViewModel
private var getAllListOfOrders = MediatorLiveData<List<OrderEntities>>()
init {
getAllListOfOrders.addSource(getAllListPreparingOrders){ getAllListOfOrders.value = it }
}
fun getAllOrders() : LiveData<List<OrderEntities>>{
return getAllListOfOrders
}
fun isForPickUp(tabName: String){
if (!tabName.equals("For Preparing", true)){
getAllListOfOrders.addSource(getAllListPickUpOrders){
getAllListOfOrders.value = it
getAllListOfOrders.removeSource(getAllListPickUpOrders)}
}else{
getAllListOfOrders.addSource(getAllListPreparingOrders){
getAllListOfOrders.removeSource(getAllListPickUpOrders)
getAllListOfOrders.value = it }
}
}
//活动
orderViewModel.getAllOrders().observe(this, Observer {
adapter.setOrderList(it as ArrayList<OrderEntities>)
})
// RecyclerView适配器
fun setOrderList(orderList : ArrayList<OrderEntities>){
this.orderList = orderList
notifyDataSetChanged()
}
用户未更改选项卡列表未更改时的预期结果
我注意到您代码中的某些内容。尝试更换:
if (!tabName.equals("For Preparing", true)){
getAllListOfOrders.addSource(getAllListPickUpOrders){
getAllListOfOrders.value = it
getAllListOfOrders.removeSource(getAllListPickUpOrders)}
}
with:
if (!tabName.equals("For Preparing", true)){
getAllListOfOrders.addSource(getAllListPickUpOrders){
getAllListOfOrders.value = it
getAllListOfOrders.removeSource(getAllListPreparingOrders)}
}
因为看起来您从未删除getAllListPreparingOrders
作为来源。