1. Basic structure 1.1 JavaBeans Objects - public class User {
- private final String firstName;
- public User(String firstName) {
- this .firstName = firstName;
- }
- public String getFirstName() {
- return this .firstName;
- }
- }
1.2 Layout File - <?xml version= "1.0" encoding= "utf-8" ?>
- <layout xmlns:android= "http://schemas.android.com/apk/res/android" >
- <data>
- <variable name= "user" type= "com.example.User" />
- </data>
- <LinearLayout
- android:orientation= "vertical"
- android:layout_width= "match_parent"
- android:layout_height= "match_parent" >
- <TextView android:layout_width= "wrap_content"
- android:layout_height= "wrap_content"
- android:text= "@{user.firstName}" />
- </LinearLayout>
- </layout>
1.3 Activity - @Override
- protected void onCreate(Bundle savedInstanceState) {
- super .onCreate(savedInstanceState);
- ActivityMainBinding binding = DataBindingUtil.setContentView( this , R.layout.main_activity);
- User user = new User( "Test" );
- binding.setUser(user);
- }
The above three steps complete the basic data binding 2. Dynamic Updates When the data of the JavaBean object changes, the View is automatically updated. Normal data sources can only be bound. If you want to update dynamically, you must use Observable to store data. The following are three ways to implement Observable. 2.1 Observable Object Implement android.databinding.Observable or inherit its implementation class - private static class User extends BaseObservable {
- private String firstName;
- @Bindable
- public String getFirstName() {
- return this .firstName;
- }
- public void setFirstName(String firstName) {
- this .firstName = firstName;
- notifyPropertyChanged(BR.firstName);
- }
- }
2.2 Observable Fields Basic data types have corresponding Observable classes public final ObservableField<String> firstName = new ObservableField<>(); 2.3 Observable Collections ObservableArrayMap<String, Object> mapUser = new ObservableArrayMap<>(); user.put("firstName", "Google"); 2.4 References Whether it is an object, field or collection, data is stored in the form of Observable. The next step is to reference it in the layout. - <layout xmlns:android= "http://schemas.android.com/apk/res/android" >
- <data>
- < import type= "android.databinding.ObservableMap" />
- <variable name= "user" type= "com.example.ObservableUser" />
- <variable name= "firstName" type= "android.databinding.ObservableField" />
- <variable name= "mapUser" type= "ObservableMap<String, Object>" />
- </data>
-
- <LinearLayout
- android:layout_width= "match_parent"
- android:layout_height= "match_parent" >
-
- <!-- Observable object -->
- <TextView
- android:text= "@{user.firstName}"
- android:layout_width= "wrap_content"
- android:layout_height= "wrap_content" />
-
- <!-- Observable fields -->
- <TextView
- android:text= "@{firstName.get()}"
- android:layout_width= "wrap_content"
- android:layout_height= "wrap_content" />
-
- <!-- Observable Collection -->
- <TextView
- android:text= "@{mapUser[`firstName`]}"
- android:layout_width= "match_parent"
- android:layout_height= "wrap_content" />
-
- </LinearLayout>
- </layout>
3. RecyclerView dynamic binding - private static class RecyclerViewAdapter
- extends RecyclerView.Adapter<RecyclerViewAdapter.BindingHolder> {
-
- private List<Model> mModels;
-
- public static class BindingHolder extends RecyclerView.ViewHolder {
- private final ViewDataBinding binding;
-
- public BindingHolder(ViewDataBinding binding) {
- super (binding.getRoot());
- this .binding = binding;
-
- }
-
- public ViewDataBinding getBinding() {
- return binding;
- }
- }
-
- @Override
- public BindingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- ViewDataBinding binding = DataBindingUtil.inflate(
- LayoutInflater.from(parent.getContext()),
- R.layout.list_item,
- parent,
- false );
-
- BindingHolder holder = new BindingHolder(binding);
|