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()
가 호출되면 viewVisibleAttrChanged
이 event
로 등록된 @InverseBindingAdapter
함수를 호출하도록 합니다.
Custom Attribute 의 양방향 갱신은 위와 같은 방식으로 이루어질 수 있습니다.
종합
이번 포스팅에서는 MVVM 에 맞는 ViewModel 를 잘 구성하기 위해 Databinding 을 통해서 View 와 상호 작용할 수 있는 다양한 방법을 알아보았습니다. Custom Attribute 를 잘 활용할수록 ViewModel 의 독립성을 높일 수 있기 때문에 이에 염두해서 코딩을 하시기 바랍니다.
Next Posting
본격적으로 View 로부터 독립된 ViewModel 이 가지는 충돌들을 하나씩 짚어보고 해결방법을 공유해보도록 하겠습니다.