使用 kotlin enum 来避免 when 表达式中的 else 语句

Use kotlin enum to avoid else statement in when expressions

我想使用 enum class 为 when 语句创建详尽列表。

我已经创建了 enum class,但在 onCreateViewHolder() 中我仍然收到错误消息 "A 'return' expression required in a function with a block body ('{...}')"。当我添加 else 语句时,错误消失了。奇怪的是 onBindViewHolder 即使实现相同的枚举元素也能正常工作。

如何在此处实现枚举以避免在 onCreateViewHolder() 中使用 else 块?

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

而且您不需要枚举 class 中的 ID 属性。通常建议不要像这样使用枚举的序数,因为它可以防止在不破坏其他地方代码的情况下更改枚举元素的数量和顺序。但是这个原因在这里并不重要,因为它只是内部使用这个class,所以完全没问题。