Как отобразить карту внутри утилита - PullRequest
0 голосов
/ 08 апреля 2020

У меня Map<String<List<Person>>, строка должна действовать как заголовок, а значения строки (List<Person>) должны действовать как список элементов.

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

override fun getItemViewType(position: Int): Int {
    if (position == 0) {
        return Type.HEADER.ordinal
    } else {
        return Type.ROW.ordinal
    }
}

Мой вопрос: как я могу отобразить Map<String<List<SomeClass>>, поэтому ключи вернут Type.HEADER.ordinal, а значения вернут Type.ROW.ordinal

1 Ответ

2 голосов
/ 08 апреля 2020

Адаптеры в Android должны работать со списком предметов. Вам нужно будет сопоставить ваш Map объект с List

. Я предлагаю вам использовать класс Sealed для другого типа строки, которую вы хотите показать в вашем адаптере, и иметь одну реализацию для вашего заголовка. и другое для вашего лица:

sealed class Item {
    data class HeaderItem(val title: String) : Item()
    data class PersonItem(val person: Person) : Item()
}

Затем вам нужно отобразить ваш Map<String, List<Person>> объект на List<Item>

val myMap: Map<String, List<Person>> = getData()
val myItems: List<Item> = myMap.flatMap { listOf(Item.HeaderItem(it.key)) + it.value.map { Item.PersonItem(it) } }

И в ваш адаптер, потому что он будет иметь List<Item>, когда он запрашивает тип просмотра позиции, вы можете сделать что-то вроде:

class MyAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder> {
    ...
    var items: List<Item> = listOf()

    fun addItem(newItems: List<Item>) {
        items = items + newItems
    }

    override fun getItemViewType(position: Int): Int = when (items[position]) {
        is Item.HeaderItem -> Type.HEADER.ordinal
        is Item.PersonItem -> Type.ROW.ordinal
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...