RecyclerView.Adapter Android的泛型

时间:2017-04-01 03:50:30

标签: android android-recyclerview kotlin recycler-adapter kotlin-extension

我正在尝试为我的应用中的所有RecyclerView.Adapter使用通用扩展功能,因此我创建了一个名为notifyAdapter的扩展功能,但它没有按预期工作。

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) {

      }
    }

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

提前致谢。

1 个答案:

答案 0 :(得分: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() {  ...  }
    
  4. 您可以在官方文档here中详细了解差异和预测。