Android Studio: уроки на Kotlin. Горизонтальный список с лимитом.

Разработчикам на Kotlin в Android Studio периодически нужно сделать список, элементы которого выстроены не по вертикали, а по горизонтали. При этом важно не просто вывести коллекцию объектов, но и ограничить их видимое количество — показать строго определённое число карточек или пунктов меню. Такую задачу можно решить как с помощью классического RecyclerView, так и через Jetpack Compose с LazyRow, задав лимит буквально в пару строк.


Горизонтальный RecyclerView с ограничением

RecyclerView — это проверенный инструмент для отображения списков. Чтобы сделать его горизонтальным, используется LinearLayoutManager с ориентацией HORIZONTAL. А чтобы ограничить количество видимых элементов, нужно либо подготовить список заранее (взять первые N объектов), либо внутри адаптера управлять счетчиком.

Самый простой путь — обрезать данные до нужного размера. Предположим, у нас есть полный список allItems, но показать нужно только 5 элементов.

val limitedList = allItems.take(5) // берём первые 5
recyclerView.adapter = MyAdapter(limitedList)
recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)

Адаптер при этом остаётся обычным, ничего дополнительно настраивать не нужно. Метод take(N) возвращает новый список с указанным числом элементов. Если исходных данных меньше N, возьмутся все доступные.


Ограничение количества через логику адаптера

Иногда требуется, чтобы адаптер сам контролировал максимальное число элементов независимо от переданного списка. Для этого в адаптере переопределяют getItemCount():

class LimitedAdapter(private val items: List<Item>, private val max: Int) : RecyclerView.Adapter<MyViewHolder>() {
    override fun getItemCount() = minOf(items.size, max)
    // ... остальные методы
}

Тогда даже если в items лежит 100 объектов, отобразится ровно столько, сколько задано в max. Это удобно, когда лимит должен меняться динамически.


Jetpack Compose: LazyRow с фиксированным числом элементов

Если вы используете Compose, горизонтальный список делается ещё проще — компонентом LazyRow. Чтобы показать только определённое количество объектов, перед построением списка применяют take() или внутри composable-функции ограничивают число итераций.

@Composable
fun HorizontalItemList(allItems: List<Item>, maxCount: Int = 5) {
    LazyRow {
        items(allItems.take(maxCount)) { item ->
            Card(
                modifier = Modifier
                    .width(120.dp)
                    .padding(8.dp)
            ) {
                Text(item.title, modifier = Modifier.padding(16.dp))
            }
        }
    }
}

Если нужно ограничить количество элементов не обрезанием данных, а внутри items, можно воспользоваться параметром count у самой функции items, но проще оставить take().


Сравнение подходов

Подход Плюсы Минусы
Обрезка списка (take) Прозрачно, не меняет адаптер Лимит фиксирован в момент присвоения
Ограничение в getItemCount() Лимит можно менять динамически Требуется кастомный адаптер
LazyRow + take() Минимум кода, идеально для Compose Только для Compose-проектов

Практический совет

Если горизонтальный список должен реагировать на изменение количества (например, пользователь нажимает «показать ещё»), лучше использовать ограничение в адаптере и вызывать notifyDataSetChanged() после увеличения лимита. В случае с LazyRow — просто обновите состояние, от которого зависит take(), и Compose перерисует список.


Итог

Мы разобрали, как в kotlin android studio сделать список по горизонтали на определенное количество объектов. Основной приём — взять первые N элементов через take() или ограничить счётчик в адаптере. Оба способа работают как с классическим RecyclerView, так и с Jetpack Compose. Выберите тот, который подходит под архитектуру вашего проекта, и настройка займёт не больше пяти минут.