資料中介者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. 歡迎大家提出更寶貴的意見,以助於我們改善專案。