Android MVVM 을 위한 Databinding

앞선 포스팅에서는 MVVM 에 대해 간략히 알아보고 Android 에서 MVVM 을 구현하기 위해 Databinding 이 어떻게 도움이 될 수 있는지 알아보았습니다.

이번에는 MVVM 에 맞는 Databinding 구현을 알아보도록 하겠습니다.

RecyclerView Adapter 와 Data

RecyclerView 나 ListView 처럼 View 아래에 또다른 레이어 형태를 갖춘 UI 컴포넌트에 대해서 접근 하는 것이 쉽지 않습니다. 그래서 이런 경우 Custom Attribute 를 정의해서 구현해야 합니다.

ViewModel 에서 정의된 데이터 리스트를 RecyclerView 의 Custom attribute 와 연결시키고 ViewModel 의 데이터가 변경될때 Custom attribute 와 연결된 함수를 호출하도록 합니다.

간단한 ScaleAnimation 지정하기

위와 같이 Custom Attribute 를 정의하고 Databinding 을 이용하여 xml 과 ViewModel 을 연결하도록 합니다.

애니메이션을 지정하기 위한 클래스를 지정하고 이를 Observable 대상으로 지정합니다. 이후Custom Attribute 를 이용해서 값이 변하게 되면 바인딩 함수를 호출하도록 합니다.

Custom View 에 Databinding 연결하기

Setter 이용하기

Databinding 은 View 에 setter 가 있을 경우 이를 attribute 에 사용하면 자동으로 Setter 함수와 연결해줍니다.

RoundImageView 에 지정된 setRadious() 에서 set 을 뺀 Radious 를 Custom Attribute 로 지정하면 별도의 @BindingAdapter 함수 없이 View 의 setRadious() 에 직접 접근하여 갱신하도록 Databinding 이 제어합니다.

Custom Attribute 2-Way binding 하기

간혹 View 에 지정한 정보를 ViewModel 에도 상호 갱신되도록 해야할 필요가 있습니다. 보통은 ViewModel to View 로 화면을 갱신하는데 이를 1-Way Binding 이라고 하며 반대로 View to ViewModel 화면의 정보를 ViewModel 로 갱신하는 것을 2-Way Binding 이라고 합니다.

<EditText
android:text="@={vm.inputText}" />

위와 같은 방식으로 간단하게 = 를 추가하면 되나 Custom Attribute 는 InverseBindingAdapter 라고 반대로 View 의 정보가 갱신되록 ViewModel 로 이벤트가 전달되도록 만들어줘야 합니다.

View 에서 변화가 생기면 viewVisibleAttrChanged 함수를 호출하도록 등록하고 이때 InverseBindingListener.onChange() 가 호출되면 viewVisibleAttrChangedevent 로 등록된 @InverseBindingAdapter 함수를 호출하도록 합니다.

Custom Attribute 의 양방향 갱신은 위와 같은 방식으로 이루어질 수 있습니다.

종합

이번 포스팅에서는 MVVM 에 맞는 ViewModel 를 잘 구성하기 위해 Databinding 을 통해서 View 와 상호 작용할 수 있는 다양한 방법을 알아보았습니다. Custom Attribute 를 잘 활용할수록 ViewModel 의 독립성을 높일 수 있기 때문에 이에 염두해서 코딩을 하시기 바랍니다.

Next Posting

본격적으로 View 로부터 독립된 ViewModel 이 가지는 충돌들을 하나씩 짚어보고 해결방법을 공유해보도록 하겠습니다.