一步一步教你实现安卓mvvm架构,双向数据绑定(二)
上文讲了普通界面的双向数据绑定,本文讲一下recyclerview的双向数据绑定,整个工程只要写一个adapter就够了,不用像以前一个recyclerview写一个adapter了,节省了至少80%的代码,什么第三方库都不需要了。强大的工具!
1. 创建一个通用的adapter类,采用泛型来传入对应的model
public class ZLBindingAdapter<T> extends RecyclerView.Adapter<ZLBindingAdapter.BindingHolder> {
private List<T> items ;
private int variableId;
private int layoutId;
public ZLBindingAdapter(List<T> items, int variableId, int layoutId) {
this.items = items;
this.variableId = variableId;
this.layoutId = layoutId;
}
@NonNull
@Override
public BindingHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), layoutId, viewGroup, false);
return new BindingHolder(binding);
}
@Override
public void onBindViewHolder(@NonNull BindingHolder bindingHolder, int i) {
bindingHolder.bindData(items.get(i));
}
@Override
public int getItemCount() {
return items.size();
}
public class BindingHolder<T> extends RecyclerView.ViewHolder {
ViewDataBinding binding;
/**
* @param binding 可以看作是这个hodler代表的布局的马甲,getRoot()方法会返回整个holder的最顶层的view
* */
public BindingHolder(ViewDataBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
public void bindData(T item) {
binding.setVariable(variableId ,item);
}
}
}
items就是我们的数据列表,这里我们是user的数据
variableId就是绑定的model对象,比如我们绑定user这个对象,variableId就是BR.user
layoutId是我们布局文件的id。
2. 然后我们的activity是这么写的。
recyclerView = findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
ZLBindingAdapter<User> bindingAdapter = new ZLBindingAdapter(users, BR.user, R.layout.item_belle);
recyclerView.setAdapter(bindingAdapter);
recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
3. 看效果:
强大吧,列表出来了。
我们要什么类型,只要对应的泛型传入即可,所有recyclerview通用一个adapter!!