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의 프로퍼티를 따로 변환하지 않고도 편리하게 사용할수 있게됩니다.