如果你不了解dataBinding,请看我的另一篇文章
Activity布局文件如下,如果看过我的上一篇文章应该可以看懂这里的布局文件
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="user"
type="com.du.databinding4.bean.User"/>
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ListActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyelerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true" />
</RelativeLayout>
</layout>
item的布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.du.databinding4.bean.User"/>
</data>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:textSize="30sp"
android:text="@{String.valueOf(user.id)}"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:textSize="30sp"
android:layout_marginLeft="20dp"
android:text="@{user.username}"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
Adatper文件中需要改变的是ViewHolder,如果你没有生成item的绑定类,就像我的LayoutItemBinding类,请rebuild下。
在Viewholder的构造方法中,调用DataBindingUtil.bind(itemView);方法,并且多写了一个bind方法,可以将User对象绑定。之前我们需要在onBindViewHolder方法中去为item绑定数据,现在只需要调用我们的bind方法就可以了!
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
private List<User> data;
public MyAdapter(List<User> data) {
this.data = data;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_item , viewGroup , false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {
myViewHolder.bind(data.get(i));
}
@Override
public int getItemCount() {
return data.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
LayoutItemBinding binding;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
binding = DataBindingUtil.bind(itemView);
}
public void bind(User user){
binding.setUser(user);
}
}
}
User类还是上篇文章中的,这里再贴出来
public class User extends BaseObservable {
private int id;
private String username;
public User(){
}
public User(int id, String username) {
this.id = id;
this.username = username;
}
@Bindable
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
notifyPropertyChanged(BR.id);
}
@Bindable
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
notifyPropertyChanged(BR.username);
}
}
之后正常使用RecyclerView的步骤即可
这里介绍dataBinding的另一个功能,先贴上我的Activity代码。
发现可以直接用binding获取到布局文件中的recyclerview,类似于butterknife。
public class ListActivity extends Activity {
private ActivityListBinding binding;
private List<User> datas = new ArrayList<>();
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this , R.layout.activity_list);
for(int i = 0 ; i < 20 ; i++){
datas.add(new User(i , "user" + i));
}
binding.recyelerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new MyAdapter(datas);
binding.recyelerView.setAdapter(adapter);
}
}