Отображение списков – одна из первых задач, с которой сталкивается каждый новичок в 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 уроки научил вас оживлять списки на экране. Теперь вы можете взять любой массив данных и вывести его в прокручиваемый перечень. Попробуйте сделать список городов или книг – это закрепит навык и подготовит к более сложным темам.