在Kotlin中显式强制转换Android的RecyclerView的ViewHolder时出错:“此强制转换永远不会成功”

时间:2018-12-07 13:04:33

标签: java android kotlin android-recyclerview

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

我通过在库中动态填充RecyclerView来处理视图部分。对于LayoutManager,我创建了一个基于Factory Design Pattern的类,开发人员可以在其中选择所需的LayoutManager和配置。但是在实现AdapterViewHolder包装类时,我遇到了一个问题。

尝试#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

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

请对此进行指导,如何在RecyclerView上实现100%包装?

2 个答案:

答案 0 :(得分:1)

您的库大概依赖于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的属性。

答案 1 :(得分:0)

尝试用这种方法制作viewholder类。

class ItemViewHolder : RecyclerView.ViewHolder {
 constructor(itemView: View) : super(itemView){}

}