RxJava Текущий список со вложенными Observables - PullRequest
0 голосов
/ 20 мая 2019

В основном у меня есть хранилище, которое возвращает мне Flowable>.Я хочу сохранить структуру списка (а не использовать flatMap для этой цели), потому что мне нужны эти элементы для RecyclerView и я хочу вычислить разницу между предыдущим списком и новым списком.Моя проблема в том, что FeedViewItem может иметь различное содержимое.Например, у FeedViewItem может быть установлен MessageViewChat, а другим переменным задано значение null, а другому FeedViewItem может быть присвоено значение MessageViewChat, равное нулю, а что-то другое - не равно нулю.Теперь некоторые из этих FeedViewItems (например, те, у которых MessageViewChat установлен в значение NULL) имеют вложенный Flowable.И, наконец, на мой вопрос: как мне удалить вложенный объект Flowable (например, внутри MessageViewChat), чтобы у меня был один объект Flowable, который называется, если называется любой из вложенных объектов Flowable.

Я знаю, что вопрос звучит такЯ должен использовать flatMap, но я не совсем понимаю, как.У меня есть список и некоторые элементы внутри этого списка, как мне использовать flowMable, как мне использовать flatMap / switchMap / zip или что-то подобное на таком устройстве?

class FeedViewItem {


    var type: Int = TYPE_CONVERSATION

    var feedViewChat: FeedViewChat? = null

    ...
}

class FeedViewChat {

     var messages: Flowable<List<Message>>? = null


}


    fun getFeedViewItems(): Flowable<MutableList<FeedViewItem>> {
        return dataManager.feedRepository.getFeedItemsFlowable()
                .map { FeedViewItem.convertToViewItems(it, dataManager) }
                .map { currentFeedViewItems -> currentFeedViewItems.groupBy { it.section } }
                .map {
                    it.toSortedMap(Comparator { o1, o2 ->
                        val sectionOneValue = when (o1) {
                            FeedItem.SECTION_NEW -> 1
                            FeedItem.SECTION_LATER -> 2
                            else -> 3
                        }
                        val sectionTwoValue = when (o2) {
                            FeedItem.SECTION_NEW -> 1
                            FeedItem.SECTION_LATER -> 2
                            else -> 3
                        }
                        sectionOneValue - sectionTwoValue
                    })
                }
                .map { currentFeedItemHashMap ->

                    val newFeedSections = mutableMapOf<String, List<FeedViewItem>>()

                    currentFeedItemHashMap.forEach { (key, value) ->

                        val headerText = when (key) {
                            FeedItem.SECTION_LATER -> {
                                "Later"
                            }
                            FeedItem.SECTION_HISTORY -> {
                                "History"
                            }
                            else -> {
                                null
                            }
                        }

                        if (headerText != null) {

                            val feedViewHeader = FeedViewHeader()
                            feedViewHeader.headerText = headerText

                            val feedViewItem = FeedViewItem()
                            feedViewItem.type = FeedViewItem.TYPE_HEADER
                            feedViewItem.feedViewHeader = feedViewHeader
                            feedViewItem.updatedAt = System.currentTimeMillis()
                            feedViewItem.id = headerText.hashCode().toLong()

                            val currentFeedViewItems = value.toMutableList()
                            currentFeedViewItems.add(0, feedViewItem)

                            newFeedSections[key] = currentFeedViewItems

                        } else {

                            newFeedSections[key] = value

                        }

                    }

                    newFeedSections
                }.map {
                    it.values.flatten().toMutableList()
                }.doOnEach {

                    val users: Flowable<List<User>> = dataManager.userRepository.getUsersFlowable()

                    val feedViewContactBar = FeedViewContactBar()
                    feedViewContactBar.users = users

                    val feedViewItem = FeedViewItem()
                    feedViewItem.type = FeedViewItem.TYPE_CONTACT_BAR
                    feedViewItem.feedViewContactBar = feedViewContactBar
                    feedViewItem.updatedAt = System.currentTimeMillis()
                    feedViewItem.id = FeedViewItem.VIEW_ID_CONTACT_BAR

                    it.value?.add(0, feedViewItem)
                }
    }

Последняя часть кода показывает, как я преобразуюмои текучие и в качестве последнего шага я должен был бы устранить этот вложенный Flowables.

...