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

时间:2018-03-12 12:06:03

标签: android android-recyclerview kotlin sealed

我在这条推文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持有者。我没有找到任何这个技巧的例子。

在我的视图中,我必须扩展RecyclerView.ViewHolder,我必须扩展密封类,以便我可以在" when子句"中使用它。不允许多次吸入。

那么它是否可能,如果它是如何呢?

P.S。

原作者写道:

  

您还可以在RecyclerView适配器中使用密封类。他们是一个   完美适合ViewHolders - 提供一组干净的类型   明确地对每个持有人。用作表达式,编译器将   如果所有类型都不匹配,则会出错。

2 个答案:

答案 0 :(得分:4)

这样的事情:

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

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

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

答案 1 :(得分:1)

它在线程的第一篇文章中。

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