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

В чем разница между ListView и RecyclerView?

1.6 Junior🔥 161 комментариев
#Android компоненты#UI и вёрстка#Производительность и оптимизация

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

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

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

Разница между ListView и RecyclerView

Это классический вопрос на собеседованиях. RecyclerView был введён в 2014 году как современное улучшение ListView, и теперь ListView считается устаревшим.

ListView — старый подход

ListView был первой попыткой Google создать эффективный список для больших наборов данных:

val listView = findViewById<ListView>(R.id.list_view)
val adapter = MyListAdapter(this, items)
listView.adapter = adapter

RecyclerView — современный стандарт

RecyclerView переписал концепцию с нуля, добавив:

val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
val adapter = MyRecyclerAdapter(items)
recyclerView.adapter = adapter
recyclerView.layoutManager = LinearLayoutManager(this)

Ключевые различия

Переиспользование ViewHolder

  • ListView: создавал новые View для каждого элемента
  • RecyclerView: переиспользует View через ViewHolder паттерн

Гибкость расположения

  • ListView: только вертикальный список
  • RecyclerView: вертикаль, горизонталь, сетка, кастомные LayoutManager

ItemAnimator

  • ListView: добавил анимацию только в API 16+
  • RecyclerView: встроенная поддержка анимаций (insert, remove, change)

ItemDecoration

  • ListView: нет встроенной поддержки разделителей
  • RecyclerView: ItemDecoration для гибких разделителей и отступов

Производительность

RecyclerView более эффективен:

class MyAdapter(val items: List<String>) : 
    RecyclerView.Adapter<MyAdapter.ViewHolder>() {
    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = 
        ViewHolder(LayoutInflater.from(parent.context)
            .inflate(R.layout.item, parent, false))
    
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(items[position])
    }
    
    override fun getItemCount() = items.size
    
    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        private val textView = itemView.findViewById<TextView>(R.id.text)
        fun bind(item: String) { textView.text = item }
    }
}

Расширяемость

RecyclerView поддерживает множество расширений:

  • DiffUtil для эффективного обновления списков
  • ItemTouchHelper для drag-and-drop и свайпа
  • ListAdapter с поддержкой Coroutines
  • AsyncListDiffer для асинхронных обновлений

Когда использовать

  • ListView: НИКОГДА в новых проектах (deprecated)
  • RecyclerView: всегда для отображения списков данных

RecyclerView — это стандарт Android разработки с 2014 года и не имеет серьёзных конкурентов для этой задачи.