博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记录DataBinding使用
阅读量:3748 次
发布时间:2019-05-22

本文共 10764 字,大约阅读时间需要 35 分钟。

例一

MainActivity

public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //会根据布局文件自动生成布局文件名开头的Binding类 binding = DataBindingUtil.setContentView(this, R.layout.activity_main); User user = new User(this,"Test", "User",true); binding.setUser(user); }}

User

public class User {
public final String firstName; public final String lastName; public Context context; public boolean isFriend; public User(Context context,String firstName, String lastName,boolean isFriend) { this.context=context; this.firstName = firstName; this.lastName = lastName; this.isFriend=isFriend; }}

XML

这里写图片描述

例二 绑定事件

MainActivity

public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //会根据布局文件自动生成布局文件名开头的Binding类 binding = DataBindingUtil.setContentView(this, R.layout.activity_main); User user = new User(this,"Test", "User",true); binding.setUser(user); binding.setHandlers(new MyHandlers()); }}

User类没变

XML

这里写图片描述

例三 导入类

     

例四 List数组

MainActivity

public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //会根据布局文件自动生成布局文件名开头的Binding类 binding = DataBindingUtil.setContentView(this, R.layout.activity_main); List
list=new ArrayList<>(); list.add("aaa"); binding.setUserList(list); }}

XML

其中特别注意一点,在@{}表达式中不支持左括号,所以我们需要用转义字符代替左括号

例五 静态

public class Teacher {    public static String   GG(){       return "1111111";    }}
    

例六 变量

public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //会根据布局文件自动生成布局文件名开头的Binding类 binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.setUserList("尼玛"); }}

和 Java 一样,java.lang.* 会被自动导入。

例七 调用方法

public class User {    public final String firstName;    public final String lastName;    public List
list=new ArrayList
(); public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String ggg(String st){ System.out.println("st = " + st); return "asdas"; }}
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //会根据布局文件自动生成布局文件名开头的Binding类 binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.setUserList(new User("111","222")); }}
    

例八 Context对象

public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //会根据布局文件自动生成布局文件名开头的Binding类 binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.setUserList(new User("111","222")); }}
public class User {
public final String firstName; public final String lastName; public List
list=new ArrayList
(); public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String ggg(Context context){ Toast.makeText(context,"toast",Toast.LENGTH_LONG).show(); return "asdas"; }}

binding 类会生成一个命名为context的特殊变量(其实就是 rootView 的 getContext())的返回值),这个变量可用于表达式中. 如果有名为context的变量存在,那么生成的这个context特殊变量将被覆盖.

例九 可以在表达式中直接引用带id的view,引用时采用驼峰命名法.

这里TextView直接引用第一次TextView,yaoyanName为id的驼峰命名

public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //会根据布局文件自动生成布局文件名开头的Binding类 binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.setUserList(new User("111","222")); }}
public class User {    public final String firstName;    public final String lastName;    public List
list=new ArrayList
(); public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String ggg(String st){ System.out.println("st = " + st); return "asdas"; } public String ggg(Context context){ Toast.makeText(context,"toast",Toast.LENGTH_LONG).show(); return "asdas"; }}

例十 RecyclerView+DataBinding

MainActivity

public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView; private List
mDatas; private HomeAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.setAdapter(mAdapter = new HomeAdapter()); } protected void initData() { mDatas = new ArrayList
(); for (int i = 1; i < 100; i++) { mDatas.add("----" + i); } } class HomeAdapter extends RecyclerView.Adapter
{
@Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(getApplicationContext()), R.layout.item_home, parent, false); MyViewHolder holder=new MyViewHolder(binding); return holder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { ItemHomeBinding binding = (ItemHomeBinding) holder.getBinding(); String s = mDatas.get(position); Item item=new Item(); item.setS(s); binding.setVariable(BR.obj, item); binding.executePendingBindings(); } @Override public int getItemCount() { return mDatas.size(); } class MyViewHolder extends RecyclerView.ViewHolder {
private ViewDataBinding binding; public MyViewHolder(ViewDataBinding binding) { super(binding.getRoot()); this.binding=binding; } public ViewDataBinding getBinding() { return binding; } } }}

executePendingBindings()方法.这个方法迫使数据立即绑定而不是在下一帧的时候才绑定.RecyclerView会在onBindViewHolder方法执行后立即测量这些view.假设没使用executePendingBindings()方法,由于在下一帧的时候才会绑定,view就会绑定错误的data,测量也会出错.因此,executePendingBindings()是很重要的.

Item

public class Item {    private String s;    public String getS() {        return s;    }    public void setS(String s) {        this.s = s;    }}

Item_XML

Main_XML

例十一 自动设置属性

public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView; private List
mDatas; private HomeAdapter mAdapter; private ActivityMainBinding activityMainBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); }}
public class myView extends LinearLayout {
public myView(Context context) { super(context); } public myView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public myView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public myView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } // 自动 Setter public void setObject(String u) { System.out.println("myView.setObject"); }}
app:object='@{"123"}' android:layout_width="match_parent" android:layout_height="match_parent" />

例十二 Observable

当表达式引用了一个类内的属性时,他会尝试直接调用域,getter,还有ObservableFields。

Observable 接口有一个添加/移除 listener 的机制,但通知取决于开发者。为了简化开发,我们创建了一个基类 BaseObservable,来实现 listener 注册机制。这个类也实现了域变动的通知,你只需要在 getter 上使用 Bindable 注解,并在 setter 中实现通知。

User

public class User  extends BaseObservable{
public String firstName; public String lastName; public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } @Bindable public String getFirstName() { return this.firstName; } @Bindable public String getLastName() { return this.lastName; } public void setFirstName(String firstName) { this.firstName = firstName; notifyPropertyChanged(BR.firstName); } public void setLastName(String lastName) { this.lastName = lastName; notifyPropertyChanged(BR.lastName); }}

MainActivity

public class MainActivity extends AppCompatActivity {
private List
mDatas; private ActivityMainBinding activityMainBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); User u=new User("123","456w"); activityMainBinding.setUser(u); }}

XML

例十二 重命名属性设置

一些属性的命名与 setter 不对应,针对这些函数,可以用 BindingMethods注解来将属性与setter绑定在一起.举个例子:android:tint属性可以这样与setImageTintList(ColorStateList) ) 绑定,而不是 setTint :

你可能感兴趣的文章
2021-06-01web渗透学习之sqlserver提权(转)
查看>>
2021-06-04msf结合漏扫模块suggester提权
查看>>
hdfs的api操作
查看>>
mapreduce的组成及原理
查看>>
大数据之Flume
查看>>
关于高可用配置hbase中出现的问题:Name or service not known
查看>>
centOs7下hadoop3.2.2namenode故障不自动转移
查看>>
在高可用的hive下执行bin/schematool -dbType mysql -initSchema报错
查看>>
hbase配置高可用
查看>>
linux下卸载和安装mysql
查看>>
在初始化namenode时:java.net.NoRouteToHostException: 没有到主机的路由;
查看>>
hive-hbase
查看>>
浅谈scala-API的基础概念及简单例子
查看>>
spark的历史服务器配置
查看>>
spark的API操作
查看>>
SparkSql
查看>>
SparkRdd-scala版本
查看>>
spark常见算子
查看>>
scala符号初体验
查看>>
kafka生产者常用参数含义
查看>>