【问题标题】:Generics for RecyclerView.Adapter AndroidRecyclerView.Adapter Android 的泛型
【发布时间】:2017-04-01 03:50:29
【问题描述】:

我试图在我的应用程序中为所有 RecyclerView.Adapter 使用一个通用扩展函数,因此我创建了一个名为 notifyAdapter 的 ext fun,但它没有按预期工作。

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 创建一个通用扩展函数。

提前致谢。

【问题讨论】:

    标签: android kotlin android-recyclerview kotlin-extension


    【解决方案1】:

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

    1. 您可以用out 方差标记ViewHolder 参数。这样您的函数就不是通用的,因此您将无法访问其中 ViewHolder 的确切类型。

      fun RecyclerView.Adapter<out RecyclerView.ViewHolder>.notifyAdapter() {  ...  }
      
    2. 或者,您可以为绑定为ViewHolder 子类的函数设置一个泛型类型参数。这样您就可以在函数内部使用T,例如,您可以根据需要创建一个listOf&lt;T&gt;()

      fun <T : RecyclerView.ViewHolder> RecyclerView.Adapter<T>.notifyAdapter() {  ...  }
      
    3. 最后,您还可以使用星形投影,我相信在这种情况下,它会给您提供与第一个解决方案完全相同的结果,因为 Adapter 类的类型参数的上限为 ViewHolder

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

    您可以在官方文档here 中阅读有关方差和预测的更多详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 2013-01-01
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 2018-11-26
      • 1970-01-01
      相关资源
      最近更新 更多