数据中介者---强大的数据绑定3

DataMediator 1.4.4 版本新增强大的数据绑定功能,支持属性链绑定,能够完美解决嵌套问题,并支持延迟填充回调。适用于多种数据结构,包括 List 和 SparseArray。

数据中介者DataMediator

  • 已经发布新版本 1.4.4了。 此版本增加了更加强大的数据绑定。请看下面示例然后我再细说。

    // 测试属性链的绑定。
    public class SimplePropertyChainActivity extends BaseActivity {
    
      //'viewBind' is a property name of RootModule.
      @BindView(R.id.v_enable)@BindEnable("viewBind.enable")
      View mV_enable;
    
      @BindView(R.id.v_bg) @BindBackground("viewBind.background")
      View mV_bg;
    
      @BindView(R.id.v_bg_color)@BindBackgroundColor("viewBind.backgroundColor")
      View mV_bg_color;
    
      @BindView(R.id.v_bg_res)@BindBackgroundRes("viewBind.backgroundRes")
      View mV_bg_res;
    
      @BindView(R.id.v_visibility)@BindVisibility("viewBind.visible")
      View mV_visibility;
    
      private ResHelper mHelper = new ResHelper();
      private Binder<RootModule> rootBinder;
      private DataMediator<ViewBind> dm_viewBind;
    
      @Override
      protected int getLayoutId() {
          return R.layout.ac_test_view_bind;
      }
      @Override
      protected void onInit(Context context, Bundle savedInstanceState) {
          mHelper.init(context);
    
          RootModule rootModule = DataMediatorFactory.createData(RootModule.class);
          rootModule.setViewBind(DataMediatorFactory.createData(ViewBind.class));
    
          //bind data.
          rootBinder = DataMediatorFactory.bind(this, rootModule);
          dm_viewBind = DataMediatorFactory.createDataMediator(
                  rootBinder.getDataMediator(), rootModule.getViewBind());
      }
    
      @OnClick(R.id.bt_change_bg)
      public void onClickChangeBg(View v){
          //改变背景(drawable)
          dm_viewBind.getDataProxy().setBackground(mHelper.toggleDrawable());
      }
    
      @OnClick(R.id.bt_change_bg_color)
      public void onClickChangeBgColor(View v){
          //改变背景(color)
          dm_viewBind.getDataProxy().setBackgroundColor(mHelper.toggleColor());
      }
    
      @OnClick(R.id.bt_change_bg_res)
      public void onClickChangeBgRes(View v){
          //改变背景(resource id)
          dm_viewBind.getDataProxy().setBackgroundRes(mHelper.toggleDrawableRes());
      }
    
      @OnClick(R.id.bt_change_enable)
      public void onClickChangeEnable(View v){
          //改变enable 状态
          dm_viewBind.getDataProxy().setEnable(!dm_viewBind.getData().isEnable());
      }
      @OnClick(R.id.bt_change_visibility)
      public void onClickChangeVisibility(View v){
          dm_viewBind.getDataProxy().setVisible(!dm_viewBind.getDataProxy().isVisible());
      }
    }复制代码
  • 相信大家已经看到了, 这个版本的核心功能就是增强数据绑定的功能: 支持绑定属性链了。

绑定属性链的来源和优势

  • 在实际开发中,我们数据的来源一般3种:
    • 1, 只通过网络请求.
    • 2, 只通过上一个界面传递数据/其他地方获取.
    • 3, 两者之间的混合.
  • 不管是上面哪一种,我们的最终数据很可能是一个类似于树结构的数据对象.
    里面嵌套了很多数据。

    而我们的视图层需要的数据可能是嵌套的

    属性链的绑定就是为了解决这个问题。
  • 属性链绑定的优势:

    • 1, 可以完美解决嵌套问题。
    • 2, 支持延迟填充回调。比如我有下面这样一个数据模型

      //2个属性: 一个结构为ViewBind , 一个为List<ViewBind>
      @Fields({
         @Field(propName = "viewBind" , type = ViewBind.class),
         @Field(propName = "viewBindList" , type = ViewBind.class, complexType = FieldFlags.COMPLEX_LIST),
      })
      public interface RootModule extends DataPools.Poolable {
      
      Property PROP_viewBind = SharedProperties.get(ViewBind.class.getName(), "viewBind", 0);
      Property PROP_viewBindList = SharedProperties.get(ViewBind.class.getName(), "viewBindList", 2);
      
      RootModule setViewBind(ViewBind viewBind1);
      
      ViewBind getViewBind();
      
      RootModule setViewBindList(List<ViewBind> viewBindList1);
      
      List<ViewBind> getViewBindList();
      
      ListPropertyEditor<? extends RootModule, ViewBind> beginViewBindListEditor();
      }复制代码

      在使用的时候,步骤可以先绑定--》再去加载数据--》然后再inflate属性链挂载回调。
      demo如下。

      public class PendingPropertyChainActivity extends BaseActivity {
      
      @BindView(R.id.v_bg) @BindBackground("viewBind.background")
      View mV_bg;
      
      private ResHelper mHelper = new ResHelper();
      private Binder<RootModule> rootBinder;
      private DataMediator<ViewBind> dm_viewBind;
      
      @Override
      protected int getLayoutId() {
         return R.layout.ac_test_view_bind;
      }
      @Override
      protected void onInit(Context context, Bundle savedInstanceState) {
         mHelper.init(context);
      
         RootModule rootModule = DataMediatorFactory.createData(RootModule.class);
      
         //绑定数据。
         rootBinder = DataMediatorFactory.bind(this, rootModule);
         //由于上面 属性链 'viewBind.background' 依赖属性viewBind代表的ViewBind对象。而rootModule 还没有准备好对象。
         //所以这里我们模拟数据的获取(发送延迟任务)
         MainWorker.postDelay(3000, new Runnable() {
             @Override
             public void run() {
                 //模拟数据获取
                 final ViewBind data = DataMediatorFactory.createData(ViewBind.class);
                 rootBinder.getData().setViewBind(data);
                 //获取好后,重新inflate属性链
                 if(rootBinder.getDataMediator().reinflatePropertyChains()){
                     Toaster.show(getApplicationContext(), "reflate property chain success.");
                 }
                 //最后挂在Inflate的回调到跟对象 rootModule, 之后就可以用了
                 dm_viewBind = DataMediatorFactory.createDataMediator(
                         rootBinder.getDataMediator(), data);
             }
         });
      }
      @OnClick(R.id.bt_change_bg)
      public void onClickChangeBg(View v){
         //改变背景(drawable)
         if(checkPrepaired()) {
             dm_viewBind.getDataProxy().setBackground(mHelper.toggleDrawable());
         }
      }
      private boolean checkPrepaired(){
         if(dm_viewBind == null){
             Toaster.show(getApplicationContext(), "property chain has not inflate. please wait....");
             return false;
         }
         return true;
      }
      }复制代码

      所以大伙感觉这个怎么样。个人是感觉很实用的。

    • 3, 属性链的绑定还支持List, array, SparseArray结构.
  • 更多详情请参见 github/Data-Mediator. 欢迎大家提出更宝贵的意见,以助于我们改善项目。

thanks for Reading !

技术源于分享 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值