kotlin - 使用 kotlin 枚举避免 when 表达式中出现 else 语句

标签 kotlin enums

我想使用 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/

相关文章:

java - GraphQL Java 未正确检测 kotlin 枚举

java - 如何在 Java 中隐藏枚举值?

c# - 如何使用 C#(在 unity3d 中)访问另一个类?

java - 如何修复MainActivity? kotlin.UninitializedPropertyAccessException : lateinit property compositeDiposable has not been initialized

kotlin - 无法访问 Kotlin 中抽象类的成员函数?难道是我理解错了?

kotlin - 如何将变量从main函数传递给另一个函数并修改它? ( Kotlin )

swift - 为什么我不能将 Int 类型的枚举大小写在单引号中?

kotlin - 错误:使用提供的参数无法调用以下任何函数

android - Activity 中的旧 Intent 从通知开始

c++ - 枚举和函数