DataBinding系列四、数据更新
来源:互联网 发布:国际通用顶级域名 编辑:程序博客网 时间:2024/05/05 07:12
对于data binding 目前已经知道
1. 将对像属性绑定到view(数据->view)
2. 将事件响应方法绑定到view(view->数据)
3. 使用绑定时运行的表达式进行小量的逻辑编写
但是,如何将对像数据的变化更新到view呢?
可以使用data binding 的setXXX方法,将对像绑定到view,但这是低效的,因为只有变化的数据才需要更新到view。对此,data binding 提供了基于观察者模式的一些方法,数据类实现这些方法后,再修改数据就会自动通知view去更新。
1.Observable Objects
可观察对像:对像中的属性变化时,更新到view,可以更新对像所有属性,也可以只更新其中一个。
方法是使对像继承BaseObservable,当数据变化时调用notifyChange或者notifyPropertyChanged函数来通知修改,data bingding就会更新数据到view,示例如下:
public class User extends BaseObservable{ private String userName; //使用@Bindable注释,产生BR.XXX @Bindable public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; notifyPropertyChanged(BR.userName);//通知某个变量发生了变化 }}
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="@{user.userName}" android:textSize="24sp" />
//创建一个线程来更新数据
new Thread() { @Override public void run() { int i = 0; do { try { Thread.*sleep*(2000); } catch (InterruptedException e) { e.printStackTrace(); } user.setUserName("user " + i++);//愉快地发现不用手动发消息更新UI了 } while (true); }}.start();
如果数据类已经有其他基类了,基于java是单继承,不能使用BaseObservable类,那么可以implements Observable接口,并使用PropertyChangeRegistry来存取数据。
2.Observable Fields
可观察属性:某个属性变化时更新到view
对于这种方法,根据数据类型不同,可以使用的类为:
ObservableFields<T>
以及不需要装箱和拆箱的(可以加快速度):
ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble,ObservableParcelable
示例:
public class User { public ObservableField<String> name=new ObservableField<>();}//赋值user.name.set("user "+count++);//取值user.name.get();
查看它的工作原理,发现它是对上面第一种方法的封装,只是每个类只有一个属性值:
public class ObservableField<T> extends BaseObservable implements Serializable { private T mValue; //...... public T get() { return mValue; } public void set(T value) { if (value != mValue) { mValue = value; notifyChange(); } }}
3.Observable Collections
可观察的集合:当集合中数据变化中,自动更新到view
可使用的类为:
ObservableArrayMap
ObservableArrayList
示例:
public class User { public ObservableArrayMap<String,Object> data=new ObservableArrayMap<>();}
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text='@{((ObservableMap<String, Object>)user.data)["sex"]}' /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text='@{String.valueOf(((ObservableMap<String, Object>)user.data)["age"])}' />
//动态改变
new Thread() { @Override public void run() { int count = 0; do { user.data.put("sex", "male"); user.data.put("age", count); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } while (mRun); } }.start();
这两个类也是封装第一种方法实现。
- DataBinding系列四、数据更新
- DataBinding系列(四):DataBinding进阶之路
- DataBinding系列一、绑定数据到view
- Android官方DataBinding(二):动态数据更新notifyPropertyChanged
- Android官方DataBinding(三):RecyclerView 使用ViewDataBinding更新数据
- DataBinding学习(四)
- silverlight系列(DataBinding、DataGrid)
- DataBinding系列三、表达式
- DataBinding系列五、XXXBinding
- DataBinding系列(一):DataBinding初认识
- 数据绑定技术-databinding
- 数据绑定框架:Databinding
- DataBinding动态改变数据
- (四)数据库数据更新
- 更新Gradle后Databinding问题
- Android DataBinding (四) 自定义属性
- DataBinding 学习系列(4)DataBinding的高级功能
- DataBinding系列(二):DataBinding的基本用法
- CodeForces - 742C Arpa's loud Owf and Mehrdad's evil plan
- 引用类型错误导致编译错误------浪费5-10分钟
- AOP面向切面编程简介
- jQuery
- sparksql获取网络输入流
- DataBinding系列四、数据更新
- C#直接调用IE打开指定的网页文件
- 优雅降级和渐进增强
- 用redis来实现具有ack机制的消息队列
- PV UV定义
- Linux 运行在99.6%的TOP500超级计算机上
- malab实现,参数估计的梯度下降法
- JavaEE Spring框架学习笔记(理论学习之通过注解的方式定义和管理Bean)
- 多态