[Android] Jetpack - Data Binding - 3

반응형

이전 포스팅에서는 Data Binding의 추가적인 기능에 대해 살펴보았습니다.

 

[Android] Jetpack - Data Binding - 2

이전 포스팅에서는 Data Binding에 대해 간략하게 살펴보았습니다. 표현식에서 콜백을 사용하면, 필요한 리스너를 자동생성한 후 이벤트에 등록합니다. UI에서 이벤트를 전달하면, 표현식을 검사하

weirddev.tistory.com


이번에는 Data Binding의 Observability에 대해 정리해보려고 합니다.

 

Observability

객체가 데이터의 변경 사항을 알리는 것 입니다.

최초 데이터가 UI에 바인딩 된 후 데이터가 변경되면 자동으로 UI를 업데이트 하게 할 수 있습니다.

Obsevable field

예시1) 변수 선언

class User {
    val firstName = ObservableField<String>()
    val lastName = ObservableField<String>()
    val age = ObservableInt()
}

 

예시2) ObservableField 변수 접근 및 업데이트

user.firstName = "Google"
val age = user.age

 

 

Observable collections

 

예시1) 변수 선언

ObservableArrayMap<String, Any>().apply {
    put("firstName", "Google")
    put("lastName", "Inc.")
    put("age", 17)
}

 

예시2) XML에서 사용 선언

<data>
    <import type="android.databinding.ObservableMap"/>
    <variable name="user" type="ObservableMap&lt;String, Object&gt;"/>
</data>
…
<TextView
    android:text="@{user.lastName}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
<TextView
    android:text="@{String.valueOf(1 + (Integer)user.age)}"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

 

 

Observable objects

Observable 인터페이스를 구현한 클래스는 데이터의 변화를 감지하기 위한 리스너를 등록할 수 있습니다.
BaseObservable 클래스를 상속 받고, 리스너 등록을 통해 변경된 데이터를 알려주는 역할을 합니다. 아래의 코드가 위의 역할을 합니다.

class User : BaseObservable() {

    @get:Bindable
    var firstName: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.firstName)
        }

    @get:Bindable
    var lastName: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.lastName)
        }
}

 

위 코드에서, Data Binding에 사용되는 리소스의 ID들을 포함하고 있는 BR이라는 이름을 가진 클래스를 생성합니다. 
Bindable이라는 어노테이션은 컴파일 중에 BR 클래스에 있는 Entry를 생성합니다.

 

Lifecycle-aware objects

데이터 변경 시 UI에 자동으로 알려주기 위해 레이아웃과 바인딩을 한 후에는, 바인딩이 수명 주기를 알고 UI가 화면에 표시될 때에만 데이터 변경에 업데이트 됩니다. (StateFlow, LiveData)


 

반응형

'DEV > Android' 카테고리의 다른 글

[Android] Jetpack - Lifecycle - 2  (0) 2023.03.21
[Android] Jetpack - Lifecycle - 1  (0) 2023.03.21
[Android] Jetpack - Data Binding - 2  (0) 2023.03.14
[Android] Jetpack - Data Binding - 1  (0) 2023.03.11
[Android] Jetpack  (0) 2023.03.11