Android Data Binding

移动开发 Android
正常的数据源只能做到绑定,想要动态更新,就必须要用Observable的方式存储数据,以下是实现Observable的三种方式。

1. 基本结构

 

1.1 JavaBeans对象

 

  1. public class User { 
  2. private final String firstName; 
  3. public User(String firstName) { 
  4. this.firstName = firstName; 
  5. public String getFirstName() { 
  6. return this.firstName; 

1.2 布局文件

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <layout xmlns:android="http://schemas.android.com/apk/res/android"
  3. <data> 
  4. <variable name="user" type="com.example.User"/> 
  5. </data> 
  6. <LinearLayout 
  7. android:orientation="vertical" 
  8. android:layout_width="match_parent" 
  9. android:layout_height="match_parent"
  10. <TextView android:layout_width="wrap_content" 
  11. android:layout_height="wrap_content" 
  12. android:text="@{user.firstName}"/> 
  13. </LinearLayout> 
  14. </layout> 

1.3 Activity

  1. @Override 
  2. protected void onCreate(Bundle savedInstanceState) { 
  3. super.onCreate(savedInstanceState); 
  4. ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity); 
  5. User user = new User("Test"); 
  6. binding.setUser(user); 

以上三步完成了基本数据绑定

 

2. 动态更新

 

当JavaBean对象的数据发生变化时,View自动更新。

 

正常的数据源只能做到绑定,想要动态更新,就必须要用Observable的方式存储数据,以下是实现Observable的三种方式。

 

2.1 Observable 对象

 

实现android.databinding.Observable或继承其实现类

  1. private static class User extends BaseObservable { 
  2. private String firstName; 
  3. @Bindable 
  4. public String getFirstName() { 
  5. return this.firstName; 
  6. public void setFirstName(String firstName) { 
  7. this.firstName = firstName; 
  8. notifyPropertyChanged(BR.firstName); 

2.2 Observable 字段

基本的数据类型都有相应的Observable类

public final ObservableField<String> firstName = new ObservableField<>();

2.3 Observable 集合

ObservableArrayMap<String, Object> mapUser = new ObservableArrayMap<>();

 

user.put("firstName", "Google");

 

2.4 引用

无论是对象、字段还是集合,都是以Observable的方式存储数据。接下来就是在布局中引用了。

  1. <layout xmlns:android="http://schemas.android.com/apk/res/android"
  2. <data> 
  3. <import type="android.databinding.ObservableMap" /> 
  4. <variable name="user" type="com.example.ObservableUser" /> 
  5. <variable name="firstName" type="android.databinding.ObservableField" /> 
  6. <variable name="mapUser" type="ObservableMap&lt;String, Object>" /> 
  7. </data> 
  8.  
  9. <LinearLayout 
  10. android:layout_width="match_parent" 
  11. android:layout_height="match_parent"
  12.  
  13. <!-- Observable 对象 --> 
  14. <TextView 
  15. android:text="@{user.firstName}" 
  16. android:layout_width="wrap_content" 
  17. android:layout_height="wrap_content" /> 
  18.  
  19. <!-- Observable 字段 --> 
  20. <TextView 
  21. android:text="@{firstName.get()}" 
  22. android:layout_width="wrap_content" 
  23. android:layout_height="wrap_content" /> 
  24.  
  25. <!-- Observable 集合 --> 
  26. <TextView 
  27. android:text="@{mapUser[`firstName`]}" 
  28. android:layout_width="match_parent" 
  29. android:layout_height="wrap_content" /> 
  30.  
  31. </LinearLayout> 
  32. </layout> 

3. RecyclerView动态绑定

  1. private static class RecyclerViewAdapter 
  2. extends RecyclerView.Adapter<RecyclerViewAdapter.BindingHolder> { 
  3.  
  4. private List<Model> mModels; 
  5.  
  6. public static class BindingHolder extends RecyclerView.ViewHolder { 
  7. private final ViewDataBinding binding; 
  8.  
  9. public BindingHolder(ViewDataBinding binding) { 
  10. super(binding.getRoot()); 
  11. this.binding = binding; 
  12. // 这里可以binding.getRoot().findViewById,然后再onBindViewHolder中绑定事件,目前没有找到更方便的方法 
  13.  
  14. public ViewDataBinding getBinding() { 
  15. return binding; 
  16.  
  17. @Override 
  18. public BindingHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
  19. ViewDataBinding binding = DataBindingUtil.inflate( 
  20. LayoutInflater.from(parent.getContext()), 
  21. R.layout.list_item, 
  22. parent, 
  23. false); 
  24.  
  25. BindingHolder holder = new BindingHolder(binding); 
责任编辑:chenqingxiang 来源: LeoHsiun
相关推荐

2015-08-11 10:48:00

DataBindingAndroid

2013-12-26 16:59:12

Android开发Android应用数据绑定Data Bi

2017-05-24 18:00:13

AndroidAndroid DatView

2009-12-17 15:56:34

Rails参数bind

2013-07-23 05:56:12

Android程序drawable资源保Androidj开发学

2022-06-01 07:50:46

Web服务WSDL

2013-09-22 16:59:02

Informatica

2021-01-08 10:19:36

鸿蒙HarmonyOS应用

2017-08-07 10:04:49

数据数据治理数据管理

2011-08-10 16:45:55

Big Data

2012-05-28 13:58:36

Hadoop大数据

2022-08-31 14:58:48

data lakescloud natibig data

2012-12-25 10:44:06

IBMdW

2018-04-23 10:36:45

Amazon数据处理Kinesis Dat

2009-11-20 13:51:14

Oracle Data

2024-05-17 09:01:24

Swift数据模型Core Data

2024-10-23 08:13:30

Spring响应式编程

2009-11-09 16:25:24

WCF Data Co

2012-09-20 10:47:52

IBMdw

2013-09-22 10:15:01

Spring DataJPA
点赞
收藏

51CTO技术栈公众号