RecyclerView.Adapter Android 的泛型
Generics for RecyclerView.Adapter Android
我试图在我的应用程序中为所有 RecyclerView.Adapter
使用通用扩展功能,因此我创建了一个名为 notifyAdapter 的扩展功能,但它没有按预期工作。
fun <T> RecyclerView.Adapter<RecyclerView.ViewHolder>.notifyAdapter() {
updateAll()
notifyDataSetChanged()
}
当我使用
offlineListAdapter.notifyAdapter()
或 onlineListAdapter.notifyAdapter()
它抛出
Cannot be applied to receiver OfflineListAdapter
OfflineListAdapter.kt
class OfflineListAdapter : RecyclerView.Adapter<OfflineListAdapter.OfflineListHolder>() {
class OfflineListHolder(view: View) : RecyclerView.ViewHolder(view) {
}
}
如何使用泛型为所有 RecyclerView.Adapter
创建通用扩展函数。
提前致谢。
有几种方法可以做到这一点。
您可以用 out
方差标记 ViewHolder
参数。这样你的函数就不是通用的,所以你将无法访问其中 ViewHolder
的确切类型。
fun RecyclerView.Adapter<out RecyclerView.ViewHolder>.notifyAdapter() { ... }
或者,您可以为绑定为 ViewHolder
的子class 的函数设置泛型类型参数。这样你就可以在函数内部使用 T
,例如,如果你愿意,你可以创建一个 listOf<T>()
。
fun <T : RecyclerView.ViewHolder> RecyclerView.Adapter<T>.notifyAdapter() { ... }
最后,您还可以使用星投影,我相信在这种情况下,它会给您与第一个解决方案完全相同的结果,因为 Adapter
class 的上限为 ViewHolder
.
fun RecyclerView.Adapter<*>.notifyAdapter() { ... }
您可以在官方文档中阅读有关方差和预测的更多详细信息 here。
我试图在我的应用程序中为所有 RecyclerView.Adapter
使用通用扩展功能,因此我创建了一个名为 notifyAdapter 的扩展功能,但它没有按预期工作。
fun <T> RecyclerView.Adapter<RecyclerView.ViewHolder>.notifyAdapter() {
updateAll()
notifyDataSetChanged()
}
当我使用
offlineListAdapter.notifyAdapter()
或 onlineListAdapter.notifyAdapter()
它抛出
Cannot be applied to receiver OfflineListAdapter
OfflineListAdapter.kt
class OfflineListAdapter : RecyclerView.Adapter<OfflineListAdapter.OfflineListHolder>() {
class OfflineListHolder(view: View) : RecyclerView.ViewHolder(view) {
}
}
如何使用泛型为所有 RecyclerView.Adapter
创建通用扩展函数。
提前致谢。
有几种方法可以做到这一点。
您可以用
out
方差标记ViewHolder
参数。这样你的函数就不是通用的,所以你将无法访问其中ViewHolder
的确切类型。fun RecyclerView.Adapter<out RecyclerView.ViewHolder>.notifyAdapter() { ... }
或者,您可以为绑定为
ViewHolder
的子class 的函数设置泛型类型参数。这样你就可以在函数内部使用T
,例如,如果你愿意,你可以创建一个listOf<T>()
。fun <T : RecyclerView.ViewHolder> RecyclerView.Adapter<T>.notifyAdapter() { ... }
最后,您还可以使用星投影,我相信在这种情况下,它会给您与第一个解决方案完全相同的结果,因为
Adapter
class 的上限为ViewHolder
.fun RecyclerView.Adapter<*>.notifyAdapter() { ... }
您可以在官方文档中阅读有关方差和预测的更多详细信息 here。