선생님, 개발을 잘하고 싶어요.

[Android] DataBinding, Custom View에 two-way binding을 하는 방법 본문

개발/android 개발

[Android] DataBinding, Custom View에 two-way binding을 하는 방법

알고싶은 승민 2021. 9. 19. 22:00

two-way binding을 하기 위해서 총 3가지의 함수가 필요합니다. 각 용도는 이런 식으로 생각할 수 있는데요.

 

  • 데이터를 받아서 view에 설정하는 것 (BindingAdapter)
  • view의 데이터가 변경되었을 때, 변경된 데이터 받아오는 것 (InverseBindingAdapter)

그런데, InverseBindingAdapter는 어떻게 view 데이터 변경을 알아차리는 걸까요? 바로, InverseBindingAdapter의 관련된 event를 등록하고, 해당 이벤트의 인자로 들어오는 InverseBindingListener.onChange()가 호출되는 순간을 알게되는 겁니다.

 

  • view의 데이터가 변경되었음을 알리는 이벤트를 등록하는 것 (android:xxxxAttrChanged)

여기서 xxxx는 우리가 InverseBindingAdapter로 등록한 attribute의 이름으로 기본 설정됩니다.

// how to implement two-way binding in custom view.
@BindingAdapter("app:days")
fun DayChooser.setDaysList(days: List<Int>) {
    if (this.days != days) {
        this.days = days
    }
}

@InverseBindingAdapter(attribute = "app:days")
fun DayChooser.getDaysList() = this.days

@BindingAdapter("app:daysAttrChanged")
fun DayChooser.setDaysChangedListener(attrChange: InverseBindingListener) {
    this.addOnChangeListener(object : DayChooser.OnChangeListener {
        override fun onChange(days: List<Int>) {
            attrChange.onChange()
        }
    })
}

 

이를 위해서 커스텀 뷰를 만들 때 하나 해주어야 하는게 있는데요. 바로, InverseBindingListener를 통해서 value가 변경될 때, onChange를 발생시키도록 콜백을 등록할 수 있게 해주어야 한다는 겁니다. 커스텀 data change listener를 지정하고 등록해주시면 됩니다.

Comments