MVVM框架的使用介绍和为什么选择用MVVM框架

1、MVVM的选用

(1)接触Android也有很长时间了,大多数时间都是自己在摸索开发,以前由于开发任务重,一般不太敢用新的东西,怕有解决不了的就麻烦了,一直也都有听说过Android的各种框架,MVP,MVVM比较流行,网上说的各有各的优缺点吧,感觉就是大型APP用MVP更好,中小型用MVVM框架更好,因为不用像MVP那样需要建很多类

(2)我自己分析的MVVM的优势:不用像MVP那样建很多类,这个也是我一直没用mvP的原因。写一个activity需要建好多类,感觉好麻烦啊;MVVM就是将一些页面加载数据方法放在实现层中,我以前自己也想将数据加载分离出来,自己就单独写个activity类,感觉不是很好,MVVM正好帮我解决了这个问题,真是如获至宝啊。

(3)MVVM可以和DataBinding完美结合,页面数据加载方便,这条感觉如果用kotlin开发的话效果减少了好多,自己一直不喜欢在页面中写加载数据的代码,但是确实挺好用的。可以尝试使用

(4)我在我自己设计的框架中,并没有用到DataBing,因为不喜欢在xml中写程序加载数据代码,幸好有kotlin也可以不用findviewbyId,所以我就把本身VM框架的给UI赋值的部分移到activity中了。

2、MVVM的具体用法

(1)MVVM的实现主要是通过接口interface来实现的,activity中实现了一个接口,则在其它class类中就可以通过view的方式回调activity,这个就是activity和VM直接传值的方式。而VM和接口M是直接通过定义的接口来实现的。

(2)首先定义一个接口,这个接口定义activity中实现的方法

public interface IBaseView {
    /**
     * 开始加载
     *
     * @param loadType 加载的类型 0:第一次记载 1:下拉刷新 2:上拉加载更多
     */
    void loadStart(int loadType);

    /**
     * 加载完成
     */
    void loadComplete();

    /**
     * 加载失败
     *
     * @param message
     */
    void loadFailure(String message);
}

(2)定义一个activity,实现这个接口,也就需要实现这个接口的所有方法

public class MainActivity extends AppCompatActivity implements INewsView, XRecyclerView.LoadingListener {

    private Context mContext;
    private ActivityMainBinding binding;
    private NewsAdapter newsAdapter; //新闻列表的适配器
    private NewsVM newsVM;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        mContext = this;
        initRecyclerView();
        newsVM = new NewsVM(this, newsAdapter);
    }

    /**
     * 初始化RecyclerView
     */
    private void initRecyclerView() {
        binding.newsRv.setRefreshProgressStyle(ProgressStyle.BallClipRotate); //设置下拉刷新的样式
        binding.newsRv.setLoadingMoreProgressStyle(ProgressStyle.BallClipRotate); //设置上拉加载更多的样式
        binding.newsRv.setArrowImageView(R.mipmap.pull_down_arrow);
        binding.newsRv.setLoadingListener(this);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        binding.newsRv.setLayoutManager(layoutManager);
        newsAdapter = new NewsAdapter(this);
        binding.newsRv.setAdapter(newsAdapter);
    }

    @Override
    public void onRefresh() {
        //下拉刷新
        newsVM.loadRefreshData();
    }

    @Override
    public void onLoadMore() {
        //上拉加载更多
        newsVM.loadMoreData();
    }

    @Override
    public void loadStart(int loadType) {
        if (loadType == FIRST_LOAD) {
            DialogHelper.getInstance().show(mContext, "加载中...");
        }
    }

    @Override
    public void loadComplete() {
        DialogHelper.getInstance().close();
        binding.newsRv.loadMoreComplete(); //结束加载
        binding.newsRv.refreshComplete(); //结束刷新
    }

    @Override
    public void loadFailure(String message) {
        DialogHelper.getInstance().close();
        binding.newsRv.loadMoreComplete(); //结束加载
        binding.newsRv.refreshComplete(); //结束刷新
        ToastUtils.show(mContext, message);
    }
}

(3)定义一个类

public class NewsVM implements BaseLoadListener<SimpleNewsBean> {
    private static final String TAG = "NewsVM";
    private INewsModel mNewsModel;
    private INewsView mNewsView;
    private NewsAdapter mAdapter;
    private int currPage = 1; //当前页数
    private int loadType; //加载数据的类型

    public NewsVM(INewsView mNewsView, NewsAdapter mAdapter) {
        this.mNewsView = mNewsView;
        this.mAdapter = mAdapter;
        mNewsModel = new NewsModelImpl();
        getNewsData();
    }

    /**
     * 第一次获取新闻数据
     */
    private void getNewsData() {
        loadType = MainConstant.LoadData.FIRST_LOAD;
        mNewsModel.loadNewsData(currPage, this);
    }

    /**
     * 获取下拉刷新的数据
     */
    public void loadRefreshData() {
        loadType = MainConstant.LoadData.REFRESH;
        currPage = 1;
        mNewsModel.loadNewsData(currPage, this);
    }

    /**
     * 获取上拉加载更多的数据
     */
    public void loadMoreData() {
        loadType = MainConstant.LoadData.LOAD_MORE;
        currPage++;
        mNewsModel.loadNewsData(currPage, this);
    }

    @Override
    public void loadSuccess(List<SimpleNewsBean> list) {
        if (currPage > 1) {
            //上拉加载的数据
            mAdapter.loadMoreData(list);
        } else {
            //第一次加载或者下拉刷新的数据
            mAdapter.refreshData(list);
        }
    }

    @Override
    public void loadFailure(String message) {
        // 加载失败后的提示
        if (currPage > 1) {
            //加载失败需要回到加载之前的页数
            currPage--;
        }
        mNewsView.loadFailure(message);
    }

    @Override
    public void loadStart() {
        mNewsView.loadStart(loadType);
    }

    @Override
    public void loadComplete() {
        mNewsView.loadComplete();
    }
}

(4)

public interface BaseLoadListener<T> {
    /**
     * 加载数据成功
     *
     * @param list
     */
    void loadSuccess(List<T> list);

    /**
     * 加载失败
     *
     * @param message
     */
    void loadFailure(String message);

    /**
     * 开始加载
     */
    void loadStart();

    /**
     * 加载结束
     */
    void loadComplete();
}
MVVM(Model-View-ViewModel)是一种软件架构模式,它将应用程序分为三个主要部分:模型(Model)、视图(View)和视图模型(ViewModel)。MVVM框架的优点如下: 1. 分离关注点:MVVM框架通过将视图逻辑与业务逻辑分离,使代码更加清晰和可维护。视图负责展示数据和用户交互,而视图模型则负责处理业务逻辑和数据操作,模型则负责数据的存储和获取。这种分离使得代码更易于理解、测试和维护。 2. 可重用性:MVVM框架鼓励将逻辑和界面分离,使得视图模型可以独立于具体的视图进行开发和测试。这种设计使得视图模型可以在不同的界面中重用,提高了代码的可重用性。 3. 双向数据绑定:MVVM框架提供了双数据绑定机制,使得视图和视图模型之间的数据同步更加方便。当视图中的数据发生变化时,视图模型会自动更新相应的数据,并且当视图模型中的数据发生变化时,视图也会自动更新。这种机制减少了手动处理数据同步的代码量,提高了开发效率。 4. 测试友好:MVVM框架的分层结构使得各个组件可以独立进行单元测试。视图模型中的业务逻辑可以通过单元测试来验证其正确性,而视图则可以通过自动化测试来验证其交互行为。这种测试友好的设计有助于提高代码的质量和稳定性。 为什么选择MVVM框架,主要有以下几个原因: 1. 提高开发效率:MVVM框架通过数据绑定和分离关注点的设计,减少了开发者编写重复代码的工作量,提高了开发效率。 2. 提高代码质量:MVVM框架的分层结构和测试友好的设计使得代码更易于理解、测试和维护,提高了代码的质量。 3. 支持团队协作:MVVM框架提供了清晰的代码结构和规范,使得团队成员可以更好地协同开发和维护项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值