我正在使用Room库和生命周期开发一个android应用程序。 当前,我有两个List Livedata,并通过使用MediatorLivedata和一个recyclerview适配器具有一个Observable流。该应用程序在tablayout中有两个选项卡,每个选项卡都有自己的列表,这些列表具有相同的数据类型但具有不同的值。 例如,Livedata1 = Tab1,Livedata2 = Tab2
当用户选择tab2时,列表更改为tab2,然后返回Tab1,列表更改为tab1并更新tab1中的当前项目,即使我不更改选项卡,列表也更改为tab2。
如何解决该问题?
我已经尝试在用户更改选项卡时删除MediatorLivedata中的数据源,但问题仍然相同
// ViewModel
- &Org1
# DefaultOrg defines the organization which is used in the sampleconfig
# of the fabric.git development environment
Name: Org1MSP
# ID to load the MSP definition as
ID: Org1MSP
MSPDir: crypto-config/peerOrganizations/org1.example.com/msp
AnchorPeers:
# AnchorPeers defines the location of peers which can be used
# for cross org gossip communication. Note, this value is only
# encoded in the genesis block in the Application section context
- Host: peer0.org1.example.com
Port: 7051
//活动
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 }
}
}
// RecyclerView适配器
orderViewModel.getAllOrders().observe(this, Observer {
adapter.setOrderList(it as ArrayList<OrderEntities>)
})
用户未更改选项卡列表未更改时的预期结果
答案 0 :(得分:0)
我注意到您代码中的某些内容。尝试更换:
if (!tabName.equals("For Preparing", true)){
getAllListOfOrders.addSource(getAllListPickUpOrders){
getAllListOfOrders.value = it
getAllListOfOrders.removeSource(getAllListPreparingOrders)}
}
具有:
getAllListPreparingOrders
因为看起来您从未删除{{1}}作为来源。
答案 1 :(得分:0)
我不知道您打算在这里设计什么,但是,如果您坚持使用MediatorLiveData进行设计,请阅读此文章:MediatorLiveData to the Rescue
我个人认为正确的设计是对2个观察者使用1个LiveData,并更新一个选项卡的列表。正如我说的,我不知道您的计划是什么,所以选择是您的。