java - 在 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 ViewHolder
或
adapter as RecyclerView.Adapter
错误:这个演员永远不会成功。
请指导我,我怎样才能实现 100% 的包装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,而是使用该属性。
推荐阅读
- javascript - 在c3 js中的X轴上的每个类别名称上添加点击事件
- oauth-2.0 - 通过授权码从lepture/Authlib获取Refresh Token
- python - plpython 程序中的 Greenplum pandas 数据框集成(来自数据库内部)
- laravel - 无法安装 guzzlehttp
- apache - 如何使用 htaccess 替换链接的一部分
- django - Django 数据表和多行
- java - Firebase“Parcelable 遇到 IOException 写入可序列化对象”,对象包含 DocumentReference 的 ArrayList
- google-apps-script - 如何将参数传递给 Picker API?
- corda - 对双重支出感到困惑
- c# - 将 JSON 列表中的数据发布到前端的多个表中