Android 数据绑定:属性依赖

shiyishi 8年前
   <p style="text-align:center"><img src="https://simg.open-open.com/show/9b5fbe709f1545bec39785a64662dbbd.jpg"></p>    <p style="text-align:center">icon.jpeg</p>    <h3>Android 数据绑定:属性依赖</h3>    <p><a href="/misc/goto?guid=4959740336864623161" rel="nofollow,noindex">Android Studio 2.3 正式版已经发布</a> ,现在我想谈一些你可能会在数据绑定中使用到的新特征. 其中一件很酷的事就是你可以创建属性依赖。</p>    <p>命名,命名,命名</p>    <p>假设在应用中,我用一个 viewmodel 来表示用户。它会包含 first name , last name , user name , 和 display name . 当这些属性改变的时候,UI也应当跟着变化, 所以 我需要让它可以被观察 。</p>    <pre>  <code class="language-java">public class User extends BaseObservable {      private String firstName;      private String lastName;      private String userName;      private Resources resources;      public User(Resources resources) {          this.resources = resources;      }      @Bindable      public String getFirstName() {          return firstName;      }        public void setFirstName(String firstName) {          this.firstName = firstName;          notifyPropertyChanged(BR.firstName);          notifyPropertyChanged(BR.displayName);      }        @Bindable      public String getLastName() {          return lastName;      }        public void setLastName(String lastName) {          this.lastName = lastName;          notifyPropertyChanged(BR.lastName);          notifyPropertyChanged(BR.displayName);      }        @Bindable      public String getUserName() {          return userName;      }        public void setUserName(String userName) {          this.userName = userName;          notifyPropertyChanged(BR.userName);          notifyPropertyChanged(BR.displayName);      }        @Bindable      public String getDisplayName() {          if (firstName == null) {              if (lastName == null) {                  return userName;              } else {                  return lastName;              }          } else if (lastName == null) {              return firstName;          } else {              return resources.getString(R.id.name,                  firstName, lastName);          }      }  }</code></pre>    <p>你可以看到在 display name 没有可以回退的地方。它只是检查其它的属性并且基于它们产生一个值。</p>    <p>在 User 类里,不管是 firstName , lastName , 还是 userNames 改变, displayName 都会被更新因为我已经在它们各自的 setter 方法中通知了。</p>    <p>这是一个常见的情景:一个属性依赖另一个属性。依赖的属性 (e.g. setFirstName())必须通知它的依赖属性改变,但是这并不好.</p>    <p>声明属性依赖</p>    <p>在 Android Studio 2.3 ,你可以声明一个可绑定的属性来依赖其他属性:</p>    <pre>  <code class="language-java">public class User extends BaseObservable {      //...        @Bindable      public String getFirstName() { ... }      public void setFirstName(String firstName) {          this.firstName = firstName;          notifyPropertyChanged(BR.firstName);      }        @Bindable      public String getLastName() { ... }      public void setLastName(String lastName) {          this.lastName = lastName;          notifyPropertyChanged(BR.lastName);      }        @Bindable      public String getUserName() { ... }        public void setUserName(String userName) {          this.userName = userName;          notifyPropertyChanged(BR.userName);      }        @Bindable({"firstName", "lastName", "userName"})      public String getDisplayName() { ... }  }</code></pre>    <p>Bindable 注解使用一个可选的参数来声明这些依赖。 displayName 属性被声明依赖于 firstName, lastName, 和 userName 属性。不管这些属性有什么改变, displayName 都会被更新。</p>    <p>这些依赖完全是在生成的 bingding 文件被估算的。那也意味着如果你附加一个 Observable 给 User ,当其它属性改变的时候,你不会得到一个给 displayName 的通知。</p>    <p>使用属性依赖可以帮助你清理 viewModel 。当潜在的数据模型是相对标准化— 在多个属性里数据不是重复的 — viewmodel 是为了展示UI而定做的。 那意味着属性间会经常相互影响。</p>    <p>举个例子,想象一下你的UI展示一张账单,你的商店基于购买的总额给予折扣。这个折扣也可以基于总额的一部分。然后,如果你想根据发货的状态来更改折扣,只需要更新折扣属性,而不用更新状态属性。</p>    <p>属性依赖会帮助你使你的 viewmodel 稍微简洁一点并且更容易维护。</p>    <p> </p>    <p> </p>    <p>来自:http://www.jianshu.com/p/bc55ca46dc1a</p>    <p> </p>