[英]Kotlin Generics - Call companion object method
我有两个RecyclerView.ViewAdapter
的实现,它们非常相同,我想将它们统一为带有类型参数T
的单个 class 。 唯一的区别是一个 class 使用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
}
}
问题:如何在 Kotlin 中以通用方式调用*ViewHolder.from(parent)
? 我真的不想创建两个单独的类来重写一个方法!
您可以使用组合而不是 inheritance,将 ViewHolder 创建委托给作为构造函数参数传递的 function:
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.