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琐碎的知识点。
- DataBinding基本使用(5)
- DataBinding基本使用(1)
- DataBinding基本使用(2)
- DataBinding基本使用(3)
- DataBinding基本使用(4)
- DataBinding的基本使用(一)
- DataBinding的基本使用(二)
- DataBinding的基本使用(四)
- Android DataBinding(一) 基本使用
- DataBinding基本使用
- databinding基本使用
- DataBinding的基本使用
- DataBinding的基本使用(三)
- DataBinding的基本使用(五)
- DataBinding使用教程(一):配置与基本使用
- DataBinding使用教程(一):配置与基本使用
- DataBinding系列(二):DataBinding的基本用法
- DataBinding系列(三):RecyclerView中使用DataBinding
- Ueditor设置虚拟路径上传图片详解
- 面试体记录第四节——(handler)
- Timer Scheduler API参数详解
- 如何让Android TextView(包括子类)的字体大小随着字数的增加而变化,以显示全部内容
- 用C++实现HTTP服务器
- DataBinding基本使用(5)
- 【转】抓包工具Charles的使用心得
- STM32输出比较模式和PWM模式
- 开始记录深度学习工作站的学习之路
- Retrofit2高级教程 一 CompositeDisposable是否能够真的中断订阅
- QT中PRO文件写法的详细介绍,很有用,很重要!
- iOS UITableView~members(常用成员方法)
- 编码习惯-函数编写建议
- 快速排序Java(指针双向从头尾向中间扫描)