SlideShare a Scribd company logo
MVVM & Data Binding
Library
Wojciech Topolski
Agenda
• Theory of MVVM
• Data Binding Library
• Custom MVVM(C) implementation
• View Model Composition
• Binding & RecycleView
• Grabbing value directly from View
• Links
Theory of MVVM
• "MVVM facilitates a separation of development of the graphical user interface from development of the
business logic. The view model of MVVM is a value converter; meaning the view model is responsible for
exposing (converting) the data objects from the model in such a way that objects are easily managed and
presented. In this respect, the view model is more model than view, and handles most if not all of the
view's display logic. The view model may implement a mediator pattern, organizing access to the back-
end logic around the set of use cases supported by the view.” (Wikipedia)
• Model - Business data layer, it could be set of POJO objects or layer operating on database/network/
cache. Must be independent of user interface.
• View - User interface.
• View Model - It is responsible for converting data between Model and View, visibility of View components.
Data Binding Library
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

MainActivityBinding binding;

binding = DataBindingUtil.setContentView(this, R.layout.main_activity);

User user = new User("Test", "User");

binding.setUser(user);

}
<layout xmlns:android="http://schemas.android.com/apk/res/android">

<data>

<variable name="user" type="com.example.User"/>

</data>

<LinearLayout ...>

<TextView

android:text="@{user.firstName}"/>

<TextView

android:text="@{user.lastName}"/>

</LinearLayout>

</layout>
BY EXAMPLE
Android Plugin for Gradle 2.1+

https://developer.android.com/topic/libraries/data-binding/index.html
Data Binding Library
Variables and imports in <data>...</data> section.

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:bind="http://schemas.android.com/apk/res-auto">

<data>

<import type="android.view.View" />

<variable

name="viewModel"

type="com.github.wtopolski.libmvvm.viewmodel.ButtonViewModel"/>

</data>



<Button . . . />



</layout>
FEATURE 1 / 15
Data Binding Library
Widgets are available by binding.id expression, where
id is equal to content of android:id attribute. However,
android:id is not obligatory at all.
<TextView android:id=“@+id/someTextView" />
ActivityMainBinding binding = DataBindingUtil.setContentView(

this, R.layout.activity_main);


binding.someTextView.setText("XYZ");
FEATURE 2 / 15
Data Binding Library
Setting almost every widget XML attribute is
possible. Directly by setter paired with attribute like
android:enabled and view.setEnabled(boolean). Or
indirectly using BindingAdapter or BindingMethods.
<EditText

android:enabled=“@{viewModel.enabled}" />
FEATURE 3 / 15
Data Binding Library
Observable variables. Every data change could be
reflected to View. "You can change your data model in
a background thread as long as it is not a collection."
public class BaseViewModel extends BaseObservable {

private boolean enabled;



public void setEnabled(boolean enabled) {

this.enabled = enabled;

notifyPropertyChanged(BR.enabled);

}



@Bindable

public boolean getEnabled() {

return enabled;

}

}
<EditText

android:enabled=“@{viewModel.enabled}" />
FEATURE 4 / 15
Data Binding Library
Two-way data binding allows synchronization
widget's state between user interface and passed
variable. Main restriction is XML attribute must
have listener indicating change of value.


<EditText

android:text="@={viewModel.value}" />
FEATURE 5 / 15
Data Binding Library
EventHandling::MethodReference
• "listener implementation is created when the data is bound”
• "expression is processed at compile time, so if the method does not exist or its signature is not
correct, you receive a compile time error.”
• "method must match the parameters of the event listener”
<Button

android:onClick="@{viewModel::onButtonClick}” />
public void onButtonClick(View view) {

// Some action

}
FEATURE 6 / 15
Data Binding Library
() -> EventHandling.ListenerBindings()
• "listener implementation is created when event is triggered”
• "return value must match the expected return value of the listener (unless it is
expecting void)”
<Button

android:onClick=“@{() -> viewModel.onButtonClick()}” />
public void onButtonClick() {

// Some action

}
FEATURE 7 / 15
Data Binding Library
BindingAdapter allows to set any data using custom
XML attribute. The same solution helps to write
attributes for custom widgets. No more attrs.xml
files!
@BindingAdapter({"errorEnabled"})

public static void errorEnabled(TextInputLayout view, String value) {

view.setError(value);

view.setErrorEnabled(!TextUtils.isEmpty(value));

}
<android.support.design.widget.TextInputLayout

bind:errorEnabled="@{viewModel.valueError}">
FEATURE 8 / 15
Data Binding Library
BindingMethods "Some attributes have setters that
don't match by name… For example, the
android:tint attribute is really associated with
setImageTintList(ColorStateList), not setTint."
@BindingMethods({

@BindingMethod(

type = "android.widget.ImageView",

attribute = "android:tint",

method = "setImageTintList")

})
FEATURE 9 / 15
Data Binding Library
Converter helps to translate given value format into
format which is expected by specific XML tag.
@BindingConversion

public static ColorDrawable convertColorToDrawable(String color) {

return new ColorDrawable(Color.parseColor(color));

}
<LinearLayout

android:background="@{viewModel.color}">
FEATURE 10 / 15
Data Binding Library
In custom XML attributes we can use application
resources.
<TextView

bind:textColor="@{@color/green}" />


<resources>

<color name="green">#009900</color>

</resources>
FEATURE 11 / 15
Data Binding Library
Null Coalescing Operator
<TextView

android:text=“@{user.displayName ?? user.lastName}” />
FEATURE 12 / 15
Data Binding Library
Including layouts. More in View Model Composition
section.
<include

layout="@layout/text_view"

android:layout_width=“match_parent"

android:layout_height=“wrap_content"

bind:viewModel="@{viewModel.redDesc}"

bind:textColor="@{@color/red}" />
FEATURE 13 / 15
Data Binding Library
Immediate Binding. "When a variable or observable
changes, the binding will be scheduled to change
before the next frame...To force execution, use the
executePendingBindings() method."
binding.executePendingBindings();
FEATURE 14 / 15
Data Binding Library
Data Binding doesn't use reflection. Binding classes
are generated almost in real time by Android Studio,
and they are part of application. You can find them in
build directory.
.../build/intermediates/classes/debug/package_name/databinding/*
FEATURE 15 / 15
Custom MVVM(C) implementation
• Bases on Data Binding Library and RxJava
• Layers:
• Model - business data layer (POJO, Database, Cache,
Backend)
• View - user interface (XML and Binding)
• View Model - conversion between displayed data and stored
data (model), validation of forms, etc…
• What’s about Activity and Fragment? Is it View or View Model?
• Or maybe MVVMC? Where:
• Controller - is responsible for global actions like open new
Activities
• View Model - takes care about operation on single screen
https://github.com/wtopolski/androidmvvm
View Model Composition
Real app screens are complicated. Usually they
contain several input and output widgets like
EditText, Button, SeekBar, RecycleView, etc.
It would be useful to create set of Views and View
Models. And then reuse them to composite user
interface.
View Model Composition
View Model Composition
SeekBar View
<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:bind="http://schemas.android.com/apk/res-auto">

<data>

<import type="android.view.View" />

<variable

name="viewModel"

type="com.github.wtopolski.libmvvm.viewmodel.SeekBarViewModel"/>

</data>



<SeekBar

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:max="@{viewModel.max}"

android:progress="@={viewModel.progress}"

android:visibility="@{viewModel.visibility ? View.VISIBLE : View.GONE}"

android:enabled="@{viewModel.enabled}" />



</layout>
View Model Composition
SeekBar View Model
public class SeekBarViewModel extends BaseViewModel {

private int progress;

private int max;

private PublishSubject<Integer> progressObservable = PublishSubject.create();



public SeekBarViewModel() { super(); }



public SeekBarViewModel(boolean enabled, boolean visibility) { super(enabled, visibility); }



public void setProgress(int progress) {

this.progress = progress;

progressObservable.onNext(progress);

notifyPropertyChanged(BR.progress);

}



@Bindable

public int getProgress() { return progress; }



public void setMax(int max) {

this.max = max;

notifyPropertyChanged(BR.max);

}



@Bindable

public int getMax() { return max; }



public Observable<Integer> rxProgress() { return progressObservable.asObservable(); }

}
View Model Composition
activity_color_form.xml ColorFormViewModel.java
Binding & RecycleView
We have to remember that this kind of screen has two sets of
MVVM elements. One for list screen itself. And one for every item
on the list.



colors = generateColors();



adapter = new ColorListAdapter(colors, 

getApplicationContext(), this);



ActivityColorListBinding binding;



binding = DataBindingUtil.setContentView(this, 

R.layout.activity_color_list);



ColorListViewModel viewModel = new ColorListViewModel();



binding.setViewModel(viewModel);



viewModel.configure(true, 

new DefaultItemAnimator(), 

new LinearLayoutManager(this));



viewModel.setAdapter(adapter);
https://github.com/wtopolski/androidmvvm
Binding & RecycleView
More interesting is MVVM for list elements. First of
all, our adapter is much more simple. No more
custom ViewHolders for RecycleView. All we need is
BindingViewHolder.
public class BindingViewHolder extends RecyclerView.ViewHolder {

private ViewDataBinding binding;



public BindingViewHolder(@NonNull ViewDataBinding binding) {

super(binding.getRoot());

this.binding = binding;

}



public ViewDataBinding getBinding() {

return binding;

}

}
Binding & RecycleView
onCreateViewHolder
@Override

public BindingViewHolder onCreateViewHolder(ViewGroup parent, 

int viewType) {



ActivityColorListItemBinding binding = DataBindingUtil.inflate(

LayoutInflater.from(parent.getContext()),

R.layout.activity_color_list_item, 

parent, 

false);



return new BindingViewHolder(binding);

}
Binding & RecycleView
onBindViewHolder
@Override

public void onBindViewHolder(BindingViewHolder holder, int position) {

ActivityColorListItemBinding binding = (ActivityColorListItemBinding)

holder.getBinding();

ColorListItemViewModel viewModel = binding.getViewModel();



// Init new view model object

if (viewModel == null) {

viewModel = new ColorListItemViewModel();

binding.setViewModel(viewModel);

binding.setTextColor(ContextCompat.getColor(context, R.color.colorAccent));

viewModel.setListener(listener);

}



ColorForm form = data.get(position);

viewModel.setAdapterPosition(holder.getAdapterPosition());

viewModel.setData(form);



// Immediate Binding

binding.executePendingBindings();

}
Grabbing value directly from View
Getting value from View which is not available in
ViewModel.
private void checkEnabledStateOnView() {

viewModel.confirm.setEditableObserver(new Subscriber<Boolean>() { . . . 

@Override

public void onNext(Boolean isEnabled) {

// Some code

}

});

binding.executePendingBindings();

}
bind:editableObserver="@{viewModel.editableObserver}"
@BindingAdapter({"editableObserver"})

public static void editableObserver(View view, Subscriber<Boolean> subscriber) {

if (subscriber != null) {

subscriber.onNext(view.isEnabled());

subscriber.onCompleted();

}

}
Links
• MVC VS. MVP VS. MVVM
• Model–view–viewmodel
• Approaching Android with MVVM
• Going with MVVM on Android via Data Binding
• DataBinding: how to develop Android apps faster
• Data Binding Library
• Exploring the MVC, MVP, and MVVM design patterns
• MVVMC thought experiment
• MVVM is dead, long live MVVMC!
• Comparison of Architecture presentation patterns MVP(SC),MVP(PV),PM,MVVM and MVC
• MVMMC – MVVM Grows A Controller

More Related Content

What's hot (20)

PPTX
Jetpack Compose.pptx
GDSCVJTI
 
PDF
ReactJS
Hiten Pratap Singh
 
PDF
Spring Boot
koppenolski
 
PPTX
Android jetpack compose | Declarative UI
Ajinkya Saswade
 
PPT
Angular Introduction By Surekha Gadkari
Surekha Gadkari
 
PDF
Spring Framework - Core
Dzmitry Naskou
 
PPTX
Intro to React
Justin Reock
 
ODP
Introduction to ReactJS
Knoldus Inc.
 
PDF
Spring boot introduction
Rasheed Waraich
 
PPTX
MVC Framework
Ashton Feller
 
PPTX
Angular introduction students
Christian John Felix
 
PDF
Introduction to React JS
Bethmi Gunasekara
 
KEY
Introduction Django
Wade Austin
 
PDF
Spring Framework - AOP
Dzmitry Naskou
 
PDF
Introduction To Angular's reactive forms
Nir Kaufman
 
PPTX
Reactjs
Neha Sharma
 
PDF
Spring Framework
NexThoughts Technologies
 
PDF
Introduction to kotlin for android app development gdg ahmedabad dev fest 2017
Hardik Trivedi
 
PDF
React js
Rajesh Kolla
 
PPTX
C# web api
Simplilearn
 
Jetpack Compose.pptx
GDSCVJTI
 
Spring Boot
koppenolski
 
Android jetpack compose | Declarative UI
Ajinkya Saswade
 
Angular Introduction By Surekha Gadkari
Surekha Gadkari
 
Spring Framework - Core
Dzmitry Naskou
 
Intro to React
Justin Reock
 
Introduction to ReactJS
Knoldus Inc.
 
Spring boot introduction
Rasheed Waraich
 
MVC Framework
Ashton Feller
 
Angular introduction students
Christian John Felix
 
Introduction to React JS
Bethmi Gunasekara
 
Introduction Django
Wade Austin
 
Spring Framework - AOP
Dzmitry Naskou
 
Introduction To Angular's reactive forms
Nir Kaufman
 
Reactjs
Neha Sharma
 
Spring Framework
NexThoughts Technologies
 
Introduction to kotlin for android app development gdg ahmedabad dev fest 2017
Hardik Trivedi
 
React js
Rajesh Kolla
 
C# web api
Simplilearn
 

Viewers also liked (20)

PDF
Data Binding in Action using MVVM pattern
Fabio Collini
 
PDF
Android Data Binding in action using MVVM pattern - droidconUK
Fabio Collini
 
PPTX
Android data binding
Sergi Martínez
 
PPTX
Android MVVM
David Estivariz Pierola
 
PDF
Dominando o Data Binding no Android
Nelson Glauber Leal
 
PDF
MVVM with DataBinding on android
Rodrigo Bressan
 
PPTX
MVVM_Ashraf
Microsoft
 
PPTX
Windows Store Development : MVVM and data binding
Remon Kamel
 
PDF
Frontend Components Outside Main App by Adam Florczak
10Clouds
 
PPTX
iOS 10 Rich Push Notifications
inFullMobile
 
PPTX
Dodanie Prezentacji Z Slide Share Do Blog Engine
daniel.plawgo
 
PPTX
Data binding
Yonatan Levin
 
PDF
Prezi sucks
Arthur Sevenstern
 
PDF
Android Data Binding
Ezequiel Zanetta
 
PDF
Memory Leaks in Android Applications
Lokesh Ponnada
 
PPTX
FFmpeg presentation
Lauren Sorensen
 
PPT
Android - Thread, Handler and AsyncTask
Hoang Ngo
 
PDF
Android Databinding Library
Takuji Nishibayashi
 
PDF
Testable Android Apps using data binding and MVVM
Fabio Collini
 
PPT
FFMPEG on android
Yoss Cohen
 
Data Binding in Action using MVVM pattern
Fabio Collini
 
Android Data Binding in action using MVVM pattern - droidconUK
Fabio Collini
 
Android data binding
Sergi Martínez
 
Dominando o Data Binding no Android
Nelson Glauber Leal
 
MVVM with DataBinding on android
Rodrigo Bressan
 
MVVM_Ashraf
Microsoft
 
Windows Store Development : MVVM and data binding
Remon Kamel
 
Frontend Components Outside Main App by Adam Florczak
10Clouds
 
iOS 10 Rich Push Notifications
inFullMobile
 
Dodanie Prezentacji Z Slide Share Do Blog Engine
daniel.plawgo
 
Data binding
Yonatan Levin
 
Prezi sucks
Arthur Sevenstern
 
Android Data Binding
Ezequiel Zanetta
 
Memory Leaks in Android Applications
Lokesh Ponnada
 
FFmpeg presentation
Lauren Sorensen
 
Android - Thread, Handler and AsyncTask
Hoang Ngo
 
Android Databinding Library
Takuji Nishibayashi
 
Testable Android Apps using data binding and MVVM
Fabio Collini
 
FFMPEG on android
Yoss Cohen
 
Ad

Similar to MVVM & Data Binding Library (20)

PPTX
Fundaments of Knockout js
Flavius-Radu Demian
 
PDF
Knockoutjs databinding
Boulos Dib
 
PPTX
Knockout.js
Vivek Rajan
 
PPTX
Knockoutjs
Karthik Sathyanarayanan
 
PDF
Rp 6 session 2 naresh bhatia
sapientindia
 
PPTX
The Magic of WPF & MVVM
Abhishek Sur
 
PPTX
Asp.NET MVC
vrluckyin
 
PPTX
MV* presentation frameworks in Javascript: en garde, pret, allez!
Roberto Messora
 
PDF
MVVM with Databinding and Google's new ViewModel. UA Mobile 2017.
UA Mobile
 
PPT
MVC
akshin
 
PDF
Effective Android Data Binding
Eric Maxwell
 
PPT
MVC ppt presentation
Bhavin Shah
 
PPTX
Asp.net mvc training
icubesystem
 
PDF
Dialogs in Android MVVM (14.11.2019)
Vladislav Ermolin
 
PPTX
Introduction to XAML and its features
Abhishek Sur
 
PPT
ASP.NET MVC Presentation
ivpol
 
PDF
Data binding 入門淺談
awonwon
 
PDF
How to use data binding in android
InnovationM
 
DOCX
Adding a view
Nhan Do
 
PDF
Developing large scale JavaScript applications
Milan Korsos
 
Fundaments of Knockout js
Flavius-Radu Demian
 
Knockoutjs databinding
Boulos Dib
 
Knockout.js
Vivek Rajan
 
Rp 6 session 2 naresh bhatia
sapientindia
 
The Magic of WPF & MVVM
Abhishek Sur
 
Asp.NET MVC
vrluckyin
 
MV* presentation frameworks in Javascript: en garde, pret, allez!
Roberto Messora
 
MVVM with Databinding and Google's new ViewModel. UA Mobile 2017.
UA Mobile
 
MVC
akshin
 
Effective Android Data Binding
Eric Maxwell
 
MVC ppt presentation
Bhavin Shah
 
Asp.net mvc training
icubesystem
 
Dialogs in Android MVVM (14.11.2019)
Vladislav Ermolin
 
Introduction to XAML and its features
Abhishek Sur
 
ASP.NET MVC Presentation
ivpol
 
Data binding 入門淺談
awonwon
 
How to use data binding in android
InnovationM
 
Adding a view
Nhan Do
 
Developing large scale JavaScript applications
Milan Korsos
 
Ad

Recently uploaded (20)

PDF
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PDF
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
PDF
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PDF
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
PDF
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
PPTX
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
PDF
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PDF
Chris Elwell Woburn, MA - Passionate About IT Innovation
Chris Elwell Woburn, MA
 
PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
PDF
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
PDF
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
PDF
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
PDF
NewMind AI - Journal 100 Insights After The 100th Issue
NewMind AI
 
PPTX
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
PDF
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
Chris Elwell Woburn, MA - Passionate About IT Innovation
Chris Elwell Woburn, MA
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
NewMind AI - Journal 100 Insights After The 100th Issue
NewMind AI
 
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 

MVVM & Data Binding Library

  • 1. MVVM & Data Binding Library Wojciech Topolski
  • 2. Agenda • Theory of MVVM • Data Binding Library • Custom MVVM(C) implementation • View Model Composition • Binding & RecycleView • Grabbing value directly from View • Links
  • 3. Theory of MVVM • "MVVM facilitates a separation of development of the graphical user interface from development of the business logic. The view model of MVVM is a value converter; meaning the view model is responsible for exposing (converting) the data objects from the model in such a way that objects are easily managed and presented. In this respect, the view model is more model than view, and handles most if not all of the view's display logic. The view model may implement a mediator pattern, organizing access to the back- end logic around the set of use cases supported by the view.” (Wikipedia) • Model - Business data layer, it could be set of POJO objects or layer operating on database/network/ cache. Must be independent of user interface. • View - User interface. • View Model - It is responsible for converting data between Model and View, visibility of View components.
  • 4. Data Binding Library protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 MainActivityBinding binding;
 binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
 User user = new User("Test", "User");
 binding.setUser(user);
 } <layout xmlns:android="http://schemas.android.com/apk/res/android">
 <data>
 <variable name="user" type="com.example.User"/>
 </data>
 <LinearLayout ...>
 <TextView
 android:text="@{user.firstName}"/>
 <TextView
 android:text="@{user.lastName}"/>
 </LinearLayout>
 </layout> BY EXAMPLE Android Plugin for Gradle 2.1+
 https://developer.android.com/topic/libraries/data-binding/index.html
  • 5. Data Binding Library Variables and imports in <data>...</data> section.
 <?xml version="1.0" encoding="utf-8"?>
 <layout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:bind="http://schemas.android.com/apk/res-auto">
 <data>
 <import type="android.view.View" />
 <variable
 name="viewModel"
 type="com.github.wtopolski.libmvvm.viewmodel.ButtonViewModel"/>
 </data>
 
 <Button . . . />
 
 </layout> FEATURE 1 / 15
  • 6. Data Binding Library Widgets are available by binding.id expression, where id is equal to content of android:id attribute. However, android:id is not obligatory at all. <TextView android:id=“@+id/someTextView" /> ActivityMainBinding binding = DataBindingUtil.setContentView(
 this, R.layout.activity_main); 
 binding.someTextView.setText("XYZ"); FEATURE 2 / 15
  • 7. Data Binding Library Setting almost every widget XML attribute is possible. Directly by setter paired with attribute like android:enabled and view.setEnabled(boolean). Or indirectly using BindingAdapter or BindingMethods. <EditText
 android:enabled=“@{viewModel.enabled}" /> FEATURE 3 / 15
  • 8. Data Binding Library Observable variables. Every data change could be reflected to View. "You can change your data model in a background thread as long as it is not a collection." public class BaseViewModel extends BaseObservable {
 private boolean enabled;
 
 public void setEnabled(boolean enabled) {
 this.enabled = enabled;
 notifyPropertyChanged(BR.enabled);
 }
 
 @Bindable
 public boolean getEnabled() {
 return enabled;
 }
 } <EditText
 android:enabled=“@{viewModel.enabled}" /> FEATURE 4 / 15
  • 9. Data Binding Library Two-way data binding allows synchronization widget's state between user interface and passed variable. Main restriction is XML attribute must have listener indicating change of value. 
 <EditText
 android:text="@={viewModel.value}" /> FEATURE 5 / 15
  • 10. Data Binding Library EventHandling::MethodReference • "listener implementation is created when the data is bound” • "expression is processed at compile time, so if the method does not exist or its signature is not correct, you receive a compile time error.” • "method must match the parameters of the event listener” <Button
 android:onClick="@{viewModel::onButtonClick}” /> public void onButtonClick(View view) {
 // Some action
 } FEATURE 6 / 15
  • 11. Data Binding Library () -> EventHandling.ListenerBindings() • "listener implementation is created when event is triggered” • "return value must match the expected return value of the listener (unless it is expecting void)” <Button
 android:onClick=“@{() -> viewModel.onButtonClick()}” /> public void onButtonClick() {
 // Some action
 } FEATURE 7 / 15
  • 12. Data Binding Library BindingAdapter allows to set any data using custom XML attribute. The same solution helps to write attributes for custom widgets. No more attrs.xml files! @BindingAdapter({"errorEnabled"})
 public static void errorEnabled(TextInputLayout view, String value) {
 view.setError(value);
 view.setErrorEnabled(!TextUtils.isEmpty(value));
 } <android.support.design.widget.TextInputLayout
 bind:errorEnabled="@{viewModel.valueError}"> FEATURE 8 / 15
  • 13. Data Binding Library BindingMethods "Some attributes have setters that don't match by name… For example, the android:tint attribute is really associated with setImageTintList(ColorStateList), not setTint." @BindingMethods({
 @BindingMethod(
 type = "android.widget.ImageView",
 attribute = "android:tint",
 method = "setImageTintList")
 }) FEATURE 9 / 15
  • 14. Data Binding Library Converter helps to translate given value format into format which is expected by specific XML tag. @BindingConversion
 public static ColorDrawable convertColorToDrawable(String color) {
 return new ColorDrawable(Color.parseColor(color));
 } <LinearLayout
 android:background="@{viewModel.color}"> FEATURE 10 / 15
  • 15. Data Binding Library In custom XML attributes we can use application resources. <TextView
 bind:textColor="@{@color/green}" /> 
 <resources>
 <color name="green">#009900</color>
 </resources> FEATURE 11 / 15
  • 16. Data Binding Library Null Coalescing Operator <TextView
 android:text=“@{user.displayName ?? user.lastName}” /> FEATURE 12 / 15
  • 17. Data Binding Library Including layouts. More in View Model Composition section. <include
 layout="@layout/text_view"
 android:layout_width=“match_parent"
 android:layout_height=“wrap_content"
 bind:viewModel="@{viewModel.redDesc}"
 bind:textColor="@{@color/red}" /> FEATURE 13 / 15
  • 18. Data Binding Library Immediate Binding. "When a variable or observable changes, the binding will be scheduled to change before the next frame...To force execution, use the executePendingBindings() method." binding.executePendingBindings(); FEATURE 14 / 15
  • 19. Data Binding Library Data Binding doesn't use reflection. Binding classes are generated almost in real time by Android Studio, and they are part of application. You can find them in build directory. .../build/intermediates/classes/debug/package_name/databinding/* FEATURE 15 / 15
  • 20. Custom MVVM(C) implementation • Bases on Data Binding Library and RxJava • Layers: • Model - business data layer (POJO, Database, Cache, Backend) • View - user interface (XML and Binding) • View Model - conversion between displayed data and stored data (model), validation of forms, etc… • What’s about Activity and Fragment? Is it View or View Model? • Or maybe MVVMC? Where: • Controller - is responsible for global actions like open new Activities • View Model - takes care about operation on single screen https://github.com/wtopolski/androidmvvm
  • 21. View Model Composition Real app screens are complicated. Usually they contain several input and output widgets like EditText, Button, SeekBar, RecycleView, etc. It would be useful to create set of Views and View Models. And then reuse them to composite user interface.
  • 23. View Model Composition SeekBar View <?xml version="1.0" encoding="utf-8"?>
 <layout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:bind="http://schemas.android.com/apk/res-auto">
 <data>
 <import type="android.view.View" />
 <variable
 name="viewModel"
 type="com.github.wtopolski.libmvvm.viewmodel.SeekBarViewModel"/>
 </data>
 
 <SeekBar
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:max="@{viewModel.max}"
 android:progress="@={viewModel.progress}"
 android:visibility="@{viewModel.visibility ? View.VISIBLE : View.GONE}"
 android:enabled="@{viewModel.enabled}" />
 
 </layout>
  • 24. View Model Composition SeekBar View Model public class SeekBarViewModel extends BaseViewModel {
 private int progress;
 private int max;
 private PublishSubject<Integer> progressObservable = PublishSubject.create();
 
 public SeekBarViewModel() { super(); }
 
 public SeekBarViewModel(boolean enabled, boolean visibility) { super(enabled, visibility); }
 
 public void setProgress(int progress) {
 this.progress = progress;
 progressObservable.onNext(progress);
 notifyPropertyChanged(BR.progress);
 }
 
 @Bindable
 public int getProgress() { return progress; }
 
 public void setMax(int max) {
 this.max = max;
 notifyPropertyChanged(BR.max);
 }
 
 @Bindable
 public int getMax() { return max; }
 
 public Observable<Integer> rxProgress() { return progressObservable.asObservable(); }
 }
  • 26. Binding & RecycleView We have to remember that this kind of screen has two sets of MVVM elements. One for list screen itself. And one for every item on the list.
 
 colors = generateColors();
 
 adapter = new ColorListAdapter(colors, 
 getApplicationContext(), this);
 
 ActivityColorListBinding binding;
 
 binding = DataBindingUtil.setContentView(this, 
 R.layout.activity_color_list);
 
 ColorListViewModel viewModel = new ColorListViewModel();
 
 binding.setViewModel(viewModel);
 
 viewModel.configure(true, 
 new DefaultItemAnimator(), 
 new LinearLayoutManager(this));
 
 viewModel.setAdapter(adapter); https://github.com/wtopolski/androidmvvm
  • 27. Binding & RecycleView More interesting is MVVM for list elements. First of all, our adapter is much more simple. No more custom ViewHolders for RecycleView. All we need is BindingViewHolder. public class BindingViewHolder extends RecyclerView.ViewHolder {
 private ViewDataBinding binding;
 
 public BindingViewHolder(@NonNull ViewDataBinding binding) {
 super(binding.getRoot());
 this.binding = binding;
 }
 
 public ViewDataBinding getBinding() {
 return binding;
 }
 }
  • 28. Binding & RecycleView onCreateViewHolder @Override
 public BindingViewHolder onCreateViewHolder(ViewGroup parent, 
 int viewType) {
 
 ActivityColorListItemBinding binding = DataBindingUtil.inflate(
 LayoutInflater.from(parent.getContext()),
 R.layout.activity_color_list_item, 
 parent, 
 false);
 
 return new BindingViewHolder(binding);
 }
  • 29. Binding & RecycleView onBindViewHolder @Override
 public void onBindViewHolder(BindingViewHolder holder, int position) {
 ActivityColorListItemBinding binding = (ActivityColorListItemBinding)
 holder.getBinding();
 ColorListItemViewModel viewModel = binding.getViewModel();
 
 // Init new view model object
 if (viewModel == null) {
 viewModel = new ColorListItemViewModel();
 binding.setViewModel(viewModel);
 binding.setTextColor(ContextCompat.getColor(context, R.color.colorAccent));
 viewModel.setListener(listener);
 }
 
 ColorForm form = data.get(position);
 viewModel.setAdapterPosition(holder.getAdapterPosition());
 viewModel.setData(form);
 
 // Immediate Binding
 binding.executePendingBindings();
 }
  • 30. Grabbing value directly from View Getting value from View which is not available in ViewModel. private void checkEnabledStateOnView() {
 viewModel.confirm.setEditableObserver(new Subscriber<Boolean>() { . . . 
 @Override
 public void onNext(Boolean isEnabled) {
 // Some code
 }
 });
 binding.executePendingBindings();
 } bind:editableObserver="@{viewModel.editableObserver}" @BindingAdapter({"editableObserver"})
 public static void editableObserver(View view, Subscriber<Boolean> subscriber) {
 if (subscriber != null) {
 subscriber.onNext(view.isEnabled());
 subscriber.onCompleted();
 }
 }
  • 31. Links • MVC VS. MVP VS. MVVM • Model–view–viewmodel • Approaching Android with MVVM • Going with MVVM on Android via Data Binding • DataBinding: how to develop Android apps faster • Data Binding Library • Exploring the MVC, MVP, and MVVM design patterns • MVVMC thought experiment • MVVM is dead, long live MVVMC! • Comparison of Architecture presentation patterns MVP(SC),MVP(PV),PM,MVVM and MVC • MVMMC – MVVM Grows A Controller