Я пытаюсь использовать общую функцию расширения для всех RecyclerView.Adapter
в моем приложении, поэтому я создал ext fun, называемый 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) { } }
Как создать общую функцию расширения для всех RecyclerView.Adapter
с использованием Generics.
Заранее спасибо.
Есть несколько способов сделать это.
Вы можете пометить параметр ViewHolder
с помощью дисперсии. Таким образом, ваша функция не является общей, поэтому у вас не будет доступа к точному типу ViewHolder
.
fun RecyclerView.Adapter<out RecyclerView.ViewHolder>.notifyAdapter() { ... }
Кроме того, у вас может быть параметр общего типа для функции, которая должна быть подклассом ViewHolder
. Таким образом, вы можете использовать T
внутри функции, например, вы могли бы создать listOf<T>()
если хотите.
fun <T : RecyclerView.ViewHolder> RecyclerView.Adapter<T>.notifyAdapter() { ... }
Наконец, вы также можете использовать звездную проекцию, которая, как я полагаю, в этом случае даст вам тот же результат, что и первое решение, поскольку аргумент типа класса Adapter
имеет верхнюю границу ViewHolder
.
fun RecyclerView.Adapter<*>.notifyAdapter() { ... }
Здесь вы можете более подробно ознакомиться с отклонением и прогнозами в официальной документации.