Android LiveData : Как объединить два источника данных схожих объектов - PullRequest
1 голос
/ 29 мая 2020
• 1000 сущность с именем Category.

Я могу индивидуально наблюдать за моделью каждого типа, которая возвращает PagedList<? extends Transaction>.

В моем PagedListAdapter я хотел бы показать оба типа элементов. Но моя реализация MediatorLiveData, похоже, работает некорректно. Кажется, что недавний тип заменяет старый тип, и в результате отображается только один тип транзакции.

Я бы хотел видеть все типы транзакций. Ниже приведен мой текущий код.

transactionLiveData = new MediatorLiveData<>();
transactionLiveData.addSource(inTransactionViewModel.getItems(), transactionLiveData::setValue);
transactionLiveData.addSource(outTransactionViewModel.getItems(), transactionLiveData::setValue);
transactionLiveData.observe(requireActivity(), transactionAdapter::submitList);

Я понимаю, что MediatorLiveData не выполняет слияние для вас, а просто уведомляет вас об изменениях.

Как я могу объединить два PagedList в один, а затем отправить его в список?

Я думаю о том, чтобы сделать что-то подобное, но не уверен, как создать экземпляр агрегатора PagedList

class TransactionMerger extends MediatorLiveData<PagedList<? extends Transaction>> {
        PagedList<? extends Transaction> inTransactions;
        PagedList<? extends Transaction> outTransactions;
        PagedList<? extends Transaction> aggregator;

        TransactionMerger(){            
        }

        @Override
        public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super PagedList<? extends Transaction>> observer) {
            super.observe(owner, observer);
        }

        @Override
        public void setValue(PagedList<? extends Transaction> value) {
            if (isInTransactionList(value)) {
                inTransactions = value;
            }else{
                outTransactions = value;
            }
            // TODO Merge the two
            aggregator = mergeLists(inTransactions, outTransactions);
            super.setValue(aggregator );
        }

        private boolean isInTransactionList(PagedList<? extends Transaction> list) {
            return list != null && list.size() > 0 && list.get(0).getTransactionType() == Transaction.TransactionType.In;
        }
    }

Спасибо

...