Data Binding
来源:互联网 发布:sql server unique 编辑:程序博客网 时间:2024/05/06 22:10
完全掌握Android Data Binding
DataBinding使用
1.在Moudle的build.gradle下添加
android{ ... dataBinding{ enabled = true; } ...}
2.新建一个MainActivity,对应的xml文件:activity_main.xml
修改xml文件
在最外层布局添加
< layout>
….
< /layout>
修改后:
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android" > <LinearLayout android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout></layout>
3.新建一个Model类User
public class User { private String name; private String little_name; private int age; public User(String name, String little_name, int age) { this.name = name; this.little_name = little_name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLittle_name() { return little_name; } public void setLittle_name(String little_name) { this.little_name = little_name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }}
4.在activity_main.xml布局中做如下修改
1.添加< data>< /data>
方式一:
type后面写的是:User的包名 + User类名
<data> <variable name="user" type="databinding.test.git.databindingdemo.Model.User"/> </data>
方式二:
添加一个import,与java中import类似,但是后面要多一个User类名
<data> <import type="databinding.test.git.databindingdemo.Model.User"/> <variable name="user" type="User"/> </data>
2.修改布局文件,使用user
通过“@{user.name}”方式使用,此处要注意,如果是int类型会报错。
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}" />
3.在MainActivity中添加绑定
ActivityMainBinding是根据activity_main.xml自动生成的。
通过binding.setUser()实现绑定。
setUser方法,是根据xml文件中< data>< /data>中定义的variable自动生成的。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("lucy", 10, "jack"); binding.setUser(user); }
一个简单的DataBinding使用就完成了。
DataBinding更多用法
绑定事件
< data><variable name="clickListener" type="android.view.View.OnClickListener"/>< data>
<TextView android:id="@+id/little_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{null ?? user.little_name}" android:onClick="@{clickListener}" />
binding.setClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(v instanceof TextView){ user.setName("lululu"); user.setAge(998);// ((TextView) v).setText("name:" + user.getName() + " age:" + user.getAge()); } binding.littleName.setText("name:" + user.getName() + " age:" + user.getAge()); } });
xml文件中使用java静态方法
1.定义静态方法
public class MyStringUtils { public static String capitalize(final String word){ return word.toUpperCase(); }}
2.xml文件中data添加varible
alias是别名,可以区分同名类或方法,也可以缩短调用名称。
<data> <import type="databinding.test.git.databindingdemo.Utils.MyStringUtils" alias="StringUtils"/> </data>
3.xml使用方式:
<TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{StringUtils.capitalize(user.name) + user.age}" />
使用三元表达式(a > b? a:b)
使用dimen
<TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="@{user.canrun ? @dimen/activity_horizontal_margin : 5}" />
使用 a??b
a??b等价于a != null ? a : b;
View定义id,通过dababinding获取相应view
比如:
<TextView android:id="@+id/little_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{null ?? user.little_name}" android:onClick="@{clickListener}" />
可以通过:
binding.littleName.setText("name:" + user.getName() + " age:" + user.getAge());
Observable Binding 数据的动态修改与显示
方式一:类继承BaseObservable
1.继承BaseObservable
2.在getName()方法添加注解:@Bindable
3.setName(String name)方法中修改值,并调用:
notifyPropertyChanged(BR.name);
完整代码:
public class User extends BaseObservable{ private String name; private String little_name; private int age; public User(String name, String little_name, int age) { this.name = name; this.little_name = little_name; this.age = age; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(BR.name); }}
方式二:成员绑定
1.通过ObservableField< 引用类型>或 Observable< 基本类型>
比如:
private final ObservableField<String> little_name = new ObservableField<>(); private final ObservableInt age = new ObservableInt();
2.get/set方法调整
public int getAge() { return age.get(); } public void setAge(int age) { this.age.set(age); } public String getLittle_name() { return little_name.get(); } public void setLittle_name(String little_name) { this.little_name.set(little_name); }
RecyclerView中的动态绑定
###0.新建一个item_databinding.xml文件
布局如下:
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android" > <data> <variable name="user" type="databinding.test.git.databindingdemo.Model.User"/> <variable name="itemClick" type="android.view.View.OnClickListener"/> </data> <FrameLayout android:layout_width="match_parent" android:layout_height="30dp" android:orientation="horizontal" android:background="#00fff0" android:onClick="@{itemClick}" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}" android:layout_gravity="center" /> <View android:layout_width="match_parent" android:layout_height="0.5dp" android:background="#00ff00" /> </FrameLayout></layout>
1.定义DataBindingAdapter
a.DabaBindingAdapter 继承RecyclerView.Adapter
public class DataBindingAdapter extends RecyclerView.Adapter<DataBindingAdapter.VhDataBinding> { List<User> users; public DataBindingAdapter(List<User> users) { this.users = users; }}
b.定义ViewHolder
protected class VhDataBinding extends RecyclerView.ViewHolder{ private ViewDataBinding binding; public VhDataBinding(View itemView) { super(itemView); } public void setItemClick(final int pos){ binding.getRoot().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { users.get(pos).setName("修改了名字》》》》》" + pos); } }); } public ViewDataBinding getBinding() { return binding; } public void setBinding(ViewDataBinding binding) { this.binding = binding; } }
c.重写onCreateViewHolder
@Override public VhDataBinding onCreateViewHolder(ViewGroup parent, int viewType) { ViewDataBinding binding = DataBindingUtil.inflate( LayoutInflater.from(parent.getContext()), R.layout.item_databinding, parent, false); VhDataBinding vh = new VhDataBinding(binding.getRoot()); vh.setBinding(binding); return vh; }
d.重写onBindViewHolder
@Override public void onBindViewHolder(VhDataBinding holder, int position) { User user = users.get(position); holder.getBinding().setVariable(BR.user, user); holder.getBinding().executePendingBindings(); holder.setItemClick(position); }
e.不要忘了getItemCount
@Override public int getItemCount() { return users.size(); }
2.MainActivity中布局文件添加RecyclerView
3.MainActivity中onCreate方法添加如下代码:
List<User> users = new ArrayList<>(); for (int i = 0; i < 100; i++) { User us = new User("name->" + i, i, "pos->" + i); users.add(us); } DataBindingAdapter mAdapter = new DataBindingAdapter(users); binding.recyclerview.setLayoutManager(new LinearLayoutManager(this)); binding.recyclerview.setAdapter(mAdapter);
运行后点击item,item的内容会随着点击动态改变。
0 0
- Data Binding
- Data Binding
- Data && Binding
- Data Binding
- Data binding
- Data Binding
- data binding
- Data Binding
- Data Binding
- Data Binding
- Data Binding
- data binding
- Data Binding
- Data Binding
- Data Binding
- Data Binding 3
- Data Binding 4
- Data Binding Overview
- [kernel 启动流程] (第一章)概述
- 单例类详解及示例
- jsb开发8
- spark学习笔记(5)WordCount for Spark
- Arcgis Javascript那些事儿(四)--feature access服务编辑feature本质
- Data Binding
- flume源码分析
- 【Android笔记】淡入淡出、上下弹出动画的
- 基于ToolBar等MD相关控件实现的沉浸式联动效果
- jsb开发9
- GStreamer生成可播放的.264文件
- sql语句优化
- jsb开发10
- Linux常用命令行