数据中介者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;@Overrideprotected int getLayoutId() { return R.layout.ac_test_view_bind;}@Overrideprotected 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结构.
【转载】
作者:LightSun
链接:https://juejin.im/post/5a1a214e6fb9a045067152db
|
|