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

转载请注明出处:http://blog.csdn.net/liu470368500/article/details/48300801

最近听到网上、群里各种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:

public class MainActivity extends AppCompatActivity {

    @Override
    protected 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));
    }

    class MyAdapter extends BaseListAdapter<ItemInfo> {

        public MyAdapter(List<ItemInfo> list) {
            super(list);
        }

        @Override
        public 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了。

来一发界面显示效果:
超轻量级数据绑定框架DBinder。新鲜出炉!_第1张图片

下面看绑定类的定义:

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;
    }

    public void setUsername(IBindUnit<String, TextView> username) {
        this.username = username;
    }

    public IBindUnit<String, TextView> getPassword() {
        return password;
    }

    public void setPassword(IBindUnit<String, TextView> password) {
        this.password = password;
    }

    public ListUnit<ItemInfo, ListView> getLv() {
        return lv;
    }

    public void setLv(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);
}

没错。这就是提供给用户的。用于你自定义不同的单元绑定的接口。可以获取或更新数据与View。很方便也很简单。上面的TVUnit和ListUnit也是它的实现类。我们只要根据这四种方法。在使用的时候做不同操作即可。目前本框架暂时提供以下几种绑定方式:

ImageUnit:绑定ImageView的ImageSource
TVUnit:绑定TextView的Text显示
ListUnit:绑定AbsListView的setAdapter。即是可以用于ListView,也可以是gridView的绑定的。用此需要使用指定的BaseListAdapter.范型为适配器中List数据源的数据类型。
ViewBgUnit:有ImageSource那肯定对于View的最基本的backgroud咱也得支持
ViewVisibleUnit:绑定View的显示与隐藏。所需要的值与原生一样一样的

这几个东西都很简单。有兴趣的话可以撸撸源码。so easy!

貌似这样还不够。比如假设一个界面。我相关数据都是在一个json中。我得需要根据这个类去解析出bean。然后再一个个的去设置。这一般情况下也没啥。但是我们想要更方便的自动绑定。绑定工具的几种绑定方式就出来了:

可以看到支持三种绑定(其实可以算两种):一种是直接绑定。两种将绑定类与一个具体的bean数据相绑定。第一种我们上面已经用到过了。下面介绍第二种与第三种:

bindBean(bean,target):此方法将一个bean内的数据赋值给具体的绑定块target,需要注意这个地方。需要bean中的数据字段与target中绑定单元的对象字段名一致才能起做用。比如我bean里面有个String username,target里面也有个绑定单元为username的字段。才能直接将bean中的数据绑定给target。

bindBean(root,clz,bean):这个其实是第一种与第二种的结合

demo链接:DBinderDemo

你可能感兴趣的:(框架,数据绑定,轻量级)