DataBinding+RecyclerView使用
MVVM(Model-View-ViewModel)项目中databinding是非常的简洁,最近遇到了一个RecyclerView的使用,有一个封装完成的Adapter是非常便捷的。
Model 指的是数据层,里面包含一些bean数据。(我这里直接用bean数据类代表Model)
View 指的是显示层,就是通过DataBinding绑定视图后得到的一个bindingView
ViewModel 这是一个抽象的概念,这个类其实就是数据显示与其控制逻辑的核心,里面可以有很多更改数据的方法、监听各种事件。
View
在View层不涉及很多的逻辑处理都放在ViewModel去处理繁琐的逻辑
/**
* Created by SHICHENG
*
* Updated bg SHICHENG
* 2021/10/25
*
*/
@Route(path = ARouterConstants.MineFragment)
public class MineFragment extends BaseFragment<MineViewModel, MineFragmentBinding> {
@Override
protected int getContentViewId() {
return R.layout.fragment_mine;
}
@Override
protected void processLogic(Bundle savedInstanceState) {
mViewModel.setBinding(getActivity(), binding);
mViewModel.setTitleBar();
mViewModel.setHeader();
//只有在这里处理了订单个RecyclerView
mViewModel.initOrder();
}
@Override
protected void setListener() {
MineClickManager.init(getActivity(), binding);
binding.setMineClickManager(MineClickManager.getIntance());
}
@Override
public void onClick(View v) {
}
}
ViewModel
解决各种逻辑处理
/**
* 初始化订单布局
* 在这里做了些初始数据来展示UI
*/
public void initOrder(){
binding.setOrderTitle("我的订单");
binding.setOrderMore("全部订单");
Integer[] orderIds = {MineConstants.OBLIGATION_ID,MineConstants.PENGING_ID,MineConstants.RECEIVING};
String[] orderIcons = {getMipmapToUri(R.drawable.myicon1), getMipmapToUri(R.drawable.myicon2), getMipmapToUri(R.drawable.myicon3)};
String[] orderTitles = {"待付款","待发货","待收货"};
String[] orderCounts = {"0","0","0"};
for (int i = 0; i < orderIds.length; i++) {
MoreMenuEntity moreMenuEntity = new MoreMenuEntity();
moreMenuEntity.menu_id.set(orderIds[i]);
moreMenuEntity.more_recycler_img.set(orderIcons[i]);
moreMenuEntity.more_recycler_title.set(orderTitles[i]);
moreMenuEntity.more_recycler_count.set(orderCounts[i]);
moreMenuEntities.add(moreMenuEntity);
}
adapter = new DataBindingRecyclerViewAdapter(activity, R.layout.more_recyclerview_item, BR.moreMenuBean, moreMenuEntities);
binding.mineOrder.orderRecyclerView.setLayoutManager(new GridLayoutManager(activity, 3));
binding.mineOrder.orderRecyclerView.setAdapter(adapter);
adapter.setOnItemCkickListener(new DataBindingRecyclerViewAdapter.ItemClickListener() {
@Override
public void itemClick(View view, int position) {
}
});
}
对一些对MVVM比较陌生的来讲最主要的就是Bean类的实现是比较蒙圈的,看下Bean的实现
Bean类
其实这个ObservableField就是对BaseObservable的简化,不用继承,不用主动调刷新代码。(数据的单项绑定)
既然提到了BaseObservable就简单提一下,MoreMenuEntity这样的Bean使用了ObservableField
相当于
public class MoreMenuEntity extends BaseObservable{
}
例举里面的对应的字段
//如果是private修饰的,则在get方法使用@Bindable
private int id;
//如果是public修饰的,直接用@Bindable
@Bindable
public String name;
public void setUpDateOnlyName(String name, int id) {
this.name = name;
this.id= id;
//只刷name字段
notifyPropertyChanged(《this is your package name》.BR.name);
}
public void setDataAll(String name, int id) {
this.name = name;
this.id= id;
//刷新全部字段
notifyChange();
}
bean对象需要继承 BaseObservable
@Bindable 标注用来表示哪个字段需要单向绑定。public修饰的可以直接用@Bindable绑定。private修饰的需要在get()方法上用@Bindable标注
notifyChange();刷新所有字段,notifyPropertyChanged(《this is your package name》.BR.name);刷新单个字段。注意这里说的刷新全是被@Bindable绑定的。如果BR.name出不来。建议build下项目
public class MoreMenuEntity {
public ObservableInt menu_id = new ObservableInt();
public ObservableField<String> more_recycler_count = new ObservableField<>();
public ObservableField<String> more_recycler_img = new ObservableField<>();
public ObservableField<String> more_recycler_title = new ObservableField<>();
public ObservableInt getMenu_id() {
return menu_id;
}
public void setMenu_id(ObservableInt menu_id) {
this.menu_id = menu_id;
}
public ObservableField<String> getMore_recycler_count() {
return more_recycler_count;
}
public void setMore_recycler_count(ObservableField<String> more_recycler_count) {
this.more_recycler_count = more_recycler_count;
}
public ObservableField<String> getMore_recycler_img() {
return more_recycler_img;
}
public void setMore_recycler_img(ObservableField<String> more_recycler_img) {
this.more_recycler_img = more_recycler_img;
}
public ObservableField<String> getMore_recycler_title() {
return more_recycler_title;
}
public void setMore_recycler_title(ObservableField<String> more_recycler_title) {
this.more_recycler_title = more_recycler_title;
}
@Override
public String toString() {
return "MoreRecyclerEntity{" +
"more_recycler_img='" + more_recycler_img + '\'' +
", more_recycler_title='" + more_recycler_title + '\'' +
'}';
}
}
其实ViewModel中的代码很常见 最主要的就是这个DataBindingRecyclerViewAdapter的适配器,其实就是Recycler.Adapter的自定义写法
public class DataBindingRecyclerViewAdapter extends RecyclerView.Adapter<DataBindingRecyclerViewAdapter.DataBindingViewHolder> {
里面不仅添加了点击事件,最重要的是当结合databinding使用,它是一个万能的适配器,可以一句代码实现,一定要是databinding
adapter = new DataBindingRecyclerViewAdapter(activity, R.layout.more_recyclerview_item, BR.moreMenuBean, moreMenuEntities);
/**
*
* @param context 对应的Activity
* @param layoutId item布局
* @param varId BR.ID 对应布局的实体类
* @param data 这里是listdata
*/
public DataBindingRecyclerViewAdapter(Context context, int layoutId,int varId,List data){
mContext = context;
mLayoutId = layoutId;
mVarId = varId;
mData = data;
}
布局文件在android标签加上后,来到我们的xml布局下,对着xml的第一行,按下Alt + Enter,选择 “Convert to data binding layout”,就可以生成DataBinding的布局规则,非常简单的就不上布局了。
经验日常记录分享,希望对需要的人有用,哪里有不合适的地方大佬勿喷请指点!