RecyclerView Adapter在更新不同的可观察对象时更改列表

时间:2019-10-18 02:10:39

标签: android kotlin android-lifecycle

我正在使用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>)
    })

用户未更改选项卡列表未更改时的预期结果

2 个答案:

答案 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,并更新一个选项卡的列表。正如我说的,我不知道您的计划是什么,所以选择是您的。