Адаптеры в 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
}
}