Android用MVP实现一个简单的类淘宝订单页面的示例
作者:小之丶 发布时间:2022-09-20 06:21:01
MVP(Model-View-Presenter) 是总所周知MVC模式的一个演变,他们的主要目的都是划分模块职责,降低模块耦合,易测试,提高代码复用,网上有很多相关的知识,这里仅是个人看法。
1、层级
Model:负责数据相关的操作
View:负责UI的绘制和用户的交互
Presenter:作为Model和View的中间协调部分,负责两者之间的业务逻辑处理
2、MVP的优缺点
优点:降低耦合,层级职责更明显,易于单元测试
缺点:造成类数量增多,在某些场景下presenter的复用会产生接口冗余
这几天把以前项目上做过的一个类似淘宝订单的页面单独提取出来重新做了一遍,把一些公共代码提取出来,方便以后用到类似界面简易集成,同时也用到了MVP框架,通过MVP之间各层次互相绑定的最基础的类,将数据和逻辑分离开,这是效果图
值得一提的是,这里用到了一些其他开源代码,比如刷新样式swipetoloadlayout等,具体的使用方法大家可以百度搜下名字就行了,资料很多。
4个Fragment用的统一的静态构建方法,配合ViewPager和TabLayout进行一次性集成
//统一的Fragment构建方法
public static MerchandiseListBaseFragment newInstance(int flag) {
Bundle args = new Bundle();
//type代表页签,0:全部订单 1:待发货 2:待收货 3:已完成
args.putString("type", String.valueOf(flag));
MerchandiseListBaseFragment fragment = new MerchandiseListBaseFragment();
fragment.setArguments(args);
return fragment;
}
/**
* 初始化ViewPager
*/
private void initViewPager() {
final ArrayList<Fragment> fragmentList = new ArrayList<>();
MerchandiseListBaseFragment merchandiseListAll = MerchandiseListBaseFragment.
newInstance(0);
MerchandiseListBaseFragment merchandiseListDisPatch = MerchandiseListBaseFragment.
newInstance(1);
MerchandiseListBaseFragment merchandiseListReceive = MerchandiseListBaseFragment.
newInstance(2);
MerchandiseListBaseFragment merchandiseListFinish = MerchandiseListBaseFragment.
newInstance(3);
MerchandiseListBaseFragment.firstGetData();//初始化数据
//持有fragment对象List
fragmentList.add(merchandiseListAll);
fragmentList.add(merchandiseListDisPatch);
fragmentList.add(merchandiseListReceive);
fragmentList.add(merchandiseListFinish);
FragmentPagerAdapter fragmentAdapter = new BaseFragmentAdapter(getSupportFragmentManager(), fragmentList, mTitles);
viewPager.setAdapter(fragmentAdapter);
viewPager.setCurrentItem(0);
viewPager.setOffscreenPageLimit(4);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
tabLayout.getTabAt(position).select();
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
tabLayout.setupWithViewPager(viewPager);//将tabLayout和ViewPager绑定
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
订单列表是通过RecyclerView和swipetoloadlayout结合写的,具体代码参见源码(本文底部),因为这里只是提供一个淘宝订单页面的制作方法,所以这里的所有bean数据都暂时用的本地数据,没有添加网络框架进行数据加载,有兴趣的同学可以研究下MVP+RxJava+Okhttp+Retrofit,非常好用。
MVP构建通过在view层和presenter层中的attachPre()方法进行对象绑定:
/**
* MVP绑定
*/
@Override
public void attachPre() {
activity = this;
// mContext = this;
mPresenter = TUtil.getT(this, ID_PRESENTER);
mModel = TUtil.getT(this, ID_MODEL);
if (mPresenter != null) {
mPresenter.mContext = this;
}
initPresenter();
}
这里的getT方法是用来得到类的模板参数的类型的,返回表示此类型实际类型参数的 Type 实例化对象。这样就可以获取view
public static <T> T getT(Object o, int i) {
try {
return ((Class<T>) ((ParameterizedType) (o.getClass()
.getGenericSuperclass())).getActualTypeArguments()[i])
.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassCastException e) {
e.printStackTrace();
}
return null;
}
源码地址:https://github.com/WeaponZhi/MerchandiseList
以后有机会再研究下网络框架和MVP的集成,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
来源:http://blog.csdn.net/qq_34795285/article/details/60465611


猜你喜欢
- 1.编写核心类MainApp:package com.yiidian.gson;import com.google.gson.Gson;im
- Spring MVC 请求处理流程用户发起请求,到 DispatcherServlet;然后到 HandlerMapping 返回处理器链(
- 一、问题描述我们开发项目时,经常会和第三方接口打交道,有些第三方项目为了安全起见,会把项目部署在"内网"环境,不对外暴露
- 本文实例分析了Winform窗体效果。分享给大家供大家参考。具体如下:using System;using System.Collectio
- 1.Knife4j在线API文档基本使用Knife4j是一款基于Swagger 2的在线API文档框架。使用Knife4j的基础步骤:添加依
- /// <summary>/// 人民币大写/// </summary>/// <param name=&qu
- java通过IP解析地理位置在项目开发中,需要在登录日志或者操作日志中记录客户端ip所在的地理位置。目前根据ip定位地理位置的第三方api有
- 本文实例讲述了C#实现根据年份计算生肖属相的方法。分享给大家供大家参考。具体分析如下:提供年份可以输出属相,代码比较简单,因为2008年为鼠
- 一、问题描述今天做了一个C++的类组合的作业,由于是基础小白,编写之后一直出现Id returned 1exit status的情况:网上查
- 1.引入依赖 <!--mybatisplus依赖--> <dependency> &nbs
- 本文实例讲述的是AlertDialog,这种对话框会经常遇到。AlertDialog跟WIN32开发中的Dialog不一样,AlertDia
- 废话不多说了,直接给大家贴代码了,具体代码如下所示:public class RoundImageView extends ImageVie
- RandomAccessFileRandomAccessFile 是随机访问文件(包括读/写)的类。它支持对文件随机访问的读取和写入,即我们
- 前端代码:<form id= "uploadForm"> <p >指定文件名:
- 有一个比较好理解的例子,在这跟大家介绍下: 1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了.  
- 前言接着上一篇,上篇已经测试通过,成功添加了数据。那么这篇主要是继续上一个项目,将项目进行工程化包装,增加一些必要配置,并且生成增删改查接口
- 写在前面现在,越来越多的App里面使用了模糊效果,这种模糊效果称之为高斯模糊。大家都知道,在Android平台上进行模糊渲染是一个相当耗CP
- C# 操作符之三元操作符“?:”是什么呢?C# 操作符之三元操作符“?:”有时也称为条件操作符。对条件表达式b?x:y,先计算条件b,然后进
- 前言内存泄漏简单地说就是申请了一块内存空间,使用完毕后没有释放掉。它的一般表现方式是程序运行时间越长,占用内存越多,最终用尽全部内存,整个系
- 前言在我的申请下,公司终于购买了一台基于Android12.0的手机,然后我就开心的拿去安装测试了,发现程序崩溃了,于是我这里就写下来,An