官方文档
https://developer.android.google.cn/topic/libraries/data-binding/expressions#java
使用
需Android studio 4.0以上
build.gradle android下
dataBinding {
enabled true
}
1.创建实体类
public class User {
public String fristName;
public String lastName;
public Integer age;
public User(String fristName, String lastName,Integer age) {
this.fristName = fristName;
this.lastName = lastName;
this.age=age;
}
public String getFristName() {
return fristName;
}
public void setFristName(String fristName) {
this.fristName = fristName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Integer getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.布局使用
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.zqq.h5shell.activity.jectpack_navigation.bean.User" />
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_frist"
android:text="@{user.fristName}"
android:textSize="@dimen/dp_20"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_last"
android:text="@{user.lastName}"
android:textSize="@dimen/dp_20"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</layout>
3.activity
//此类名称为你layout的名称+Binding
ActivityDatabindingBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_databinding);
unbinder = ButterKnife.bind(this);
User user = new User("Test", "User",1);
binding.setUser(user);
BaseQuickAdapter使用
item布局
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<import type="android.view.View"/>
<variable
name="user"
type="com.zqq.h5shell.activity.jectpack_navigation.bean.User" />
</data>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_frist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="@{user.age>20 ? View.GONE:View.VISIBLE}"
android:text="@{user.fristName}"
/>
<TextView
android:layout_marginLeft="@dimen/dp_30"
android:id="@+id/tv_last"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"
/>
<TextView
android:layout_marginLeft="@dimen/dp_30"
android:id="@+id/tv_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{String.valueOf(user.age)}"
/>
</LinearLayout>
</layout>
支持的运算符
Mathematical + - / * %
String concatenation +
Logical && ||
Binary & | ^
Unary + - ! ~
Shift >> >>> <<
Comparison == > < >= <= (Note that < needs to be escaped as <)
instanceof
Grouping ()
Literals - character, String, numeric, null
Cast
Method calls
Field access
Array access []
Ternary operator ?:
public class MyBinddingAdapter extends BaseQuickAdapter<User, BaseDataBindingHolder>{
public MyBinddingAdapter(int layoutResId, @org.jetbrains.annotations.Nullable List<User> data) {
super(layoutResId, data);
}
public MyBinddingAdapter(int layoutResId) {
this(layoutResId,null);
}
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
@Override
protected void convert(@NotNull BaseDataBindingHolder baseDataBindingHolder, User user) {
if(user == null){
return;
}
ItemDatabindAdapterBinding dataBinding = (ItemDatabindAdapterBinding) baseDataBindingHolder.getDataBinding();
dataBinding.setUser(user);
}
}
recyclerview.setLayoutManager(new LinearLayoutManager(this));
MyBinddingAdapter myBinddingAdapter=new MyBinddingAdapter(R.layout.item_databind_adapter,list);
recyclerview.setAdapter(myBinddingAdapter);
for(int i=0;i<100;i++){
User user=new User("名字"+i,"lastname"+i,i);
list.add(user);
}
效果
其他
可以通过标签导入用到的类进行处理比如:
<data>
<import type="android.util.SparseArray"/>
<import type="java.util.Map"/>
<import type="java.util.List"/>
<variable name="list" type="List<String>"/>
<variable name="sparse" type="SparseArray<String>"/>
<variable name="map" type="Map<String, String>"/>
<variable name="index" type="int"/>
<variable name="key" type="String"/>
</data>
android:text="@{list[index]}"
android:text='@{map["firstName"]}'
增加事件
在item的textview中添加onclick
//添加点击,表示使用user中的onLastNameClick方法 我懒了不想写其他的
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<import type="android.view.View"/>
<variable
name="user"
type="com.zqq.h5shell.activity.jectpack_navigation.bean.User" />
</data>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
...
<TextView
android:layout_marginLeft="@dimen/dp_30"
android:id="@+id/tv_last"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"
android:onClick="@{user::onLastNameClick}"
/>
...
</LinearLayout>
</layout>
User中添加onLastNameClick点击事件方法
public class User {
...
public void onLastNameClick(View view){
if(view instanceof TextView){
Log.i("zqqqq",((TextView) view).getText().toString());
}
}
}
点击后结果:
还可以通过事件调用指定方法
修改tv_age,点击后,当前age增加10000
<TextView
android:layout_marginLeft="@dimen/dp_30"
android:id="@+id/tv_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{String.valueOf(user.age)}"
android:onClick="@{()->user.setAge(user.age+10000)}"
/>
user的setAge方法更改为
public void setAge(int age) {
this.age = age;
if(myBinddingAdapter!=null){
myBinddingAdapter.notifyDataSetChanged();
}
}
效果如下
以下代码防止recycleview闪烁
dataBinding.executePendingBindings();