Почему нельзя просто использовать ListView

Ответ

ListView устарел и имеет ряд ограничений по сравнению с RecyclerView:

  1. Нет встроенного ViewHolder – приходится реализовывать вручную, что ведет к ошибкам и boilerplate-коду.
  2. Отсутствие гибкого LayoutManager – только вертикальный список, сложно сделать сетку или горизонтальный скролл.
  3. Нет анимаций по умолчанию – в RecyclerView они встроены.
  4. Плохая оптимизацияRecyclerView эффективнее переиспользует View, особенно для больших списков.

Пример RecyclerView с ViewHolder:

class MyAdapter : RecyclerView.Adapter<MyAdapter.ViewHolder>() {
    class ViewHolder(view: View) : RecyclerView.ViewHolder(view)

    override fun onCreateViewHolder() = ViewHolder(LayoutInflater.from(context).inflate(R.layout.item, parent, false))
    override fun onBindViewHolder(holder: ViewHolder, position: Int) { /*...*/ }
}

Ответ 18+ 🔞

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

Ну серьёзно, это пизда рулю. Во-первых, там нет нормального встроенного ViewHolder. Приходится эту штуку городить самому, как последний распиздяй, и постоянно можно накосячить или написать тонну однообразного кода. RecyclerView же сразу даёт тебе эту фишку из коробки — красота, а не жизнь.

Во-вторых, ListView — это как одноногая мартышка. Только вертикальный список и всё, ебать колотить. Хочешь сетку сделать или горизонтально скроллить? Хуй с горы! А в RecyclerView есть LayoutManager, который позволяет вытворять что угодно. Нужна сетка? GridLayoutManager. Нужно горизонтально? LinearLayoutManager с ориентацией. Просто овердохуища возможностей.

В-третьих, анимации. В ListView их нихуя нет по умолчанию. Добавлять — это отдельная песня, волнение ебать. А в RecyclerView они уже вшиты, и можно красиво элементы добавлять, удалять или перемещать. Смотрится солидно.

И главное — оптимизация. ListView переиспользует вьюхи, конечно, но как-то криво и не всегда предсказуемо. RecyclerView же заточен именно под это, особенно для огромных списков. Он не будет создавать вьюху для каждого элемента, а будет тыкать данные в уже существующие, что экономит память и батарею. Разница, чувак, просто ни хуя себе.

Вот, глянь, как это выглядит на RecyclerView. Красиво же, бля:

class MyAdapter : RecyclerView.Adapter<MyAdapter.ViewHolder>() {
    class ViewHolder(view: View) : RecyclerView.ViewHolder(view)

    override fun onCreateViewHolder() = ViewHolder(LayoutInflater.from(context).inflate(R.layout.item, parent, false))
    override fun onBindViewHolder(holder: ViewHolder, position: Int) { /*...*/ }
}

Видишь? ViewHolder прямо в классе адаптера объявлен. Всё аккуратно, всё на своих местах. Никакого геморроя. Так что если видишь в новом проекте ListView — смело посылай его нахуй и ставь RecyclerView. Не пожалеешь.