我想使用 enum
类为 when
语句创建详尽的列表。
我已经创建了我的enum
类,但在onCreateViewHolder()
中我仍然收到错误消息“带有 block 的函数中需要一个'返回'表达式正文('{...}')”
。当我添加 else
语句时,错误消失。奇怪的是,onBindViewHolder
工作正常,即使它实现了相同的枚举元素。
如何在此处实现枚举以避免在 onCreateViewHolder()
中使用 else
block ?
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()
}
}
}
最佳答案
这样做,这样 when
的主题是一个枚举而不是一个 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()
}
}
}
并且您的枚举类中不需要 ID 属性。通常建议不要使用这样的枚举序数,因为它可以防止在不破坏其他地方代码的情况下对枚举元素的数量和顺序进行更改。但这个原因在这里并不重要,因为它仅在此类内部使用,所以完全没问题。
关于kotlin - 使用 kotlin 枚举避免 when 表达式中出现 else 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70964357/