简体   繁体   English

如何在Kotlin中使用密封类实现ViewHolder

[英]How to implement ViewHolder using sealed class in Kotlin

I saw an interesting viewholder implementation in this tweet https://twitter.com/AndroidDev/status/972502799496790018 我在此推文中看到了一个有趣的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])
  }
}

Unfortunately i can't figure out how to implement thouse holders. 不幸的是,我不知道如何实施thouse持有人。 And I didn't find any examples of this trick. 而且我没有找到这个技巧的任何例子。

In my viewholders I have to extend RecyclerView.ViewHolder and I have to extend sealed class so i can use it in "when clauses". 在我的观察者中,我必须扩展RecyclerView.ViewHolder,并且必须扩展密封类,以便可以在“ when子句”中使用它。 Multiple inharitance is not allowed. 不允许多次骚扰。

So is it possible and if it is then how? 这样有可能吗?

PS PS

original authors write this: 原始作者这样写:

You can also use sealed classes in a RecyclerView adapter. 您还可以在RecyclerView适配器中使用密封类。 They're a perfect fit for ViewHolders - with a clean set of types to dispatch explicitly to each holder. 它们非常适合ViewHolders-具有一组清晰的类型可以显式分配给每个所有者。 Used as an expression, the compiler will error if all types aren't matched. 用作表达式时,如果所有类型都不匹配,则编译器将出错。

Something like this: 像这样:

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

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

    class DetailsHolder(view: View) : SealedAdapterViewHolder(view)
}

it's in the first post of the thread. 它在线程的第一篇文章中。

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(...){}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM