LoginSignup
1
0

【AndroidView】RecyclerView から Groupi を使ってみる

Posted at

はじめに

今まで RecyclerView で実装していたことを Groupi で実装することがあったので、そのメモです。

導入

Groupy のリポジトリにある Try it out の通りに導入します。

Gradle に implementation を追加します。

build.gradle
dependencies {
    implementation "com.github.lisawray.groupie:groupie:$groupie_version"
}

次に、settings.gradleに maven { url 'https://jitpack.io' } を追加します。最新のプロジェクトではこれがないと動かないようです。(実際、自分も動きませんでした。)

settings.gradle
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
+       maven { url 'https://jitpack.io' } 
    }
}

他、ViewBinding、DataBinding を使っている場合は以下も implementation に追加します。

build.gradle
dependencies {
    implementation "com.github.lisawray.groupie:groupie:$groupie_version"
+   implementation "com.github.lisawray.groupie:groupie-viewbinding:$groupie_version" 
}

置き換え

変更前のコードは以下のようになります。

MainActivity.kt
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        setupRecyclerView()
    }

    private fun setupRecyclerView() {
        val items = listOf("🍎りんご", "🍌バナナ", "🍒さくらんぼ", "🍊オレンジ", "🍓いちご", "🍉すいか", "🍐洋梨")
        binding.mainRecyclerView.adapter = ItemAdapter(items)
        binding.mainRecyclerView.layoutManager = LinearLayoutManager(this)
    }
}
ItemAdapter.kt
class ItemAdapter(private val items: List<String>): RecyclerView.Adapter<ItemAdapter.ItemViewHolder>() {
    class ItemViewHolder(val binding: RecyclerItemBinding) : RecyclerView.ViewHolder(binding.root)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
        val binding = RecyclerItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return ItemViewHolder(binding)
    }

    override fun getItemCount(): Int {
        return items.size
    }

    override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
        holder.binding.textViewItem.text = items[position]
    }
}
activity_main.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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/main_recycler_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        />
</androidx.constraintlayout.widget.ConstraintLayout>
recycler_item.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:padding="50dp"
    >

    <TextView
        android:id="@+id/text_view_item"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="@string/sample_title"
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

ここで、以下のような変更を加えると、Groupieで実装したことになります。

MainActivity.kt
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
+   private val groupAdapter = GroupAdapter<GroupieViewHolder>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        setupRecyclerView()
    }

    private fun setupRecyclerView() {
        val items = listOf("🍎りんご", "🍌バナナ", "🍒さくらんぼ", "🍊オレンジ", "🍓いちご", "🍉すいか", "🍐洋梨")
-       binding.mainRecyclerView.adapter = ItemAdapter(items)
+       binding.mainRecyclerView.adapter = groupAdapter
        binding.mainRecyclerView.layoutManager = LinearLayoutManager(this)
+       groupAdapter.addAll(items.map {
+             ItemAdapter(it)
+         })
    }
}

ItemAdapter はごっそり変更します。
便宜上、ItemAdapter となっていますが、Adapter ではなく ○○Itemなどの方が良いです。

ItemAdapter
class ItemAdapter(private val item: String): Item<GroupieViewHolder>() {
    override fun bind(viewHolder: GroupieViewHolder, position: Int) {
        val binding = RecyclerItemBinding.bind(viewHolder.itemView)
        binding.textViewItem.text = item
    }

    override fun getLayout() = R.layout.recycler_item
}

最後に

サンプルアプリも作成してみました。もし、間違っている箇所や、こうした方が良いという箇所があればPR待っています!

参考文献

1
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
1
0