← Назад к вопросам
В чем разница между 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 года и не имеет серьёзных конкурентов для этой задачи.