Ошибка ClassCastException при реализации Mediator LiveData

Я пытаюсь использовать данные Mediator Live для объединения двух Livedata. Методы, написанные на ViewModel и Fragment, показаны ниже. Я получаю сообщение об ошибке исключения приведения класса (подробности приведены ниже). Не могли бы вы подсказать, что пошло не так. Возможно, я думал, что MediatorLive может принимать значения из двух Live Data, но я не мог этого понять, и, следовательно, просьба к кодерам. Пожалуйста, сообщите и заранее спасибо за помощь.

//ЖивыеДанные -1

public LiveData<GrpMsgTimestamp> getlastRec(Long lastbookID, String groupID)
    {
    return bookRepository.getlatest(lastbookID,groupID);
    }

//ЖивыеДанные -2

    public LiveData<Integer> getNoOfUnreadBook(Long lastbookID, String groupID)//Final to be kept
    {
    return bookRepository.getNoOfUnreadBook(lasbookID,groupID);
    }

//Метод посредника

    MediatorLiveData liveDataMerger = new MediatorLiveData<GrpIDandLatestMsg>();

    public MediatorLiveData getLiveDataMerger(Long lastmsgID,String groupID) {
    liveDataMerger.addSource(getlastRec(lastbookID,groupID),value->liveDataMerger.setValue(getlastRec(lastbookID,groupID)));
        liveDataMerger.addSource(getNoOfUnreadBook(lastgroupID,groupID), value -> liveDataMerger.setValue(getNoOfUnreadBook(lastbookID,groupID)));

    return liveDataMerger;
    }

//Наблюдатель во фрагменте

mViewModel.getLiveDataMerger(chatList.getLastbookID(),chatList.getGroupID()).observe(getActivity(), new Observer<GrpIDandLatestBook>() {
                    @Override
                    public void onChanged(@Nullable final GrpIDandLatestBook newName) {
                        // Update the UI, in this case, a TextView.
                        if(newName != null) {
                            chatList.setLast_msg(newName.getBook());
                            chatList.setLasttimestamp(String.valueOf(newName.getTimestamp()));
                            chatList.setNoofunreadBook(String.valueOf(newName.getMsgcount()));

                        }
                    }

Ошибка :-

java.lang.ClassCastException: android.arch.lifecycle.ComputableLiveData$1 cannot be cast to         com.support.android.designlibdemo.database.inernal.ModelClass.GrpIDandLatestMsg
    at com.support.android.designlibdemo.View.UI.FragmentChatList$1$1.onChanged(FragmentChatList.java:61)
    at android.arch.lifecycle.LiveData.considerNotify(LiveData.java:109)
    at android.arch.lifecycle.LiveData.dispatchingValue(LiveData.java:126)
    at android.arch.lifecycle.LiveData.setValue(LiveData.java:282)
    at android.arch.lifecycle.MutableLiveData.setValue(MutableLiveData.java:33)
    at com.support.android.designlibdemo.ViewModel.ChatListViewModel.lambda$getLiveDataMerger$1$ChatListViewModel(ChatListViewModel.java:65)

Thanks 

person Sukesh Saxena    schedule 25.12.2018    source источник
comment
Вы не добавили сюда достаточно кода, чтобы люди могли решить вашу проблему. Это все, что я вижу из этого.   -  person EpicPandaForce    schedule 04.01.2019
comment
Спасибо за ответ. Это то, что я вложил в свой проект. Буду признателен, если вы можете привести пример использования MediatorLiveData, который поможет мне лучше понять. Спасибо заранее за помощь.   -  person Sukesh Saxena    schedule 04.01.2019
comment
См. stackoverflow.com/questions/53994960/   -  person EpicPandaForce    schedule 04.01.2019


Ответы (1)


Это класс, который я создал, чтобы расплавить 2 разных списка одного и того же предка.

class MelterFavorites extends MediatorLiveData<List<FavoriteEntity>> {
    // ...
    private List<FavoriteEntity>   tmpFavoriteCities        = null;
    private List<FavoriteEntity>   tmpFavoriteSellPoints    = null;

    private final Observer<List<FavoriteCity>> cityListObserver = new Observer<List<FavoriteCity>>() {
        @Override
        public void onChanged(final List<FavoriteCity> favoriteCityList) {
            // ...
            tmpFavoriteCities.clear();

            // ...
            if (favoriteCityList != null) {
                tmpFavoriteCities.addAll(favoriteCityList);
            }

            // melt results
            final List<FavoriteEntity> meltedFavorites = meltFavorites(tmpFavoriteCities, tmpFavoriteSellPoints);

            // ...
            setValue(meltedFavorites);
        }
    };

    private final Observer<List<FavoriteSellPoint>> sellPointListObserver = new Observer<List<FavoriteSellPoint>>() {
        @Override
        public void onChanged(final List<FavoriteSellPoint> favoriteSellPointList) {
            // ...
            tmpFavoriteSellPoints.clear();

            // ...
            if (favoriteSellPointList != null) {
                tmpFavoriteSellPoints.addAll(favoriteSellPointList);
            }

            // melt results
            final List<FavoriteEntity> meltedFavorites = meltFavorites(tmpFavoriteCities, tmpFavoriteSellPoints);

            // ...
            setValue(meltedFavorites);
        }
    };

    private List<FavoriteEntity> meltFavorites(final List<FavoriteEntity> favoriteCities, final List<FavoriteEntity> favoriteSellPoints) {
        final TreeSet<FavoriteEntity> allFavorites = new TreeSet<>();

        allFavorites.addAll(favoriteCities);
        allFavorites.addAll(favoriteSellPoints);

        return new ArrayList<>(allFavorites);
    }

    public MelterFavorites(final LiveData<List<FavoriteCity>> favoriteCities, LiveData<List<FavoriteSellPoint>> favoriteSellPoints) {
        // build internal temporary list
        tmpFavoriteCities       = new ArrayList<FavoriteEntity>();
        tmpFavoriteSellPoints   = new ArrayList<FavoriteEntity>();

        addSource(favoriteCities,       cityListObserver);
        addSource(favoriteSellPoints,   sellPointListObserver);
    }
}
person Stefano Carfagna    schedule 05.03.2019