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) // アイテムのインスタンスのリストすべてを表示
などでアイテムを表示できる。