Android Studio: уроки на Kotlin. Список с RecyclerView.

Отображение списков – одна из первых задач, с которой сталкивается каждый новичок в Android. В этом уроке из цикла Android Studio Kotlin уроки мы научимся выводить на экран прокручиваемый перечень элементов, используя RecyclerView. Вы освоите создание адаптера, разметку элемента и подключение данных – необходимый навык для написания любого приложения с перечнем чего угодно.


Что такое RecyclerView и зачем он нужен

RecyclerView – это компонент, который показывает большие списки, прокручивая только видимые элементы. При пролистывании он не создаёт объекты заново, а повторно использует прежние, что экономит память и обеспечивает плавность. Это стандартный способ отображения списков в Android, и начинающий разработчик должен освоить его в первую очередь.

Представьте, что у вас есть сотня строк, но на экране помещается только семь. RecyclerView создаст чуть больше семи контейнеров и будет заполнять их данными по мере прокрутки. Этот механизм называется переиспользованием View.


Добавление зависимости в проект

RecyclerView входит в AndroidX, поэтому откройте build.gradle.kts уровня модуля и добавьте библиотеку:

dependencies {
    implementation("androidx.recyclerview:recyclerview:1.3.2")
}

После Sync Now можно сразу использовать RecyclerView в разметке или создавать программно.


Создание разметки элемента списка

Начнём с того, как будет выглядеть одна строка. Создайте файл res/layout/item_fruit.xml с вертикальным LinearLayout, внутри которого находятся два TextView: для названия и для описания.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/tvName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/tvDesc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:textColor="@android:color/darker_gray" />

</LinearLayout>

Модель данных

Чтобы было что показывать, заведём простой data-класс для фрукта:

data class Fruit(val name: String, val description: String)

Позже мы создадим список таких объектов и передадим адаптеру.


Создание адаптера

Адаптер – это связующее звено между данными и RecyclerView. Он создаёт View для каждого элемента и заполняет их содержимым. Создадим класс FruitAdapter, наследующий RecyclerView.Adapter.

class FruitAdapter(
    private val fruitList: List<Fruit>
) : RecyclerView.Adapter<FruitAdapter.FruitViewHolder>() {

    class FruitViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val tvName: TextView = itemView.findViewById(R.id.tvName)
        val tvDesc: TextView = itemView.findViewById(R.id.tvDesc)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FruitViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_fruit, parent, false)
        return FruitViewHolder(view)
    }

    override fun onBindViewHolder(holder: FruitViewHolder, position: Int) {
        val fruit = fruitList[position]
        holder.tvName.text = fruit.name
        holder.tvDesc.text = fruit.description
    }

    override fun getItemCount(): Int = fruitList.size
}

Метод onCreateViewHolder надувает разметку одного элемента, onBindViewHolder привязывает данные к конкретной позиции, а getItemCount возвращает общее число элементов. Класс ViewHolder хранит ссылки на View внутри строки, чтобы не искать их каждый раз заново.


Размещение RecyclerView в Activity

В файле activity_main.xml добавим RecyclerView на весь экран:

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Если вы предпочитаете Jetpack Compose, можно воспользоваться компонентом LazyColumn, но сегодня мы изучаем классический подход, который часто встречается в существующих проектах.


Подключение адаптера в MainActivity

В onCreate получим ссылку на RecyclerView, настроим LayoutManager (LinearLayoutManager для вертикального списка) и присвоим адаптер:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val fruits = listOf(
            Fruit("Яблоко", "Сочный фрукт"),
            Fruit("Банан", "Богат калием"),
            Fruit("Апельсин", "Цитрусовый")
        )

        val adapter = FruitAdapter(fruits)
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.adapter = adapter
    }
}

Запустите приложение – вы увидите три строки с названиями фруктов и описаниями. Прокрутка работает, память используется экономно. Это минимально жизнеспособный список, который можно расширять.


Добавление новых элементов и обновление списка

Часто данные приходят с сервера или добавляются пользователем. Чтобы обновить список, делаем список изменяемым, а в адаптере добавляем метод для подмены данных:

fun updateList(newList: List<Fruit>) {
    (fruitList as? MutableList)?.clear()
    (fruitList as? MutableList)?.addAll(newList)
    notifyDataSetChanged()
}

Но лучше использовать DiffUtil для точечных обновлений, потому что notifyDataSetChanged пересоздаёт весь список и снижает производительность. Позже вы сможете изучить этот инструмент отдельно.


Обработка нажатий

Самый простой способ отреагировать на клик по элементу – добавить слушатель в onBindViewHolder:

holder.itemView.setOnClickListener {
    val fruit = fruitList[position]
    Toast.makeText(it.context, "Выбран ${fruit.name}", Toast.LENGTH_SHORT).show()
}

Более гибкий вариант – передать лямбду в конструктор адаптера и вызывать её при клике. Это позволит Activity или Fragment реагировать на выбор элемента, например, открывать детали.


Коротко об изученном

  • RecyclerView отображает большие списки с переиспользованием View.
  • Адаптер создаёт элементы и заполняет их данными.
  • ViewHolder хранит ссылки на View для быстрого доступа.
  • LayoutManager определяет направление и структуру (вертикальный, горизонтальный, сетка).
  • Для обновления данных используйте DiffUtil или перезаписывайте список с вызовом notifyDataSetChanged.

Сегодняшний урок из цикла Android Studio Kotlin уроки научил вас оживлять списки на экране. Теперь вы можете взять любой массив данных и вывести его в прокручиваемый перечень. Попробуйте сделать список городов или книг – это закрепит навык и подготовит к более сложным темам.