android MVVM开发模式(四)

android MVVM开发模式(四)

上节我们讲了自定义的@BindingAdapter,来扩展属性功能的时候,第一步添加了一个自定义属性 这个其实是多余的。(我当时按照自定义view属性去做了,其实data-binding是不用这个的,它的实现原理是找到标记为@BindingAdapter对应属性之后,依据这个函数生成代码即可,这个属性在真正的xml里面,是会去掉的。)

这个是怎么发现的呢?

在继续思考@BindingAdapter的定义时候发现的。因为我们标记的时候,后面的参数可能是任意结构的,而本身属性里面标记的类型是有限的,从这里发现这个问题的。

小插曲 说完了。

我们上一节说了怎么玩@BindingAdapter,我们再来说下它是做什么的

  • 通过标记一个静态方法为@BindingAdapter,标记附加值为对应属性。
  • 静态方法参数:第一个为view的类型,随后参数就是我们关联的变量类型。
  • 目的就是可以自定义任意形式的属性适配器。

我们之前还讲了BaseObservable类 和 @Bindable

  • 使用类继承BaseObservable后,然后在属性的前面标记为@Bindable,这个属性则是可以通知的。通过使用 notifyPropertyChanged(BR.age);向界面通知。 参数就是这个属性对应的值。

回顾完成,我们看到了这个现在做的是数据更改,通知给view,没有一个view上面输入数据后,反馈给数据这边。因此我们这节解决这个问题。

我们一起看步骤:

1 setAge函数

  • 这里我们多了一个条件判断,判断如果没有变化,停止设置text,原因是如果不设置,因为设置text会引起文本改变回调,回调回来又设置文本,又引起文本改变,继续回调,造成无限循环。

2 再加一个标记适配器

  • 参数注意,第二个参数要求是这个InverseBindingListener,原因是我们作为双向通讯,这个作为桥梁。这里我们使用检测文本改变,然后调用 ageAttrChanged.onChange();即可。

3 牵线搭桥

  • 关键的标注来了。@InverseBindingAdapter,两个参数,属性 和事件。事件后面的值和上面2里面的标注适配器值一样。

这里我们停一下,思考下,两个适配器

和一个关联

它的逻辑思路是:

适配器ageAttrChanged 来完成TextView的注册文本改变消息处理。里面使用onChange()调用。

关联的来处理onChange()的内部实现,返回值就是你的变量类型。

4 临门一脚

改变@ 为 @= ,变为双向方式

如此一来,达到view的数据变化,传递给数据这边。我们之前讲过如何将数据通知给view。这两个组合起来,则完成了双向通讯。

5 验证

  • 这里先设置为28,然后在post里面做文本变更,通知到数据那边,然后数据那边设置一下,反馈给界面验证。
  • 这里为什么用post呢?原因是binding内部处理数据是个异步的,所以当前这个消息队列里面,如果我们修改文本,因为文本改变回调还没注册呢,导致数据那边没同步了。(当然实际使用中这个情况很少的啦。)

6代码

https://github.com/luxiaoming/MVVMDemo

原文发布于微信公众号 - 代码GG之家(code_gg_home)

原文发表时间:2016-07-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏york技术分享

sed 使用教程 - 通读篇(30分钟入门系列)

和上篇 awk 分享一样,作为通读性的分享,不想引入太过复杂的东西,依然从日常工作中碰到的 80% 的需求出发,重点阐述最重点的部门,工作原理等,普及一些对se...

50022
来自专栏Pythonista

vim与程序员

所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在。

1822
来自专栏程序员互动联盟

【专业技术】在C/C++程序中打印当前函数调用栈

前几天帮同事跟踪的一个程序莫名退出,没有core dump(当然ulimit是打开的)的问题。我们知道,正常情况下,如果程序因为某种异常条件退出的话,应该会产生...

3074
来自专栏Android 研究

Android系统启动——3init.rc解析

init.rc文件是以“块”(section)为单位服务的,,一个“块”(section)可以包含多行。“块”(section)分成两大类:一类称为"动作(ac...

4582
来自专栏Java后端技术

详解web.xml中元素的加载顺序

  最近在项目中遇到了启动时出现加载service注解注入失败的问题,后来经过不懈努力发现了是因为web.xml配置文件中的元素加载顺序导致的,那么就抽空研究了...

1102
来自专栏Jerry的SAP技术分享

使用JavaScript给对象修改注册监听器

我们在开发一些大型前端项目时,会遇到这样一种情况,某个变量上有个字段。我们想知道是哪一段程序修改了这个变量上的字段。比如全局变量window上我们自定义了一个新...

882
来自专栏Coding+

Vim 快捷键说明及常用命令

1112
来自专栏JackeyGao的博客

Django小技巧15: 使用基于类视图的Mixins

依类似的方式, 你可以在UpdateView中, 重用相同的FormMessageMixin, 并覆盖默认的form_invalid_message方法.

883
来自专栏我的博客

坑爹的BOM

场景:开发小程序使用wx.request请求数据时提示Cannot read property of ‘xxxx’ undefined…….. ...

34010
来自专栏我的博客

坑爹的serialize和unserialize

今天项目当中遇到一个奇葩的问题,无法返序列化!!!! a:2:{s:9:”condition”;s:0:”;s:5:”value”;  这是其中的一段字符串! ...

2864

扫码关注云+社区

领取腾讯云代金券