繁体   English   中英

Kotlin Generics - 调用同伴 object 方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM