简体   繁体   English

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

[英]Error while explicitly casting Android's RecyclerView's ViewHolder in Kotlin: 'This cast can never succeed'

In Android, I am working on a library to make implementation of RecyclerView easy. 在Android中,我正在使用一个库来RecyclerView实现。 I also want that once a developer has added this library as a dependency in app build.gradle , adding RecyclerView dependency in app build.gradle shouldn't be required. 我还希望,一旦开发者已经加入这个库作为一个依赖app build.gradle ,加入RecyclerView在依赖app build.gradle不应要求。 This library will basically be like a wrapper on RecyclerView . 这个库基本上就像RecyclerView上的包装器。

I handled the view part by inflating RecyclerView dynamically in the library. 我通过在库中动态扩展RecyclerView来处理视图部分。 For LayoutManager , I created a class based on Factory Design Pattern, where the developer can choose which LayoutManager and configuration he wants. 对于LayoutManager ,我创建了一个基于Factory Design Pattern的类,开发人员可以在其中选择他想要的LayoutManager和配置。 But I faced an issue when implementing Adapter and ViewHolder wrapper classes. 但是在实现AdapterViewHolder包装器类时遇到了一个问题。

Attempt #1 尝试#1

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

Error: Missing super type dependency (which meant RecyclerView dependency needs to be present in app build.gradle ) 错误:缺少超级类型依赖项(这意味着RecyclerView依赖项需要存在于app build.gradle

Attempt #2 尝试#2

class ViewHolder(view: View)

and wherever I was using it internally in the library, I tried casing it explicitly as viewHolder as ViewHolder or adapter as RecyclerView.Adapter 并且无论我在库中内部使用它的什么地方,我都尝试将它显式地作为viewHolder as ViewHolder或将adapter as RecyclerView.Adapter viewHolder as ViewHolder adapter as RecyclerView.Adapter

Error: This cast can never succeed. 错误:此强制转换永远不会成功。

Please guide me regarding this, how can I achieve a 100% wrapper on RecyclerView ? 请为此指导我,如何在RecyclerView上实现100%包装?

Your library presumably depends on the RecyclerView library with the following line: 您的库可能依赖于RecyclerView库,其中包含以下行:

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

By using implementation you are not exposing this dependency to modules that depend on your library. 通过使用实现,不会将此依赖项暴露给依赖于库的模块。 Therefore, users of your ViewHolder class will not know about the RecyclerView.ViewHolder class and it causes the described error. 因此,您的ViewHolder类的用户将不了解RecyclerView.ViewHolder类,它会导致所描述的错误。

Try using api to propagate this dependency up the module chain: 尝试使用api在模块链上传播这种依赖关系:

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

Read about the differences here or here . 此处此处了解差异。


Update : You can create a wrapper class and hide the property using internal visibility: 更新 :您可以创建包装器类并使用内部可见性隐藏属性:

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

This is similar to solution #2 but instead of casting to RecyclerView.ViewHolder, you use the property. 这与解决方案2类似,但是您可以使用属性而不是强制转换为RecyclerView.ViewHolder。

Try this way into make viewholder class. 尝试这种方式进入make viewholder类。

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

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在 Kotlin 中将 Dp 转换为 Px - 这种转换永远不会成功 - Convert Dp to Px in Kotlin - This cast can never succeed onBindViewHolder(RecyclerView.ViewHolder持有人,整数位置)-无法访问持有人的“有趣”-Kotlin to Java - onBindViewHolder(RecyclerView.ViewHolder holder, int position) - can't access holder's 'fun' - Kotlin to Java 在多个视图持有者 recyclerview 上投射异常 - Cast exception on multiple viewholder recyclerview 如何访问RecyclerView适配器的ViewHolder的数据源? - How to access the data source of a RecyclerView adapter's ViewHolder? Android错误:从未在数据库上显式调用close() - Android error : close() was never explicitly called on database 使用片段在多个视图持有者回收器视图上投射异常 - Cast exception on multiple viewholder recyclerview with fragment 对RecyclerView的视图的弱引用永不中断? - WeakReference to a RecyclerView's View never breaks? Android - RecyclerView 获取 ViewHolder 中的变量 - Android - RecyclerView get variable in ViewHolder Java转换:如果未在要转换的类中声明接口,可以强制转换到接口吗? - Java casting: can you force a cast to a interface if it's not declared in the to be casted class? 如何从另一个类更新在RecyclerView的ViewHolder中实例化的进度条? - How to update a progressbar that is instantiated within a RecyclerView's ViewHolder, from a different class?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM