Как реализовать 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])
  }
}

К сожалению, я не могу понять, как реализовать держатели домов. И я не нашел никаких примеров этого трюка.

В моих видоискателях я должен расширить RecyclerView.ViewHolder, и я должен расширить запечатанный класс, чтобы я мог использовать его в «условиях когда». Множественное наследство не допускается.

Так возможно ли это, и если да, то как?

P.S.

первоначальные авторы пишут так:

Вы также можете использовать запечатанные классы в адаптере RecyclerView. Они идеально подходят для ViewHolder — с чистым набором типов для явной отправки каждому держателю. При использовании в качестве выражения компилятор выдаст ошибку, если все типы не совпадают.


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