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

 更新时间:2017年11月14日 11:17:06   作者:小之丶  
本篇文章主要介绍了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的集成,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

相关文章

  • 详解Android Studio实现用户登陆界面demo(xml实现)

    详解Android Studio实现用户登陆界面demo(xml实现)

    这篇文章主要介绍了详解Android Studio实现用户登陆界面demo,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Android嵌套线性布局玩法坑解决方法

    Android嵌套线性布局玩法坑解决方法

    这篇文章主要为大家介绍了Android嵌套线性布局玩法坑解决方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • android实现来电静音示例(监听来电)

    android实现来电静音示例(监听来电)

    这篇文章主要介绍了手机来电铃声响起后,通过此代码实现静音而非挂断的方法的相关资料
    2014-03-03
  • Android中的广播和广播接收器代码实例

    Android中的广播和广播接收器代码实例

    这篇文章主要介绍了Android中的广播和广播接收器代码实例,本文讲解了定义一个广播接收器、发送广播,定义好action标志、用Intent发送、注册只接收指定action的广播接收器、取消该广播接收器等操作代码实例,需要的朋友可以参考下
    2015-05-05
  • Android Handler机制的工作原理详析

    Android Handler机制的工作原理详析

    这篇文章主要给大家介绍了关于Android Handler机制的工作原理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • Android自定义processor实现bindView功能的实例

    Android自定义processor实现bindView功能的实例

    下面小编就为大家分享一篇Android自定义processor实现bindView功能的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • 基于Android实现百度地图定位过程详解

    基于Android实现百度地图定位过程详解

    这篇文章主要介绍了基于Android实现百度地图定位过程详解,需要的朋友可以参考下
    2015-11-11
  • Android界面设计(APP设计趋势 左侧隐藏菜单右边显示content)

    Android界面设计(APP设计趋势 左侧隐藏菜单右边显示content)

    这文章讲述了2013年未来的移动APP设计趋势,感觉挺有道理的:Android界面设计实现左侧隐藏菜单右边显示content,感兴趣的你可以了解下啊,希望本文对你的APP设计提高有所帮助哦
    2013-01-01
  • Android 使用 Scroller 实现平滑滚动功能的示例代码

    Android 使用 Scroller 实现平滑滚动功能的示例代码

    这篇文章主要介绍了Android 使用 Scroller 实现平滑滚动功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Android TV 3D卡片无限循环效果

    Android TV 3D卡片无限循环效果

    这篇文章主要为大家详细介绍了Android TV 3D卡片无限循环效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11

最新评论