DataBinding基本使用(5)

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

数据绑定的几种方式
点击事件绑定的几种方式
双向绑定数据
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琐碎的知识点。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值