1

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

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

当我使用

offlineListAdapter.notifyAdapter()或者onlineListAdapter.notifyAdapter()

它抛出

无法应用于接收者 OfflineListAdapter

离线列表适配器.kt

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

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

      }
    }

如何为所有RecyclerView.Adapter使用泛型的人创建一个通用的扩展函数。

提前致谢。

4

1 回答 1

3

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

  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() {  ...  }
    

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

于 2017-04-01T06:11:59.923 回答