咱们什么都不说 先附上知识点
数据绑定的几种方式
点击事件绑定的几种方式
双向绑定数据
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琐碎的知识点。