完整的MVVM设计模式的例子(使用RecyclerView)

本文提供了一个使用MVVM设计模式的完整示例,涉及BaseX组件、ViewModel、Model数据获取(retrofit+httpclient)以及View与Model的交互。项目中,BaseVM作为ViewModel基类,实现View与Model的绑定,同时封装了RecyclerView的适配器和ViewHolder。在View部分,使用DataBindingUtil和自定义库LucklyRecyclerView展示数据。Model通过HttpUtils配置网络请求,利用RxJava2.0进行数据处理。最后,ViewModel作为桥梁,协调View和Model的数据流动。

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

    MVVM设计模式,在此处就不介绍,网上有很多大牛都有很详细的讲解。

    相信大家看了MVVM设计模式后,不太清楚到底应该怎么写。本人不才,现将个人写的一个小Demo分享给大家,请大家批评指针。

如图所示:

项目的整体结构:

 

运行的效果:

第一部分:写一写BaseX相关的东西

    因为使用MVVM,V中负责显示,ViewModel需要持有一个View的实例(不是binding).

 

  •     IBaseView(显示的一些公共的部分)
     
public interface IBaseView {
    // 显示错误提示
    void showError(String message);

    //显示成功提示
    void showSuccess(String message);

    //显示正在加载
    void showLoading();

    void complete();
}
  • IBaseVM(ViewModel的Base)
    因为ViewModel需要持有一个IBaseView的实例,(当从Model中获取数据后,或者显示错误/显示数据获取完成等需要使用接口的方式反馈给View)

 

public interface IBaseVM<V extends IBaseView> {

    void attachView(V view);

    void detachView();

    V getIView();
}
  • BaseVM (通过attachView和detachView的方式,获取BaseView的引用和解除)
public abstract class BaseVM<V extends IBaseView> implements IBaseVM{
    private WeakReference<IBaseView> mVWeakReference;
    @Override
    public void attachView(IBaseView view) {
        mVWeakReference=new WeakReference<>(view);
    }

    @Override
    public void detachView() {
        if (mVWeakReference != null) {
            mVWeakReference.clear();
            mVWeakReference=null;
        }
    }

    @Override
    public IBaseView getIView() {
        if (mVWeakReference != null) {
           return mVWeakReference.get();
        }
        return null;
    }
}
  • BaseBindingAdapter

    在使用recyclerview中,难免会写适配器adapter,此处将上拉加载,下拉刷新进行封装。

public abstract class BaseBindingAdapter<T, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
    public List<T> mDataList;
    public Context mContext;

    public BaseBindingAdapter(Context context) {
        mContext = context;
        mDataList = new ArrayList<>();
    }

    @Override
    public int getItemCount() {
        return mDataList.size();
    }

    @Override
    public VH onCreateViewHolder(ViewGroup parent, int viewType) {
        return onCreateVH(parent, viewType);
    }

    @Override
    public void onBindViewHolder(VH holder, int position) {
        onBindVH(holder, position);
    }

    /**
     * Author: MrGao
     * CreateTime: 2018/4/6 17:12
     * MethodName:
     * Des:刷新数据
     * Params:
     * Return:
     **/
    public void onRefreshData(List<T> list) {
        if (mDataList != null) {
            mDataList.clear();
            mDataList.addAll(list);
            notifyDataSetChanged();
        }
    }

    public void onLoadMoreData(List<T> list) {
        if (mDataList != null && list != null) {
            mDataList.addAll(list);
            notifyDataSetChanged();
        }
    }


   public abstract VH onCreateVH(ViewGroup parent, int viewType);

   public abstract void onBindVH(VH holder, int position);
}
  • BaseBindViewHolder

   在写recyclerview的viewholder的时候,和以前不一样了,应该使用binding的方式,在adapter中通过

DataBindingUtil.inflate()的方式获取到binding对象。

public class BaseBindViewHolder extends RecyclerView.ViewHolder {
    ViewDataBinding mDataBinding;
    public BaseBindViewHolder(V
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值