Android DataBinding을 이용한 ViewHolder 데이터 주입

김성환·2024년 4월 17일

DataBinding은 ViewBinding 처럼 코드에서 바인딩클래스에 접근하여 xml의 정의한View에도 접근할수 있지만 xml의 data 에값을 설정하여 코드의 프로퍼티나 메서드들을 xml에 주입할수있습니다. 이방법은 액티비티처럼 xml을 사용하는 코드를 단축할수 있게해줍니다. 그 예시가 RecyclerView나 ListView에서 사용하는 뷰홀더 입니다.

<?xml version="1.0" encoding="utf-8"?>
<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="sample.example1.model.DetailItem" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:paddingTop="8dp"
        android:paddingBottom="8dp">

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/dateTextView"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.3"
            app:date="@{item.date}"
            tools:text="2021.1.2" />

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/typeTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/rounded_corners_5"
            android:gravity="center"
            android:textColor="@color/white"
            android:textSize="11sp"
            app:type="@{item.type}"
            tools:text="type" />

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/contentTextView"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="4dp"
            android:layout_weight="0.35"
            android:text="@{item.content}"
            tools:text="content" />

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/amountTextView"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="4dp"
            android:layout_weight="0.3"
            android:gravity="end"
            android:textStyle="bold"
            app:amount="@{item.amount}"
            tools:text="1000원" />

    </LinearLayout>
</layout>
class DetailViewHolder(private val binding: ItemDetailBinding) :
    RecyclerView.ViewHolder(binding.root) {
    fun bind(item: DetailItem) {
        binding.item = item
    }
}

이런식으로 DataBinding을 사용하여 지정할수있습니다.
BindingAdapter 함수들을 이용한다면 model의 프로퍼티를 따로 변환하지 않고도 편리하게 사용할수 있게됩니다.

0개의 댓글