I have an abstract class:
abstract class AbstractViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
And several childs:
class LabelViewHolder(itemView: View) : AbstractViewHolder(itemView) {
val name: TextView = itemView.label
}
class ButtonViewHolder(itemView: View) : AbstractViewHolder(itemView) {
val name: TextView = itemView.button
}
In onCreateViewHolder()
I want to bypass all ViewTypes with when
:
return when (viewType) {
ViewType.LABEL.id -> {
val view = LayoutInflater.from(viewGroup.context).inflate(R.layout.row_label, viewGroup, false)
LabelViewHolder(view)
}
ViewType.BUTTON.id -> {
val view = LayoutInflater.from(viewGroup.context).inflate(R.layout.row_button, viewGroup, false)
ButtonViewHolder(view)
}
In order to not write the same for many when
branches, I want to use a function like this:
return when (viewType) {
ViewType.LABEL.id -> getNewViewHolder(viewGroup, R.layout.row_label, LabelViewHolder::class.java)
ViewType.BUTTON.id -> getNewViewHolder(viewGroup, R.layout.row_button, ButtonViewHolder::class.java)
}
private fun getNewViewHolder(viewGroup: ViewGroup, @LayoutRes layoutRes: Int, cls: Class<out AbstractViewHolder>): AbstractViewHolder {
val view = LayoutInflater.from(viewGroup.context).inflate(layoutRes, viewGroup, false)
return cls.newInstance() // cls(view) is not allowed.
}
As you see, I cannot return an object of AbstractViewHolder child, because it doesn't allow me to create a class with parameter view
. Is it possible to pass a class to the function and create it's object?