java - 在 Kotlin 中显式转换 Android 的 RecyclerView 的 ViewHolder 时出错 : 'This cast can never succeed'

标签 java android kotlin android-recyclerview

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

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

尝试#1

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

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

尝试#2

class ViewHolder(view: View)

无论我在库内部使用它,我都尝试将其显式命名为 viewHolder as ViewHolder 或者 适配器为 RecyclerView.Adapter

错误:此转换永远不会成功。

请指导我,如何在 RecyclerView 上实现 100% 包装?

最佳答案

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

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

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

尝试使用 api 在模块链中传播此依赖关系:

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

了解差异 herehere .

<小时/>

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

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

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

关于java - 在 Kotlin 中显式转换 Android 的 RecyclerView 的 ViewHolder 时出错 : 'This cast can never succeed' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53670164/

相关文章:

java - 从java更改命令的工作目录

java - 从 Android 访问 servlet 时维护 HTTP session

java - 我的 Eclipse 在模拟器中安装另一个应用程序而不是我的应用程序

android - 将数据从一个 Activity 设置到另一个 Activity

kotlin - 我可以比较 Kotlin 中的两个 float 是否相等吗?

java - 学习 "large-scale"Java技术

java - jackson 序列化 csv 属性顺序

android - 如何保持我的应用程序服务继续运行,即使应用程序从 MI 手机中的任务管理器关闭

android - RecyclerView - 删除行总是删除最后一行

android - 条件失败时无法停止 CoroutineWorker