超轻量级数据绑定框架DBinder。新鲜出炉!

转载请注明出处:

最近听到网上、群里各种MVVM。各种对谷歌的Data-Binding的好评。忍不住自己也去用了下AS体验了一把。不得不说本人是AS残。。。Data-Binding是个好东西。但是也能被本人弄得各种编译不通过啊。。。不过算是大致有了个了解了。还算是一种收获吧。。。

Data-Binder伴随着谷歌推出的MVVM。说实话的确让我有种眼前一亮的感脚~~尼玛任谁看见一个Activity里面一堆TextView Button 等各种View那样零散的放里面。特别是对于界面控件特多的。几十个View的命名这一坨那一片的。在频繁的改需求的过程中。一个控件都可能让你声明几个变量啊!!简直不堪忍睹啊。。。那尼玛看着感觉都能折寿几百年啊几百年的啊。。。

然后现在。遇到Data-Binding了。哎吗卧槽。。。一个界面就一个Bean就搞定了。我对这个Bean设置了值。再setBean一下。界面自动更新!很爽的有木有!!有木有!!!!!怀着激动的心情搞了几天。尼玛结果就基本扑街到对AS各种不熟悉导致compile出现各种错各种问题了。。。最后终于发现一个问题:这尼玛谷歌的Data-Binding。还只能Xml里面使用那几种特定的方式来绑定。万一我以后遇到个啥奇葩的绑定方式呢?这又该咋搞???!!

于是就这样。怀着对数据绑定的崇敬。写下了这个超轻型的DBinder。。。

下面开启介绍模式:

先说用法吧。普通的界面写法在这里也不再BB了。下面看我在Activity中的代码,xml就不贴了,就是基本的写法。和data-binding不一样。里面两个EditText,一个ListView:

{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);UserInfo info = DBBindUtil.bind(getWindow().getDecorView(),UserInfo.class);info.getUsername().doBind(“张三”);info.getPassword().doBind(“112114116”);List<ItemInfo> datas = generateList();info.getLv().setAdapter(new MyAdapter(datas));}<ItemInfo> {public MyAdapter(List<ItemInfo> list) {super(list);}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ItemBind bind = null;if (convertView == null) {convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_lv,parent,false);bind = DBBindUtil.bind(convertView,ItemBind.class);convertView.setTag(bind);} else {bind = (ItemBind)convertView.getTag();}ItemInfo info = getList().get(position);bind.getTitle().doBind(info.getTitle());bind.getContent().doBind(info.getContent());return convertView;}}private List<ItemInfo> generateList() {List<ItemInfo> list = new ArrayList<>();for (int i = 0; i < 50; i++) {ItemInfo info = new ItemInfo();info.setTitle(“item title :” + i);info.setContent(“item content :” + i);list.add(info);}return list;}}

没错!你没看错!Activity里就是一行View的声明都木有!在onCreate里面直接就通过绑定工具生成了一个UserInfo的实例。这个实例就是绑定对象。所有的你界面需要操作的View。都在这里面放着。Adapter里面的ItemBind也是一样。你要对界面显示进行操作。只需要针对这个实例进行操作就OK了。

来一发界面显示效果:

下面看绑定类的定义:

public class UserInfo {@Bind(value = R.id.username,clz = TVUnit.class)private IBindUnit<String,TextView> username;@Bind(value = R.id.password,clz = TVUnit.class)private IBindUnit<String, TextView> password;@Bind(value = R.id.lv,clz = ListUnit.class)private ListUnit<ItemInfo,ListView> lv;public IBindUnit<String, TextView> getUsername() {return username;}(IBindUnit<String, TextView> username) {this.username = username;}public IBindUnit<String, TextView> getPassword() {return password;}(IBindUnit<String, TextView> password) {this.password = password;}public ListUnit<ItemInfo, ListView> getLv() {return lv;}(ListUnit<ItemInfo, ListView> lv) {this.lv = lv;}}

可以看到。里面没啥东西。几个属性再加几个注解声明。各种setter/getter。除此就没别的东西了。这个地方需要注意。绑定单元只能使用IBindUnit及它的子类来定义。@Bind也只能用于这些类属性定义之上。注解中需要的数据有两个 value:与View相绑定的id clz: 用于做绑定操作的各种实现类

接下来就是IBindUnit这货的具体长相了:

/** * 数据绑定所需要实现的接口。 * @author lzh * * @param <E> 绑定数据的泛型 * @param <T> 要绑定的View的类型 */public interface IBindUnit<E,T extends View> {/*** @return 返回与此View绑定的数据*/E unBindData();/*** @param e 绑定数据e到View*/void doBind(E e);/*** @return 返回绑定的View*/T unBindView(); /*** @param t 绑定View*/ void doBindView(T t);}这一秒不放弃,下一秒就会有希望。

超轻量级数据绑定框架DBinder。新鲜出炉!

相关文章:

你感兴趣的文章:

标签云: