LoginSignup
0
0

More than 1 year has passed since last update.

Androidでリスト表示にgroupieを使う

Posted at

groupie導入

RecyclerViewに表示するアイテムの表示方法をデータによって切り替えたい

環境

Android Studio Flamingo 2022.2.1
Android gradle plugin 8.0.0
kotlin 1.7.10

依存追加

まず、groupieの依存を追加

settings.gradle
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' } // 追加行
    }
}
build.gradle(Module)
dependencies {
    def groupie_version = "2.10.1"
    implementation "com.github.lisawray.groupie:groupie:$groupie_version"
    implementation "com.github.lisawray.groupie:groupie-viewbinding:$groupie_version"
}

また、ViewBindingも有効にしておく

build.gradle
android{
    ...
    buildFeatures {
        viewBinding true
    }
}

リストアイテムのレイアウトxml作成

新しくレイアウトファイルを作成する

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

    <ImageView
        android:id="@+id/newItem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/***" />
</androidx.constraintlayout.widget.ConstraintLayout>

リストアイテムのクラス作成

表示するアイテムそれぞれのクラスを作成する

class NewItem(private val id: Int, private val listener: (Int) -> Unit): BindableItem<NewItemBinding>() {
    override fun initializeViewBinding(view: View) = NewItemBinding.bind(view)

    override fun getLayout(): Int = R.layout.item_new

    override fun bind(viewBinding: NewItemBinding, position: Int) {
        viewBinding.apply {
            newItem.setImageResource(id)

            root.setOnClickListener { listener(id) }
        }
    }
}

BindableItemクラスを継承したクラスを作成する。
コンストラクタに表示するアイテムの情報やリスナーを渡している。

リストへの表示

表示するときはFragmentなどでadapterを設定する

MyFragment.kt
class MyFragment: Fragment() {
    private val adapter by lazy { GroupieAdapter() } // GroupieAdapterのインスタンス生成
    private val _binding: FragmentBinding? = null
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentBinding.inflate(inflater, container, false)

        binding.newItemList.adapter = adapter
    }
}

そして、リストに表示したいデータをフラグメントで受け取ったら

val item = NewItem(0){ // click listener }
adapter.add(item) // アイテムを一つリストに追加

とするとRecyclerViewにアイテムが表示される。

BindableItemを実装した別のアイテムクラスを作成すれば、複数種類の表示方法でアイテムを表示できる。
他にも

adapter.clear() // リストの表示をクリア
adapter.addAll(itemList) // アイテムのインスタンスのリストすべてを表示

などでアイテムを表示できる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0