DataBinding基本使用(5)

来源:互联网 发布:淘宝上卖的觅心猎手 编辑:程序博客网 时间:2024/06/04 19:42

咱们什么都不说 先附上知识点

数据绑定的几种方式
点击事件绑定的几种方式
双向绑定数据
RecycleView的数据绑定
@InverseMethod 标签的使用
在DataBinding基本使用(4)中已经讲解了RecycleView的数据绑定,可能本人在某些地方理解偏差或错误,往广大读者指出并一起讨论、学习。

InverseMethod

InverseMethod是相对独立的注解,它的作用就是为某一方法提供相反的方法。需要传一个参数value:String,为相反的方法名

@InverseMethod("demoToString")public static int demoStringToInt(String value) {    try {        return Integer.parseInt(value);    } catch (NumberFormatException e) {        return -1;    }}public static String demoToString(int value) {    return String.valueOf(value);}

接下来 我们来实战,管说不做假把式
XML 因为InverseMethod也是双向的,所以也要@={}

    <import type="com.example.scs.myapplication.InverseMethodDemo"></import>    <variable            name="ordercode"            type="String"></variable>    <TextView                    android:id="@+id/tv_3"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:layout_weight="1"                    android:text="@={InverseMethodDemo.orderTypeToString(ordercode)}" />    <Button                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:onClick="@{iclick.onClick2}"                    android:text="InverseMethod 用法" />

我将InverseMethod的方法,都定义在InverseMethodDemo中

public class InverseMethodDemo {    private final static String ORDER_TYPE_1 = 1 + "";    private final static String ORDER_TYPE_2 = 2 + "";    private final static String ORDER_TYPE_3 = 3 + "";    private final static String ORDER_TYPE_4 = 4 + "";    private final static String ORDER_TYPE_5 = 5 + "";    private final static String ORDER_TYPE_6 = 6 + "";    @InverseMethod("orderTypeToString")    public static String stringToOrderType(String value) {        if (value == null) {            return null;        }        switch (value) {            case "立即单":                return ORDER_TYPE_1;            case "预约单":                return ORDER_TYPE_2;            case "接机单":                return ORDER_TYPE_3;            case "送机单":                return ORDER_TYPE_4;            case "半日租单":                return ORDER_TYPE_5;            case "全日租单":                return ORDER_TYPE_6;            default:                return null;        }    }    public static String orderTypeToString(String code) {        if (code == null) {            return null;        }        switch (code) {            case ORDER_TYPE_1:                return "立即单";            case ORDER_TYPE_2:                return "预约单";            case ORDER_TYPE_3:                return "接机单";            case ORDER_TYPE_4:                return "送机单";            case ORDER_TYPE_5:                return "半日租单";            case ORDER_TYPE_6:                return "全日租单";            default:                return null;        }    }}

java代码

@Override    protected void onCreate(Bundle savedInstanceState) {        binding.setOrdercode("5");        binding.setIclick(new IClick() {            @Override            public void onClick2(View view) {                binding.tv3.setText("预约单");            }        });}@BindingAdapter("android:text")    public static void setText(TextView view, CharSequence text) {        final CharSequence oldText = view.getText();        if (text == oldText || (text == null && oldText.length() == 0)) {            return;        }        if (text instanceof Spanned) {            if (text.equals(oldText)) {                return; // No change in the spans, so don't set anything.            }        } else if (text.toString().equals(oldText.toString())) {            return; // No content changes, so don't set anything.        }        view.setText(text);    }

我们可以看到,最初给setOrdercode设置的是5,那么通过InverseMethod,会转变成响应的数据也就是半日租单,若我们设置的是半日租单,则返回的是5。

有发现吗?为什么我还要去重写android:text属性,text不是自带的属性吗?
其实这这样,若使用了InverseMethod,不去重新定义的话会出现死循环绑定。

  private android.databinding.InverseBindingListener tv3androidTextAttrChanged = new android.databinding.InverseBindingListener() {        @Override        public void onChange() {            java.lang.String callbackArg_0 = android.databinding.adapters.TextViewBindingAdapter.getTextString(tv3);            java.lang.String ordercode = mOrdercode;            java.lang.String inverseMethodDemoOrderTypeToStringOrdercode = null;            if ((com.example.scs.myapplication.databinding.ActivityMainBinding.this) != (null)) {                com.example.scs.myapplication.InverseMethodDemo.stringToOrderType(callbackArg_0);          com.example.scs.myapplication.databinding.ActivityMainBinding.this.setOrdercode(com.example.scs.myapplication.InverseMethodDemo.stringToOrderType(callbackArg_0));            }        }    };

可以看到当ActivityMainBinding!=null是时候,会一直去调用stringToOrderType setOrdercode方法,而setOrdercode方法又会去触发这个InverseBindingListener,所以我们要去重写setText,去做过滤,大家不妨打个断点试一试。
上面代码是不是有看到了一个似曾相识的单词InverseBindingListener,在非自定义双向绑定中使用到,用于监听值的改变。
DataBinding大致的使用就讲解到这里,后面会再不上一节,DataBinding琐碎的知识点。

原创粉丝点击