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之间各层次互相绑定的最基础的类,将数据和逻辑分离开,这是效果图

Android用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

标签:Android,淘宝,订单
0
投稿

猜你喜欢

  • SpringBoot后端上传文件类型检测方式

    2021-07-02 05:00:04
  • Java中十进制和十六进制的相互转换方法

    2022-04-21 11:54:06
  • Java实现五子棋AI算法

    2022-02-23 05:32:57
  • Spring JDBC的使用方法详解

    2021-12-08 14:05:42
  • Spring boot2X Consul如何使用Feign实现服务调用

    2022-04-29 14:41:18
  • ProtoStuff不支持BigDecimal序列化及反序列化详解

    2022-09-19 06:53:30
  • java实现简单石头剪刀布小游戏

    2021-09-17 07:25:41
  • Spring Boot配置线程池拒绝策略的场景分析(妥善处理好溢出的任务)

    2022-08-05 07:12:24
  • Java的MyBatis框架中实现多表连接查询和查询结果分页

    2022-10-29 08:49:21
  • Spring @EventListener 异步中使用condition的问题及处理

    2023-07-07 21:42:16
  • 基于Java汇总Spock框架Mock静态资源经验

    2023-11-25 04:42:29
  • spring boot如何实现切割分片上传

    2023-06-29 02:49:26
  • JAVA中SpringBoot启动流程分析

    2021-07-03 03:57:05
  • 详解path和classpath的区别

    2023-05-02 13:28:32
  • Eclipse安装Aptana插件(注意对应版本问题)

    2022-05-26 17:17:55
  • Java C++ 算法题解leetcode652寻找重复子树

    2022-08-17 23:58:09
  • Spring Boot中配置定时任务、线程池与多线程池执行的方法

    2021-08-08 13:31:30
  • Java案例之随机验证码功能实现实例

    2022-05-24 13:28:16
  • java并发编程专题(五)----详解(JUC)ReentrantLock

    2023-12-01 04:04:09
  • Android 个人理财工具四:添加账单页面 下

    2021-09-05 00:43:59
  • asp之家 软件编程 m.aspxhome.com