Android Data Binding

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

1. 基本结构

 

1.1 JavaBeans对象

 

public class User { 
private final String firstName; 
public User(String firstName) { 
this.firstName = firstName; 

public String getFirstName() { 
return this.firstName; 


  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

1.2 布局文件

<?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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

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); 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

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

 

2. 动态更新

 

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

 

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

 

2.1 Observable 对象

 

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

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); 


  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

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的方式存储数据。接下来就是在布局中引用了。

<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&lt;String, Object>" /> 
</data> 
 
<LinearLayout 
android:layout_width="match_parent" 
android:layout_height="match_parent"
 
<!-- Observable 对象 --> 
<TextView 
android:text="@{user.firstName}" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" /> 
 
<!-- Observable 字段 --> 
<TextView 
android:text="@{firstName.get()}" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" /> 
 
<!-- Observable 集合 --> 
<TextView 
android:text="@{mapUser[`firstName`]}" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" /> 
 
</LinearLayout> 
</layout> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.

3. RecyclerView动态绑定

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; 
// 这里可以binding.getRoot().findViewById,然后再onBindViewHolder中绑定事件,目前没有找到更方便的方法 

 
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); 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
责任编辑: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开发学

2013-09-22 16:59:02

Informatica

2022-06-01 07:50:46

Web服务WSDL

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

2024-05-17 09:01:24

Swift数据模型Core Data

2024-10-23 08:13:30

Spring响应式编程

2009-11-20 13:51:14

Oracle Data

2009-11-09 16:25:24

WCF Data Co

2012-09-20 10:47:52

IBMdw

2013-12-02 15:43:05

jQuery插件
点赞
收藏

51CTO技术栈公众号