android - Kotlin 泛型 - 调用伴随对象方法
问题描述
我有两个RecyclerView.ViewAdapter
非常相同的实现,我想将它们统一为具有类型参数的单个类T
。唯一的区别是一类使用ImageViewHolder
,另一类使用VideoViewHolder
。
class ImageGridAdapter : RecyclerView.Adapter<ImageViewHolder>() {
private val asyncListDiffer = AsyncListDiffer<Image>(this, diffCallback)
init { setHasStableIds(true) }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageViewHolder {
// How to call this companion object method from a generic class?
return ImageViewHolder.from(parent)
}
override fun onBindViewHolder(holder: ImageViewHolder, position: Int) {
holder.bind(asyncListDiffer.currentList[position], dragSelector, lifecycle.get())
}
fun submit(list: List<Image>) = asyncListDiffer.submitList(list)
override fun getItemCount(): Int {
return asyncListDiffer.currentList.size
}
override fun getItemId(position: Int): Long {
return asyncListDiffer.currentList[position].id
}
}
问题:如何*ViewHolder.from(parent)
在 Kotlin 中以通用方式调用?我真的不想创建两个单独的类只是为了覆盖一个方法!
解决方案
您可以使用组合而不是继承,将 ViewHolder 创建委托给作为构造函数参数传递的函数:
class GenericGridAdapter<VH : ViewHolder>(private val viewHolderCreator : (ViewGroup) -> VH) : RecyclerView.Adapter<VH>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH {
return viewHolderCreator.invoke(parent)
}
// Other common methods
}
// And then:
val imageGridAdapter = GenericGridAdapter { ImageViewHolder.from(it) }
val videoGridAdapter = GenericGridAdapter { VideoViewHolder.from(it) }
// or using method references:
val imageGridAdapter = GenericGridAdapter((ImageViewHolder)::from)
val videoGridAdapter = GenericGridAdapter((VideoViewHolder)::from)
推荐阅读
- php - 将 JSON 对象转换为关联的 php 数组
- django - 添加环境变量以激活 Django 项目的 virtualenv 中的文件
- java - 奥利奥后台服务
- laravel - 在未经授权的用户尝试在 laravel 5.0 中查看 PDF 文件时显示登录页面
- javascript - 解析实际上是一个数组的字符串
- javascript - 在可能的情况下,局部变量的`const`被认为是一种好习惯?
- c - tcsendbreak() 中的持续时间单位是什么?
- swift - 让作为泛型传递给超类的嵌套枚举符合与其声明内联的协议会导致无限编译
- haskell - 将 Haskell 中的函数转换为无点表示法
- android - TextView autoSizeTextType 未按预期工作