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