【问题标题】:Type Mismatch with Kotlin Generic Adapter类型与 Kotlin 通用适配器不匹配
【发布时间】:2020-08-18 12:35:06
【问题描述】:

我正在尝试创建一个 Base Adapter 类,它可以被所有其他 RecyclerView 适配器扩展,因为它们彼此之间没有太大区别。

这是我的BaseAdapter 课程:

private const val IS_EMPTY = 0
private const val IS_NOT_EMPTY = 1

abstract class BaseAdapter<T>(
    @LayoutRes open val layoutId: Int,
    private val dataList: ArrayList<T>?
) : RecyclerView.Adapter<BaseViewHolder<Any>>() {

    abstract fun setViewHolder(parent: ViewGroup): BaseViewHolder<Any>
    abstract fun bind(containerView: View, item: T)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<Any> {
        return setViewHolder(parent)
    }

    override fun onBindViewHolder(holder: BaseViewHolder<Any>, position: Int) {
        bind(holder.containerView, dataList!![position])
    }

    override fun getItemCount(): Int = dataList!!.size

    override fun getItemViewType(position: Int): Int = if (dataList!!.size == 0) IS_EMPTY else IS_NOT_EMPTY
}

这是我的BaseViewHolder 课程:

abstract class BaseViewHolder<in T: Any>(override val containerView: View) : RecyclerView.ViewHolder(containerView),
    LayoutContainer

我正在尝试实现它的类 (LessonsRecyclerViewAdapter) 中的一个 sn-p:

override fun setViewHolder(parent: ViewGroup): BaseViewHolder<Any> {
        val view = LayoutInflater.from(parent.context).inflate(layoutId, parent, false)
        return LessonsViewHolder(view)
        //Type mismatch: Required: BaseViewHolder<Any> Found: LessonsRecyclerViewAdapter.LessonsViewHolder
    }

LessonsViewHolder 只是一个空类,扩展了BaseViewHolder

class LessonsViewHolder(override val containerView: View): BaseViewHolder<Lesson>(containerView)

LessonsViewHolder 扩展BaseViewHolder 时,为什么会出现类型不匹配错误?

【问题讨论】:

    标签: android kotlin generics android-recyclerview adapter


    【解决方案1】:

    那是因为你混合了 TAny,试试这个:
    BaseViewHolder

    abstract class BaseViewHolder<T>(override val containerView: View) :
        RecyclerView.ViewHolder(containerView),
        LayoutContainer
    

    基础视图适配器

    abstract class BaseAdapter<T>(
        @LayoutRes open val layoutId: Int,
        private val dataList: ArrayList<T>?
    ) : RecyclerView.Adapter<BaseViewHolder<T>>() {
    
        abstract fun setViewHolder(parent: ViewGroup): BaseViewHolder<T>
        abstract fun bind(containerView: View, item: T)
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<T> {
            return setViewHolder(parent)
        }
    
        override fun onBindViewHolder(holder: BaseViewHolder<T>, position: Int) {
            bind(holder.containerView, dataList!![position])
        }
    
        override fun getItemCount(): Int = dataList!!.size
    
        override fun getItemViewType(position: Int): Int =
            if (dataList!!.size == 0) IS_EMPTY else IS_NOT_EMPTY
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      相关资源
      最近更新 更多