黑马程序员技术交流社区
标题:
【上海校区】数据中介者---强大的数据绑定3
[打印本页]
作者:
不二晨
时间:
2018-11-12 09:30
标题:
【上海校区】数据中介者---强大的数据绑定3
数据中介者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
作者:
不二晨
时间:
2018-11-14 15:46
~(。≧3≦)ノ⌒☆
作者:
梦缠绕的时候
时间:
2018-11-15 15:00
作者:
魔都黑马少年梦
时间:
2018-11-15 16:52
作者:
小影姐姐
时间:
2018-11-15 17:18
奈斯~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2