MVVM项目中DataBinding+RecyclerView使用 封装全能Adapter

本文详细介绍了如何在MVVM架构中使用DataBinding和RecyclerView。通过创建一个封装好的Adapter,展示了如何在Fragment中初始化并设置RecyclerView。ViewModel中处理逻辑,包括初始化订单布局,并使用ObservableField进行数据绑定。同时,文章还提供了Bean类的实现,解释了ObservableField的作用以及如何在Bean中使用。最后,提到了DataBindingRecyclerViewAdapter的使用,它简化了适配器的编写过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的布局规则,非常简单的就不上布局了。
经验日常记录分享,希望对需要的人有用,哪里有不合适的地方大佬勿喷请指点!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Android诚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值