Android实战(橘子娱乐)-首页(第一篇 MVP框架基本搭建和实现准备)

来源:互联网 发布:淘宝店铺包邮怎么设置 编辑:程序博客网 时间:2024/04/30 14:50

前言:

     “橘子娱乐”这个实战APP参考了大神的开源项目:    https://github.com/LRH1993/SmartRecom  ,我们将采用MVP框架以及现在比较热门的开源项目去实现,目的在于练手,实现如下功能:
            1.电影展示以及播放跳转
            2.音乐播放   
            3.视频直播
            4.搞笑段子
            5.小说书城
            6.本地简单的登录功能  

   版权声明:
            该APP的数据接口均来自互联网,只做学习所用,若有侵权请告知我将立即删除对应内容。

首先来看一下首页效果图:


一、看完动态图,我们总结一下首页需要实现的功能:
        1.侧滑菜单
        2.顶部toolbar(在更随滑动隐藏和现实)
        3.电影推荐展示,包含功能:下拉刷新、顶部banner、底部显示提示,中间两列和一列混排
        4.sharedpreferences保存登录状态,根据登录状态显示不同的头像和文字

二、开源项目及技术点:
    1.NavigationView+DrawerLayout
    2.MVP
    3.sharedpreferences
    4.IRecyclerView
    5.ButterKnife
    6.RxJava2
    7.Retrofit2
    8.okhttp
    9.com.youth.banner
    10.SuperTextView 
    
三、准备
    我们需要实现首页的这些功能呢,我们首先需要做一些基础性的准备,比如依赖相关库、搭建MVP框架的结构以及一些基本通用的类实现。开源库的依赖我就不细讲了大概过一下,下面是首页需要的依赖(app build.gradle):
  1. compile 'com.android.support:recyclerview-v7:25.3.1'
  2. //视图绑定 butterknife
  3. compile 'com.jakewharton:butterknife:8.4.0'
  4. apt 'com.jakewharton:butterknife-compiler:8.4.0'
  5. /*IRecyclerView*/
  6. compile 'com.github.Aspsine:IRecyclerView:0.0.5'
  7. //引入rxjava
  8. compile 'io.reactivex.rxjava2:rxjava:2.0.4'
  9. //引入rxandroid
  10. compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
  11. //引入retrofit
  12. compile 'com.squareup.retrofit2:retrofit:2.1.0'
  13. //引入rxjava适配器,方便rxjava与retrofit的结合
  14. compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
  15. //引入json转换器,方便将返回的数据转换为json格式
  16. compile 'com.squareup.retrofit2:converter-gson:2.1.0'
  17. //引入okhttp
  18. compile 'com.squareup.okhttp3:okhttp:3.5.0'
  19. //引入Log拦截器,方便DEBUG模式输出log信息
  20. compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
  21. //自动轮播
  22. compile 'com.youth.banner:banner:1.4.9'
上面引入ButterKnife时还需要设置:
    
  1. apply plugin: 'com.neenbedankt.android-apt'

同时需要在project build.gradle文件中设置:
  1. dependencies {
  2. //这里配置 apt 供butterknife使用
  3. classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  4. }
在依赖成功以后,我们需要编写baseActivity来实现一些统一的操作封装,提供给以后的Activity继承:
  1. package com.andy.orange.base;
  2. import android.content.Context;
  3. import android.content.Intent;
  4. import android.content.pm.ActivityInfo;
  5. import android.os.Bundle;
  6. import android.support.annotation.Nullable;
  7. import android.support.v7.app.AppCompatActivity;
  8. import android.view.Window;
  9. import com.andy.orange.R;
  10. import com.andy.orange.utils.SettingStatusBar;
  11. import butterknife.ButterKnife;
  12. import butterknife.Unbinder;
  13. /**
  14. * Created by Andy Lau on 2017/8/9.
  15. * 定义一个基础的Activity抽象类,做一些通用的操作
  16. */
  17. public abstract class BaseActivity extends AppCompatActivity {
  18. public Context mContext;
  19. private Unbinder mUnbinder;
  20. @Override
  21. protected void onCreate(@Nullable Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. beforeSetContentView();
  24. setContentView(getChildLayoutId());
  25. //设置默认的状态栏颜色
  26. setStatusBarColor();
  27. mContext=this;
  28. mUnbinder= ButterKnife.bind(this);
  29. this.initPresenter();
  30. this.initView();
  31. }
  32. /*
  33. * 设置默认的状态栏颜色(4.4系统以上有效)
  34. * */
  35. protected void setStatusBarColor(){
  36. SettingStatusBar.setColor(this,getResources().getColor(R.color.colorPrimary));
  37. };
  38. /*
  39. * 用户自定义状态栏颜色(4.4系统以上有效)
  40. * */
  41. protected void setStatusBarColor(int color){
  42. SettingStatusBar.setColor(this,color);
  43. };
  44. /*
  45. * 在设置布局之前的配置
  46. * */
  47. private void beforeSetContentView(){
  48. //设置不显示标题
  49. requestWindowFeature(Window.FEATURE_NO_TITLE);
  50. //设置竖屏
  51. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  52. }
  53. /*
  54. *定义一个获取子类layoutId的抽象方法,在子类中实现
  55. */
  56. public abstract int getChildLayoutId();
  57. /*
  58. * 初始化Presenter
  59. * */
  60. public abstract void initPresenter();
  61. /*
  62. * 初始化view
  63. * */
  64. public abstract void initView();
  65. /*
  66. * 通过class无返回值跳转页面,并传递Bundle
  67. *
  68. */
  69. public void startActivity(Class<?> cls,Bundle bundle){
  70. Intent intent=new Intent();
  71. intent.setClass(this,cls);
  72. if (bundle!=null){
  73. intent.putExtras(bundle);
  74. }
  75. startActivity(intent);
  76. }
  77. /*
  78. * 通过class不带返回值跳转页面,无Bundle参数
  79. *
  80. */
  81. public void startActivity(Class cls){
  82. startActivity(cls,null);
  83. }
  84. /*
  85. * 通过class带返回值跳转页面,有Bundle参数
  86. *
  87. */
  88. public void startActivityForResult(Class cls,Bundle bundle,int requestCode){
  89. Intent intent=new Intent(this,cls);
  90. if(bundle!=null){
  91. intent.putExtras(bundle);
  92. }
  93. startActivityForResult(intent,requestCode);
  94. }
  95. /*
  96. * 通过class带返回值跳转页面,无Bundle参数
  97. *
  98. */
  99. public void startActivityForResult(Class cls,int requestCode){
  100. startActivityForResult(cls,null,requestCode);
  101. }
  102. @Override
  103. protected void onResume() {
  104. super.onResume();
  105. }
  106. @Override
  107. protected void onPause() {
  108. super.onPause();
  109. }
  110. @Override
  111. protected void onDestroy() {
  112. super.onDestroy();
  113. //用来重置绑定的view
  114. mUnbinder.unbind();
  115. }
  116. }

    从BaseActivity代码可以看出我们做了一些统一的操作,比如 在onCreate时绑定了ButterKnife,在onDestroy中解绑了ButterKnife  ,继承了该类的Actvity都不需要重复做绑定和解绑操作,然后我们也开放了一些抽象方法比如 initPresenter() initView() getChildLayoutId()等,提供给继承类实现,同时还封装了一些基本的启动Activity的方法,ok这就是BaseActivity全部功能,至于SettingStatusBar工具类代码由于篇幅原因这里就不贴出来讲解了,基础类封装好以后,我们来搭我们的MVP架子。

下面是mvp的包结构截图:
 
    ok三层结构都建立完毕,presenter和model层包含接口与实现类,最后实现的效果就是,在model中通过网络请求获取到数据,保存到bean(我们还需要建立一个bean包,放置我们的bean类)集合中,presenter通过获取model实例获取到保存数据的bean集合,然后通过绑定的view实例传递给view层,view层等同于Activity因为我们会让Activity去继承对应的view接口。这样我们就实现了数据从model层传递到Activity了。


    这一篇我们就实现这么多,篇幅太长不利于学习,第二篇文章我们将实现,主页面的布局,同时讲解主页Activity部分的代码。
阅读全文
0 0
原创粉丝点击