Сегодня я буду готовить сочный RecyclerView по-котлински. Минимум расходных материалов, максимум на выходе. Сочный, ароматный, мощный и простой одновременно. К столу!

Для начала нужно создать пустой проект, не забыв включить поддержку языка Kotlin в настройках проекта. Потом нужно добавить поддержку RecyclerView в файл build.gradle  модуля app:

implementation 'com.android.support:recyclerview-v7:28.0.0-alpha3'

На текущий момент самая свежая версия — 28.0.0-alpha3. Само-собой, со временем актуальная версия будет другая. После этого можно удалить из файла макета дефолтный TextView и поместить вместо него RecyclerView:

<android.support.v7.widget.RecyclerView
    android:id="@+id/myRecycler"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layoutManager="android.support.v7.widget.LinearLayoutManager"
    tools:listitem="@layout/main_item"
    />

И ещё стоит сразу создать файл разметки для элемента списка и код класса для хранения элементов:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >

    <TextView
        android:id="@+id/firstName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:text="First name"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        android:layout_marginStart="5dp"
        android:textSize="18sp"
        />

    <TextView
        android:id="@+id/lastName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:text="Last name"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@id/firstName"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        android:layout_marginStart="5dp"
        android:textSize="18sp"
        />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/colorAccent"
        app:layout_constraintTop_toBottomOf="@id/firstName"
        />

</android.support.constraint.ConstraintLayout>
data class MainItem(
        val firstName: String,
        val lastName: String
)

Теперь нужно создать адаптер:

class MainAdapter(var items: List<MainItem>, val callback: Callback) : RecyclerView.Adapter<MainAdapter.MainHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int)
            = MainHolder(LayoutInflater.from(parent.context).inflate(R.layout.main_item, parent, false))

    override fun getItemCount() = items.size

    override fun onBindViewHolder(holder: MainHolder, position: Int) {
        holder.bind(items[position])
    }

    inner class MainHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        private val firstName = itemView.findViewById<TextView>(R.id.firstName)
        private val lastName = itemView.findViewById<TextView>(R.id.lastName)

        fun bind(item: MainItem) {
            firstName.text = item.firstName
            lastName.text = item.lastName
            itemView.setOnClickListener {
                if (adapterPosition != RecyclerView.NO_POSITION) callback.onItemClicked(items[adapterPosition])
            }
        }
    }

    interface Callback {
        fun onItemClicked(item: MainItem)
    }

}

Как видно из кода, в конструктор адаптера сразу передаётся список элементов и интерфейс обратного вызова, который будет реализован в классе Activity.
Теперь можно найти RecyclerView в Activity. На Kotlin это очень просто. Нужно воспользоваться библиотекой kotlin-android-extensions. С её помощью можно просто импортировать файл XML-макета в Activity и все элементы, которые имеют id будут доступны в коде по этому id:

import kotlinx.android.synthetic.main.activity_main.*

Сейчас стоит создать список тестовых данных, объявить адаптер, присвоить адаптеру список, реализовать интерфейс обратного вызова и отдать адаптер в RecycltrView:

val items = listOf(
        MainItem("Александр", "Пушкин"),
        MainItem("Михаил", "Лермонтов"),
        MainItem("Александр", "Блок"),
        MainItem("Николай", "Некрасов"),
        MainItem("Фёдор", "Тютчев"),
        MainItem("Сергей", "Есенин"),
        MainItem("Владимир", "Маяковский")
)

val myAdapter = MainAdapter(items, object : MainAdapter.Callback {
    override fun onItemClicked(item: MainItem) {
        //TODO Сюда придёт элемент, по которому кликнули. Можно дальше с ним работать
    }
})

myRecycler.adapter = myAdapter

Собственно, всё. Можно запускать.

Код из этой статьи можно найти на GitHub

Добавить комментарий

Закрыть меню