首页 > 解决方案 > 如何使用 Kotlin 创建通用 RecyclerView.Adapter

问题描述

我创建了一个扩展 RecyclerView.Adapter 的 Java 类。它是通用的,可以接受任何 SwipeableViewHolder 类型的 RecyclerView.ViewHolder 类:这是它的定义方式:

public abstract class SwipeableAdapter<T extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<T> {

     @Override
    public void onBindViewHolder(T holder, int position) {
        SwipeableViewHolder viewHolder = (SwipeableViewHolder) holder;

        ...
     }

}

这一切都很好。但是,当我尝试将其转换为 Kotlin 时,在 onBindViewHolder 函数中出现错误:

abstract class SwipeableAdapter<T : RecyclerView.ViewHolder>(protected var mContext: Context) :
        RecyclerView.Adapter<T>() {    

    override fun onBindViewHolder(holder: T, position: Int) {

            val viewHolder = holder as SwipeableViewHolder

            ...
    }

}

这是 SwipeableViewHolder 类

open inner class SwipeableViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        @BindView(R.id.text_roll) internal var text_1: TextView? = null
        @BindView(R.id.text_trade) internal var text_2: TextView? = null
        @BindView(R.id.text_delete) internal var text_2: TextView? = null

        init {
            ButterKnife.bind(this, itemView)
        }
    }

当我尝试将持有人转换为 SwipeableViewHolder 时出现错误。错误是:“需要一个类型参数。如果您不想传递类型参数,请使用 SwipeableViewHolder<*>”

我已经尝试了很多不同的方法来实现这一点,但似乎无法弄清楚。

Android Studio 版本:3.5.3 KOtlin 插件编译器:1.3

标签: androidgenericskotlinandroid-recyclerview

解决方案


因为SwipeableViewHolder是一个内部SwipeableAdapter(它需要一个类型参数),所以你必须指定类型参数SwipeableAdapter是什么作为你的演员的一部分:

val viewHolder = holder as SwipeableAdapter<*>.SwipeableViewHolder

推荐阅读