0

我想在我的应用程序中为所有RecyclerView.Adapter使用公共扩展函数,所以我创建了一个叫做notifyAdapter的ext乐趣,但它不像预期的那样工作。RecyclerView.Adapter的泛型Android

fun <T> RecyclerView.Adapter<RecyclerView.ViewHolder>.notifyAdapter() { 
    updateAll() 
    notifyDataSetChanged() 
} 

当我使用

offlineListAdapter.notifyAdapter()onlineListAdapter.notifyAdapter()

它抛出

不能被应用到接收器OfflineListAdapter

OfflineListAdapter.kt

class OfflineListAdapter : RecyclerView.Adapter<OfflineListAdapter.OfflineListHolder>() { 

     class OfflineListHolder(view: View) : RecyclerView.ViewHolder(view) { 

     } 
    } 

如何使用泛型为所有RecyclerView.Adapter创建公共扩展功能。

在此先感谢。

回答

1

有几种方法可以做到这一点。

  1. 可以标记ViewHolder参数与out差异。这种方式你的功能不是通用的,所以你不能访问其中的确切类型ViewHolder

    fun RecyclerView.Adapter<out RecyclerView.ViewHolder>.notifyAdapter() { ... } 
    
  2. 或者,你可以有一个绑定到是ViewHolder一个子类功能的泛型类型参数。这样,您可以在功能中使用T,例如,如果您愿意,可以创建listOf<T>()

    fun <T : RecyclerView.ViewHolder> RecyclerView.Adapter<T>.notifyAdapter() { ... } 
    
  3. 最后,你也可以利用明星的投影,我认为在这种情况下,会给你完全相同的结果作为第一个解决方案,因为Adapter类的类型参数有一个上限的ViewHolder

    fun RecyclerView.Adapter<*>.notifyAdapter() { ... } 
    

您可以阅读有关方差和预测的官方文档here的更多细节。