Как да внедрим ViewHolder с помощта на запечатан клас в Kotlin

Видях интересна реализация на viewholder в този туит https://twitter.com/AndroidDev/status/972502799496790018

override fun onBindViewHolder(holder: SealedAdapterViewHolder, position: Int) {
  return when (holder) {
    is HeaderHolder -> holder.displayHeader(items[position])
    is DetailsHolder -> holder.displayDetails(items[position])
  }
}

За съжаление не мога да разбера как да внедря thouse holders. И не намерих примери за този трик.

В моите viewholders трябва да разширя RecyclerView.ViewHolder и трябва да разширя запечатания клас, за да мога да го използвам в клаузите „when“. Не се допуска множествено наследяване.

Така че възможно ли е и ако е тогава как?

P.S.

оригиналните автори пишат това:

Можете също да използвате запечатани класове в адаптер RecyclerView. Те са идеално подходящи за ViewHolders - с чист набор от типове, които да се изпращат изрично на всеки притежател. Използван като израз, компилаторът ще даде грешка, ако всички типове не са съпоставени.


person Maksim Turaev    schedule 12.03.2018    source източник
comment
може би като това   -  person Stefan Golubović    schedule 12.03.2018


Отговори (2)


Нещо като това:

sealed class SealedAdapterViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    class HeaderHolder(view: View) : SealedAdapterViewHolder(view)

    class DetailsHolder(view: View) : SealedAdapterViewHolder(view)
}
person veritas1    schedule 12.03.2018

това е в първия пост на темата.

fun foo(holder : SealedAdapterViewHolder){
    when (holder) {
       is HeaderHolder -> holder.displayHeader(items[position])
       is DetailsHolder -> holder.displayDetails(items[position])
    }
}

sealed class SealedAdapterViewHolder(view: View) : RecyclerView.ViewHolder(view)
data class HeaderHolder(val view: View): SealedAdapterViewHolder(view){
    fun displayHeader(...){}
}
data class DetailsHolder(val view: View): SealedAdapterViewHolder(view){
    fun displayDetails(...){}
}
person leonardkraemer    schedule 12.03.2018