и посмотреть медиа
Kotlin | Вопросы собесов
и посмотреть медиа
Вопросы для Kotlin-разработчиков с ответами.
Вопросы для Kotlin-разработчиков с ответами.
AI бот для озвучки текста и клонирования голоса в Telegram. Создавай аудио с помощью нейросети быстро и просто.
Вопросы на Kotlin-собеседованиях: расширения, корутины, коллекции. С примерами кода и объяснениями для Android и backend.
🤔 Зачем нужен DiffUtil? DiffUtil — это утилита для быстрого обновления списков в RecyclerView. Она сравнивает старый и новый список и находит различия, чтобы обновлять только изменённые элементы, а не весь список. 🚩Проблема без `DiffUtil` Обычное обновление списка без DiffUtil перерисовывает всё, даже если изменился один элемент. adapter.notifyDataSetChanged() // Полностью обновляет список ❌ 🟠Решение с `DiffUtil` DiffUtil находит различия между старым и новым списком и обновляет только изменённые элементы. class MyDiffUtilCallback( private val oldList: List, private val newList: List ) : DiffUtil.Callback() { override fun getOldListSize() = oldList.size override fun getNewListSize() = newList.size override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { return oldList[oldItemPosition].id == newList[newItemPosition].id } override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { return oldList[oldItemPosition] == newList[newItemPosition] // Используем data class (авто `equals()`) } } 🚩Как использовать `DiffUtil` в `RecyclerView.Adapter`? После создания DiffUtil.Callback, вызываем DiffUtil.calculateDiff() и передаём результат в adapter. fun updateList(newList: List) { val diffCallback = MyDiffUtilCallback(userList, newList) val diffResult = DiffUtil.calculateDiff(diffCallback) userList = newList // Обновляем старый список diffResult.dispatchUpdatesTo(this) // Обновляем только изменённые элементы } 🟠`ListAdapter` – ещё проще! Если используем ListAdapter, DiffUtil уже встроен. class UserAdapter : ListAdapter(DIFF_CALLBACK) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_user, parent, false) return UserViewHolder(view) } override fun onBindViewHolder(holder: UserViewHolder, position: Int) { holder.bind(getItem(position)) // `getItem()` уже работает с `ListAdapter` } companion object { private val DIFF_CALLBACK = object : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: User, newItem: User): Boolean = oldItem.id == newItem.id override fun areContentsTheSame(oldItem: User, newItem: User): Boolean = oldItem == newItem } } } Обновление списка в ListAdapter adapter.submitList(newList) // DiffUtil работает внутри 🚀 Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаТолько зарегистрированные пользователи могут делиться своим мнением.
Станьте первым, кто поделится своим впечатлением об этом ресурсе!