資料中介者---強大的資料繫結3

LightSun發表於2017-11-27

資料中介者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 !

技術源於分享 !

相關文章