Результат

Вступление

Groupie - это простая и гибкая библиотека для сложных макетов RecyclerView.

Groupie позволяет вам рассматривать ваш контент как логические группы и обрабатывать уведомления об изменениях за вас - подумайте о разделах с верхними и нижними колонтитулами, расширяемых группах, блоках вертикальных столбцов и многом другом. Это упрощает обработку асинхронных обновлений и вставок содержимого, а также изменения содержимого, управляемого пользователем. На уровне элемента он абстрагирует шаблон типов представлений элементов, макетов элементов, держателей представлений и размеров диапазона.

В этой статье мы увидим, как создать небольшой интерфейс чата с помощью библиотеки Groupie, которую вы можете найти по следующей ссылке

Конфигурация

Чтобы использовать groupie, необходимо добавить определенные элементы в ваш файл build.gradle.

  1. Активировать привязку данных
  2. Активировать расширение для Android

3. Добавление зависимостей Groupie

implementation "com.xwray:groupie:2.7.0"
implementation "com.xwray:groupie-databinding:2.7.0"
implementation "com.xwray:groupie-kotlin-android-extensions:2.7.0"

Пользовательский интерфейс приложения

Поскольку наш проект настроен, теперь нам нужно создать графический интерфейс нашего приложения, мы начнем с создания макета, который будет использоваться для отображения сообщения отправки, которое имеет зеленый цвет, имеет следующий код.

Приведенный выше код дает следующий результат

Интерфейс содержит только TextView, для которого атрибут background связан с файлом bg_receive_message.xml, который позволил нам округлить границы TextView, вот содержимое файла bg_receive_message.xml

Просто повторите ту же процедуру, чтобы создать второй макет, который будет отображать полученное сообщение, или просто загрузите исходный код проекта по этой ссылке.

При синтаксическом анализе файла i tem_message_send.xml вы заметите, что в нем была объявлена ​​переменная сообщения типа Message, а содержимое свойства text было назначено уникальному TextView приложения.

class Message(
    val text: String = "",
    val sendBy: String = ""
)

Основной графический интерфейс содержит RecyclerView, кнопку и EditText, следующий код определяет компоненты графического интерфейса.

Позвольте нырнуть в Groupie

С Groupie нам не нужен ViewHolder, который мы часто создаем, когда хотим связать данные с RecyclerView, все, что нам нужно сделать, это создать класс, который будет представлять элемент нашего RecyclerView, и для этого нам просто нужно сделать что-то вроде этого

В нашем случае мы создали два класса: ReceiveMessageItem и SendMessageItem, унаследованные от класса BindableItem, и это поддерживает привязку данных, то есть почему макет файла i tem_message_send.xml поддерживает привязку данных.

Параметр типа класса BindableItem должен быть классом, унаследованным от класса ViewBinding, таким как класс ItemMessageSend, созданный из item_message_send .xml.

Класс SendMessageItem имеет свойство Message, которое затем передается макету в методе bind.

Метод getLayout возвращает только идентификатор соответствующего макета. В нашем случае это макет item_message_send или item_message_receive в случае класса I temMessageReceive.

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

С Groupie нам нужно создать адаптер для RecyclerView и даже меньше для ViewHolder, Groupie предлагает нам напрямую класс GroupAdapter и класс GroupieViewHolder, которые нам просто нужно использовать.

Если вы очень хорошо заметили, вы увидите, когда в MainActivity свойство было создано таким образом.

private val messageAdapter = GroupAdapter<GroupieViewHolder>()

Затем мы используем это свойство как адаптацию RecyclerView.

В методе populateData вы можете заметить, что в зависимости от значения свойства sendBy, которое вы добавляете в адаптер, либо объект типа SendMessageItem, либо ReceiveMessageItem.

В setOnClickListener мы используем SendMessageItem, а затем вызываем метод, имитирующий поступление нового сообщения с помощью сопрограмм.

Файл проекта по этой ссылке

Если у вас есть какие-либо отзывы, не стесняйтесь связаться со мной в Twitter.

использованная литература