Android用MVP实现一个简单的类淘宝订单页面的示例

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的集成,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android仿淘宝商品浏览界面图片滚动效果

    用手机淘宝浏览商品详情时,商品图片是放在后面的,在第一个ScrollView滚动到最底下时会有提示,继续拖动才能浏览图片.仿照这个效果写一个出来并不难,只要定义一个Layout管理两个ScrollView就行了,当第一个ScrollView滑到底部时,再次向上滑动进入第二个ScrollView.效果如下: 需要注意的地方是: 1.如果是手动滑到底部需要再次按下才能继续往下滑,自动滚动到底部则不需要 2.在由上一个ScrollView滑动到下一个ScrollView的过程中多只手指相继拖动也不会导

  • Android实现的仿淘宝购物车demo示例

    本文实例讲述了Android实现的仿淘宝购物车.分享给大家供大家参考,具体如下: 夏的热情渐渐退去,秋如期而至,丰收的季节,小编继续着实习之路,走着走着,就走到了购物车,逛过淘宝或者是京东的小伙伴都知道购物车里面的宝贝可不止一件,对于爱购物的姑娘来说,购物车里面的商品恐怕是爆满,添加不进去了,以前逛淘宝的时候,小编没有想过要怎么样实现购物车,就知道在哪儿一个劲儿的逛,但是现在不一样了,小编做为一个开发者,想的就是该如何实现,捣鼓了两天的时间,用listview来实现,已经有模有样了,现在小编就来

  • Android中实现淘宝购物车RecyclerView或LIstView的嵌套选择的逻辑

    使用了RecyclerView嵌套RecyclerView的方案. 购物车的第一个界面为RecyclerView,每个Item里面包含一个店铺.在Item中使用RecyclerView包含店铺和店铺的多个商品. 实现思路: 使用接口回调将第二个adapter的商品选择的监听事件回调给第一个adapter后再在第一个adapter中回调给MainActivity. 使用接口回调将第一个adapter的商品选择的监听事件回调给MainActivity. 在MainActivity中处理第一个adap

  • Android实现仿淘宝购物车增加和减少商品数量功能demo示例

    本文实例讲述了Android实现仿淘宝购物车增加和减少商品数量功能.分享给大家供大家参考,具体如下: 在前面一篇<Android实现的仿淘宝购物车demo示例>中,小编简单的介绍了如何使用listview来实现购物车,但是仅仅是简单的实现了列表的功能,随之而来一个新的问题,买商品的时候,我们可能不止想买一件商品,想买多个,或许有因为某种原因点错了,本来想买一件来着,小手不小心抖了一下,把数量错点成了三个,这个时候就涉及到一个新的功能,那就是增加和减少商品的数量,今天这篇博文,小编就来和小伙伴们

  • 轻松实现Android仿淘宝地区选择功能

    最近用淘宝客户端的时候,编辑地址的时候有个地区选择的功能.看上面的效果觉得挺酷,滚动的时候,是最后一个从下面飞上来挨着前一个.就自己鼓捣一个出来玩玩. 说了效果可能不太直观,下面上两张图看看效果 淘宝地区选择效果 再来一张自己的效果 gif的效果可能不太好,大家自己用Android手机打开淘宝看看 实现分析 展示很简单,ListView就可以了.对于动画效果,只需要在getView的时候获取到要展示的View,通过属性动画修改translationY就ok啦.由于地区选择是一个界面,所以这里还用

  • Android中使用TextView实现高仿京东淘宝各种倒计时效果

    今天给大家带来的是仅仅使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.最近公司一直加班也没来得及时间去整理,今天难得休息想把这个分享给大家,只求共同学习,以及自己后续的复习.为什么会想到使用一个TextView来实现呢?因为最近公司在做一些优化的工作,其中就有一个倒计时样式,原来开发的这个控件的同事使用了多个TextView拼接在一起的,实现的代码冗余比较大,故此项目经理就说:小宏这个就交给你来优化了,并且还要保证有一定的扩展性,当时就懵逼了.不知道从何处开始

  • Android 仿淘宝、京东商品详情页向上拖动查看图文详情控件DEMO详解

    一.淘宝商品详情页效果 我们的效果 二.实现思路 使用两个scrollView,两个scrollView 竖直排列,通过自定义viewGroup来控制两个scrollView的竖直排列,以及滑动事件的处理.如下图 三.具体实现 1.继承viewGroup自定义布局View 重写onMeasure()和onLayout方法,在onLayout方法中完成对两个子ScrollView的竖直排列布局,代码如下: 布局文件: <RelativeLayout xmlns:android="http:/

  • Android项目类似淘宝 电商 搜索功能,监听软键盘搜索事件,延迟自动搜索,以及时间排序的搜索历史记录的实现

    最近跳槽去新公司,接受的第一个任务是在 一个电商模块的搜索功能以及搜索历史记录的实现. 需求和淘宝等电商的功能大体差不多,最上面一个搜索框,下面显示搜索历史记录.在EditText里输入要搜索的关键字后,按软键盘的搜索按键/延迟xxxxms后自动搜索.然后将搜索的内容展示给用户/提示用户没有搜到相关信息. 历史记录是按时间排序的,最新的在前面,输入以前搜索过的关键字,例如牛仔裤(本来是第二条),会更新这条记录的时间,下次再看,牛仔裤的排列就在第一位了.并且有清除历史记录的功能. 整理需求,大致需

  • Android实现淘宝选中商品尺寸的按钮组实例

    话不多说,先上个效果图: 现在我们就来说说里面的一些原理把! 一.原理: 1.其实这里我们用到的是一个ViewGroup控件组,把这些按钮加进去就有这种效果了!不过这里要继承ViewGroup(命名为:GoodsViewGroup)重写里面的一些方法. 2.主要的方法有: GoodsViewGroup按钮组的控件大小 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 里面的按钮每个的位置坐标 protect

  • Android用MVP实现一个简单的类淘宝订单页面的示例

    MVP(Model-View-Presenter) 是总所周知MVC模式的一个演变,他们的主要目的都是划分模块职责,降低模块耦合,易测试,提高代码复用,网上有很多相关的知识,这里仅是个人看法. 1.层级 Model:负责数据相关的操作 View:负责UI的绘制和用户的交互 Presenter:作为Model和View的中间协调部分,负责两者之间的业务逻辑处理 2.MVP的优缺点 优点:降低耦合,层级职责更明显,易于单元测试 缺点:造成类数量增多,在某些场景下presenter的复用会产生接口冗余

  • Android仿淘宝订单页面效果

    一般电商项目会涉及到的订单管理模块,类似淘宝样式的订单 主要是讲一下订单页面的实现.当然实现的方法有很多,我知道的有两种方法:一种是采用listview嵌套listview的方式,这种方式需要重写listview中onMearsure方法:还有一种是采用接口回调的方式,这种方式主要对后台返回的数据有依赖: 今天主要说下第二种方法: 实现的思想:首先Tab下面的布局还是用一个listview实现,然后将listview中的item分为上中下三部分内容: 创建三个xml文件,分别实现三个布局:第一部

  • python使用线程封装的一个简单定时器类实例

    本文实例讲述了python使用线程封装的一个简单定时器类.分享给大家供大家参考.具体实现方法如下: from threading import Timer class MyTimer: def __init__(self): self._timer= None self._tm = None self._fn = None def _do_func(self): if self._fn: self._fn() self._do_start() def _do_start(self): self.

  • Android仿淘宝详情页面viewPager滑动到最后一张图片跳转的功能

    需要做一个仿淘宝客户端ViewPager滑动到最后一页,再拖动的时候跳到详情的功能,刚开始没什么思路,后来搜了一下,发现有好几种实现方法,最好的一种就是在ViewPager图片的后面再加一个view,然后滑动viewpager的时候,判断一下就行了. 附一个链接,我写的代码就是参考的这个,稍微改了一点点,先看看效果图. 实现起来比较简单,先写一个滑动加载详情的布局,然后在viewpager的instantiateItem里面判断一下,如果是最后一张,就显示加载详情的那个布局.不过需要注意的是,v

  • Android中利用动态加载实现手机淘宝的节日特效

    相信去年圣诞节打开过手机淘宝的童鞋都会对当时的特效记忆犹新吧:全屏飘雪,旁边还有个小雪人来控制八音盒背景音乐的播放,让人有种身临其境的感觉,甚至忍不住想狠狠购物了呢(误),大概就是下面这个样子滴: 嗯,确实很炫,那么我们一步步去分析是如何实现的: 一.实现下雪的 View 首先,最上面一层的全屏雪花极有可能是一个顶层的View,而这个View是通过动态加载去控制显示的(不更新淘宝也能看到这个效果).那么我们先得实现雪花效果的 View,人生苦短,拿来就用.打开 gank.io,搜索"雪花&quo

  • 基于JS分页控件实现简单美观仿淘宝分页按钮效果

    最新版本代码请移步到https://github.com/pgkk/kkpager 在线测试链接:http://pgkk.github.io/kkpager/example/pager_test.html 分页按钮思想: 1.少于9页,全部显示 2.大于9页,1.2页显示,中间页码当前页为中心,前后各留两个页码 附件中有完整例子的压缩包下载.已更新到最新版本 先看效果图: 01输入框焦点效果 02效果 模仿淘宝的分页按钮效果控件kkpager JS代码: Js代码 var kkpager = {

  • Android打开淘宝客户端(手淘)效果及实现代码

    隐式调用的方法就不讲了,如果安装了手淘的SDK或阿里百川之类的东西请参考官方文档,有了文档这些都不是问题. 一.应用内打开 应用内部调用淘宝,当展示"最近运行的应用"时只会显示一个应用,前提是安装了淘宝客户端. 效果图: 首先判断应用是否安装: private boolean isAppInstalled(Context context, String uri) { PackageManager pm = context.getPackageManager(); boolean ins

  • JS仿淘宝实现的简单滑动门效果代码

    本文实例讲述了JS仿淘宝实现的简单滑动门效果代码.分享给大家供大家参考.具体如下: 这是一个简单的仿淘宝滑动门效果代码,个人感觉真的挺不错,以前有过一款和这个差不多.在滑动门里你可以再次布局你的网页,可以做成一个功能超强大的导航,原示例是一个拼音索引程序,改成菜单也是可以的. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-f-taobao-simple-hdm-style-demo/ 具体代码如下: <!DOCTYPE html PUBL

  • Android实现悬浮窗的简单方法实例

    目录 1. 前言 2.原理 3.具体实现 3.1浮窗布局 3.2 悬浮窗的实现 1. 使用服务Service 2. 获取WindowManager并设置LayoutParams 3. 创建View并添加到WindowManager 4. 实现悬浮窗的拖拽和关闭功能 5. 利用广播进行通信 6. 设置权限 3.3 完整代码 4. 总结 1. 前言 现在很多应用都有小悬浮窗的功能,比如看直播的时候,通过Home键返回桌面,直播的小窗口仍可以在屏幕上显示.下面将介绍下悬浮窗的的一种简单实现方式. 2.

随机推荐