首页 > 解决方案 > 在 Kotlin 中显式投射 Android 的 RecyclerView 的 ViewHolder 时出错:“此投射永远不会成功”

问题描述

在 Android 中,我正在开发一个库以简化实现RecyclerView。我还希望,一旦开发人员将此库添加为 in 的依赖项,就不需要app build.gradle添加RecyclerView依赖项。app build.gradle这个库基本上就像RecyclerView.

RecyclerView我通过在库中动态膨胀来处理视图部分。对于LayoutManager,我创建了一个基于工厂设计模式的类,开发人员可以在其中选择LayoutManager他想要的配置。Adapter但是我在实现和ViewHolder包装类时遇到了一个问题。

尝试#1

open class ViewHolder(view: View) : RecyclerView.ViewHolder(view)

错误:缺少超类型依赖(这意味着RecyclerView依赖需要存在于 中app build.gradle

尝试#2

class ViewHolder(view: View)

并且无论我在图书馆内部使用它的什么地方,我都尝试将它明确地封装为viewHolder as ViewHolderadapter as RecyclerView.Adapter

错误:这个演员永远不会成功。

请指导我,我怎样才能实现 100% 的包装RecyclerView

标签: javaandroidkotlinandroid-recyclerview

解决方案


您的库可能依赖于具有以下行的 RecyclerView 库:

implementation "com.android.support:recyclerview-v7:$version"

通过使用实现,您不会将此依赖项暴露给依赖于您的库的模块。因此,您的 ViewHolder 类的用户将不知道 RecyclerView.ViewHolder 类,它会导致所描述的错误。

尝试使用api将此依赖项传播到模块链上:

api "com.android.support:recyclerview-v7:$version"

阅读此处此处的差异。


更新:您可以创建一个包装类并使用内部可见性隐藏属性:

open class ViewHolder(view: View) {
    internal val recyclerHolder = RecyclerView.ViewHolder(view)
}

这类似于解决方案 #2,但不是强制转换为 RecyclerView.ViewHolder,而是使用该属性。


推荐阅读