Groupie의 ViewHolder를 사용해 보았습니다.

내 블로그에서 당겨 왔습니다.
htps // 왓 ly-gm. 하테나 bぉg. 코m/엔트리/2020/06/05/222302

Groupie의 ViewHolder를 사용해 보았습니다.
[ htps : // 기주 b. 코 m / ぃ사 w 등 y / g 로피에 / ぇ 아세 s : 에 m 베 d : ]

Groupie는 Android의 recycler-view를 쉽게 사용할 수있는 라이브러리이지만 groupie-databinding은 deprecated되었습니다.

이번에는 권장되는 (Poi) groupie-viewbinding을 사용하고 싶습니다.

1. Groupie 추가



기본적으로 github Gradle Setup을 보면 괜찮습니다. 모듈 레벨 build.gradle에 다음을 추가하면 괜찮습니다.
android {
    ....
    androidExtensions {
        experimental = true
    }
    viewBinding {
        enabled = true
    }
}

dependencies {
    ....
    def groupie_version = "2.8.0"
    implementation "com.xwray:groupie:$groupie_version"
    implementation "com.xwray:groupie-kotlin-android-extensions:$groupie_version"
    implementation "com.xwray:groupie-viewbinding:$groupie_version"
}

추가로, 2020 년 6 월 5 일 현재, 다음과 같은 오류가 발생하기 때문에 약간의 대응이 필요했습니다.
ERROR: Failed to resolve: com.xwray:groupie-viewbinding:2.8.0

ISSUE에 따르면, 곧 출시되기 때문에 오류가 발생한 것 같습니다.
프로젝트 레벨 build.gradle에 한 줄 추가하여 해당합니다.
allprojects {
repositories {
google()
jcenter()
maven { url 'https://dl.bintray.com/lisawray/maven' } // この行を追加
}
}

2. 나열할 항목 만들기



목록의 항목이 될 클래스와 레이아웃 파일을 만듭니다.

클래스는 이런 식으로, bind 메소드로 view-binding을 사용하면 좋을 것 같습니다. 즐겁네요.
``TopListItem.kt
package wally.wally.android_practice

import android.view.View
import com.xwray.groupie.viewbinding.BindableItem
import wally.wally.android_practice.databinding.ItemTopListBinding

class TopListItem(private val text: String) : BindableItem() {
override fun getLayout() = R.layout.item_top_list
override fun bind(viewBinding: ItemTopListBinding, position: Int) {
    viewBinding.button.text = text
}

override fun initializeViewBinding(view: View): ItemTopListBinding {
    return ItemTopListBinding.bind(view)
}

}
``

xml은 다음과 같습니다.
``item_top_list.xml


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

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

    <com.google.android.material.button.MaterialButton
        android:id="@+id/button"
        style="@style/Widget.MaterialComponents.Button.OutlinedButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/white"
        android:text=""
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:backgroundTint="@color/primaryLight"
        tools:text="ボタン" />

</androidx.constraintlayout.widget.ConstraintLayout>

``

이번에는 무엇을 생각했는지 머티리얼 디자인 버튼을 사용했습니다.
이 버튼은 액티비티가 머티리얼 컴포넌트 테마를 적용해야 하는 것처럼 보였기 때문에 매니페스트 파일도 줄어듭니다.
목록의 항목에 머티리얼 버튼을 사용하지 않으면 필요하지 않습니다.
<activity
android:name=".MainActivity"
android:theme="@style/Theme.MaterialComponents.Light" <= マテリアルボタンを設置する場合はテーマを適用
tools:ignore="LockedOrientationActivity"

3. recycler-view를 설치하여 목록을 표시합니다.



xml에 recycler-view를 설치하십시오.
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

MainActivity에서 GroupieAdapter를 만들고 recyclerView 어댑터로 만듭니다.
``
package wally.wally.android_practice

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.LinearLayoutManager
import com.xwray.groupie.GroupAdapter
import com.xwray.groupie.GroupieViewHolder
import wally.wally.android_practice.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate (savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
val adapter = GroupAdapter()
binding.recyclerView.adapter = adapter
binding.lifecycleOwner = this
binding.recyclerView.layoutManager = LinearLayoutManager(this)
    adapter.update((1..30).map { TopListItem("テストボタン${it}") })
    adapter.add(TopListItem("テストボタンファイナル"))
}

}


大事なのはここです.
recyclerVIewにはレスポンシブに対応するためのlayoutManagerが存在しますのでこちらも設定する必要があります.
リストをまとめて渡すだけで表示してくれますし, 1つだけ追加したい場合は `add` メソッドを使ってあげればいいです(この辺はview-holderというよりgroupieの機能)


binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
val adapter = GroupAdapter()
binding.recyclerView.adapter = adapter
binding.lifecycleOwner = this
binding.recyclerView.layoutManager = LinearLayoutManager(this)

adapter.update((1..30).map { TopListItem("테스트 버튼 ${it}") })
adapter.add(TopListItem("테스트 버튼 최종"))
``

결국 이런 식으로 나타납니다.

좋은 웹페이지 즐겨찾기