I would like to use the enum class to create exhaustive lists for when statements.
I have created my enum class but in onCreateViewHolder() I am still getting error message "A 'return' expression required in a function with a block body ('{...}')". The error goes away when i add else statement. What's strange is that onBindViewHolder works fine even though it implements the same enum elements.
How can I implement the enum here to avoid using else block in onCreateViewHolder()?
enum class ViewHolderType(val ID: Int) {
FOOTER(0),
ITEM(1)
}
override fun getItemViewType(position: Int): Int {
return if (position == currentList.size) {
ViewHolderType.FOOTER.ID
} else {
ViewHolderType.ITEM.ID
}
}
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int,
): MultiViewViewHolder {
when (viewType) {
ViewHolderType.FOOTER.ID -> {
val view = LayoutInflater
.from(parent.context)
.inflate(R.layout.recycler_view_fragment_plus_button_new, parent, false)
return ViewHolder2(view)
}
ViewHolderType.ITEM.ID -> {
val view = LayoutInflater
.from(parent.context)
.inflate(R.layout.recycler_view_fragment, parent, false)
return ViewHolder1(view)
}
}
}
override fun onBindViewHolder(holder: MultiViewViewHolder, position: Int) {
when (getItemViewType(position)) {
ViewHolderType.ITEM.ID -> {
val item = getItem(position)
holder.onBindViewHolderItem(position, item)
}
ViewHolderType.FOOTER.ID -> {
holder.onBindViewHolderFooter()
}
}
}
CodePudding user response:
Do it like this so the subject of when is an enum rather than an Int:
enum class ViewHolderType {
FOOTER,
ITEM
}
override fun getItemViewType(position: Int): Int {
return when (position == currentList.size) {
true -> ViewHolderType.FOOTER
false -> ViewHolderType.ITEM
}.ordinal
}
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int,
): MultiViewViewHolder {
return when (ViewHolderType.values()[viewType]) {
ViewHolderType.FOOTER -> {
val view = LayoutInflater
.from(parent.context)
.inflate(R.layout.recycler_view_fragment_plus_button_new, parent, false)
ViewHolder2(view)
}
ViewHolderType.ITEM -> {
val view = LayoutInflater
.from(parent.context)
.inflate(R.layout.recycler_view_fragment, parent, false)
ViewHolder1(view)
}
}
}
override fun onBindViewHolder(holder: MultiViewViewHolder, position: Int) {
when (ViewHolderType.values()[getItemViewType(position)]) {
ViewHolderType.ITEM -> {
val item = getItem(position)
holder.onBindViewHolderItem(position, item)
}
ViewHolderType.FOOTER -> {
holder.onBindViewHolderFooter()
}
}
}
And you don’t need the ID property in your enum class. Often it is recommended not to use the ordinals of enums like this because it prevents changes from being made to the number and order of enum elements without breaking code elsewhere. But this reason doesn’t matter here since it is only used internally to this class, so it’s perfectly fine.
