← Назад к вопросам

Какую реализацию List стоит использовать в Adapter у RecyclerView?

1.3 Junior🔥 252 комментариев
#Производительность и оптимизация#Тестирование

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Оптимальная реализация List для RecyclerView.Adapter

Для RecyclerView.Adapter рекомендуется использовать MutableList из Kotlin (или ArrayList в Java) по следующим ключевым причинам:

Основные критерии выбора

  1. Изменяемость данных (MutableList)

    • Адаптеры требуют динамического обновления, добавления, удаления элементов
    • MutableList (обычно ArrayList) обеспечивает O(1) доступ по индексу
    • Позволяет использовать DiffUtil для эффективных обновлений
  2. Синхронизация с DiffUtil

    • DiffUtil.Callback требует произвольного доступа к элементам для сравнения
    • ArrayList предоставляет get(index) за постоянное время
  3. Производительность обновлений

    • ArrayList оптимален для операций по индексу
    • Связанные списки (LinkedList) неэффективны для адаптеров

Рекомендуемая реализация

// Kotlin с MutableList
private val dataList: MutableList<Item> = mutableListOf()

// Или с явным указанием ArrayList
private val dataList: ArrayList<Item> = ArrayList()

// Java версия
private final List<Item> dataList = new ArrayList<>();

Ключевые методы для работы с данными

class MyAdapter : RecyclerView.Adapter<MyViewHolder>() {
    private val items = mutableListOf<MyItem>()
    
    fun updateData(newItems: List<MyItem>) {
        val diffCallback = MyDiffCallback(items, newItems)
        val diffResult = DiffUtil.calculateDiff(diffCallback)
        
        items.clear()
        items.addAll(newItems)
        diffResult.dispatchUpdatesTo(this)
    }
    
    fun addItem(item: MyItem, position: Int = items.size) {
        items.add(position, item)
        notifyItemInserted(position)
    }
    
    fun removeItem(position: Int) {
        items.removeAt(position)
        notifyItemRemoved(position)
    }
}

Почему не другие реализации?

  1. LinkedList

    // НЕ РЕКОМЕНДУЕТСЯ
    private val list = LinkedList<Item>() // Медленный доступ по индексу O(n)
    
  2. Immutable List (List в Kotlin, Collections.unmodifiableList())

    • Не позволяет изменять данные напрямую
    • Требует полной замены списка при обновлениях
  3. CopyOnWriteArrayList

    • Избыточен для UI-потока
    • Полезен только при многопоточном доступе

Лучшие практики

  1. Инкапсуляция данных

    class MyAdapter {
        private val _items = mutableListOf<Item>()
        val items: List<Item> get() = _items.toList() // Read-only внешний доступ
    }
    
  2. DiffUtil для эффективных обновлений

    class ItemDiffCallback : DiffUtil.Callback() {
        override fun getOldListSize() = oldList.size
        override fun getNewListSize() = newList.size
        
        override fun areItemsTheSame(oldPos: Int, newPos: Int): Boolean {
            return oldList[oldPos].id == newList[newPos].id
        }
        
        override fun areContentsTheSame(oldPos: Int, newPos: Int): Boolean {
            return oldList[oldPos] == newList[newPos]
        }
    }
    
  3. LiveData/StateFlow в MVVM

    class MyViewModel : ViewModel() {
        private val _items = MutableStateFlow<List<Item>>(emptyList())
        val items: StateFlow<List<Item>> = _items.asStateFlow()
        
        fun updateItems(newItems: List<Item>) {
            _items.value = newItems
        }
    }
    

Производительность операций

ОперацияArrayListLinkedListПримечание
get(index)O(1)O(n)Критично для адаптера
add(end)O(1)O(1)Одинаково эффективно
add(middle)O(n)O(1)LinkedList выигрывает
remove(middle)O(n)O(1)Но адаптер редко делает это

ArrayList выигрывает благодаря:

  • Локальности данных в памяти (кэш-дружественность)
  • Быстрому произвольному доступу
  • Оптимизации под DiffUtil

Заключение

Используйте ArrayList (в Java) или MutableList (в Kotlin) с реализацией ArrayList для RecyclerView.Adapter. Это обеспечивает оптимальный баланс производительности, удобства использования и совместимости с современными подходами (DiffUtil, ViewModel, LiveData). Избегайте LinkedList и immutable коллекций как основного хранилища данных адаптера.

Какую реализацию List стоит использовать в Adapter у RecyclerView? | PrepBro