RecyclerView Adapter меняет список при обновлении различных наблюдаемых - PullRequest
1 голос
/ 18 октября 2019

Я занимаюсь разработкой приложения для Android с использованием библиотеки комнат и жизненных циклов. в настоящее время у меня есть два списка Livedata и один поток Observable с помощью MediatorLivedata и один адаптер для повторного просмотра. Приложение имеет две вкладки в 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 }
    }
}

// Activity

orderViewModel.getAllOrders().observe(this, Observer {
        adapter.setOrderList(it as ArrayList<OrderEntities>)
    })

// RecyclerView Adapter

   fun setOrderList(orderList : ArrayList<OrderEntities>){
    this.orderList = orderList
    notifyDataSetChanged()
}

Ожидаемый результат, когда пользователь не изменил вкладку, список не изменится

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Я не знаю, что вы намереваетесь создать здесь, но, если вы настаиваете на разработке с MediatorLiveData, прочитайте эту статью: MediatorLiveData для спасения

Лично я считаю правильнымДизайн состоит в том, чтобы использовать 2 наблюдателя на 1 LiveData и обновлять список одной вкладки. Как я уже сказал, я не знаю, какой у вас план, поэтому выбор за вами.

0 голосов
/ 18 октября 2019

Я заметил что-то в вашем коде. Попробуйте заменить:

if (!tabName.equals("For Preparing", true)){
        getAllListOfOrders.addSource(getAllListPickUpOrders){
            getAllListOfOrders.value = it
            getAllListOfOrders.removeSource(getAllListPickUpOrders)}

    }

на:

if (!tabName.equals("For Preparing", true)){
        getAllListOfOrders.addSource(getAllListPickUpOrders){
            getAllListOfOrders.value = it
            getAllListOfOrders.removeSource(getAllListPreparingOrders)}

    }

, потому что похоже, что вы никогда не удаляете getAllListPreparingOrders в качестве источника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...