〈kotlin〉Groupie

Android studioでkotlinを使ってAndroidアプリ作成の勉強中。

RecyclerViewに表示する1つ1つのアイテムのレイアウトを
ViewHolderなしでシンプルに書けるライブラリGroupieを触ってみた。
GroupieはRecyclerViewの中に複数のレイアウトでアイテムを追加していきたいときに便利に使えそう。

Gradle

setting.gradle

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven { url "https://jitpack.io" }   //ここを追加
    }
}

build.gradle

implementation "com.github.lisawray.groupie:groupie:$version"
implementation "com.github.lisawray.groupie:groupie-databinding:$version"

基本的にDataBindingと合わせて使うのが良さそうだったので2つ目の依存関係を追加。

レイアウト

RecyclerViewに表示したいアイテム1つ分のレイアウトを作成。

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="item"
            type="String" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            android:text="@{item}"/>

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

BindableItem

GroupieのBindableItemクラスを使用して、後からadapterに渡すデータのクラスを作成する。

class ListItem(val text : String) : BindableItem<SampleListItemBinding>() {

    override fun bind(viewBinding: ListItemBinding, position: Int) {
        viewBinding.item = text
        //itemはxmlでdatabindingに設定した変数
    }

    override fun getLayout(): Int  = R.layout.sample_list_item
}

adapterを作成してデータを渡す

val adapter = GroupieAdapter()
binding.recyclerview.adapter = adapter

adapter.add(ListItem("sample1"))


val listItems = listOf(ListItem("sample2"), ListItem("sample3"))
adapter.update(listItems)


val section = Section()
section.setHeader(HeaderItem())
section.addAll(listItems)
adapter.add(section)

adapterはGroupieAdapter()のインスタンスを用意するだけで良い。
アイテムを追加するときはaddで追加するか、updateで更新するか、Sectionを使って追加する。
Sectionは移動、更新などの差分やアニメーションをサポートしているGroupieリストで、
ヘッダーやフッターを設定することができそう。


参考
groupie/README.md at bc3c799b8cbb08ddf5f450b8f9b62f84aff33a84 · lisawray/groupie · GitHub
Groupie 基本系からドラッグ&ドロップ、スワイプなど - Qiita