用RxJava+Retrofit+OKHttp+ViewModel+LiveData封装的一个Kotlin版本的MVVM框架

kotlin-mvvm

技术要点

1. RxJava+Retrofit+OkHttp实现链式http请求

2. 封装基类:BaseActivity、BaseVMActivity、BaseFragment、BaseVMFragment、RecycleAdapter、BaseViewModel

3. 封装工具扩展类:CalendarExt、ContextExt、DateExt、EditTextExt、GsonExt、RxJavaExt、StringExt、SnackbarExt

4. 引入LifeCycle,将ViewModel和Activity的生命周期绑定在一起

5. 将在Application中初始化移至到ContentProvider中,从而不用封装BaseApplication

6. APT(编译时注解)封装注解:OnClickFirstDrawable、OnClickFirstText、OnClickSecondDrawable、OnClickSecondText、Prefs、PrefsField、StatusBar

最低兼容:21

Gradle

1. 在Project的build.gradle中添加

allprojects {
     repositories {
       maven { url 'https://jitpack.io' }
     }
 }
复制代码

2. 在app的build.gradle的添加

apply plugin: 'kotlin-kapt' // 使用 kapt 注解处理工具
复制代码

3. 在app的build.gradle的android下添加

    buildFeatures {
        viewBinding = true
    }
复制代码

4. 添加依赖

implementation "com.gitee.catch-pig.kotlin-mvp:mvp:last_version"
kapt "com.gitee.catch-pig.kotlin-mvp:compiler:last_version"
复制代码

使用

1. 在需要使用状态栏、标题栏、加载动画的主题中配置全局参数:

属性 类型 必须 默认 说明
title_bar_height dimension 标题栏高度
title_bar_back_icon DrawableRes 标题栏的返回图标
title_bar_background ColorRes 标题栏的背景色
title_bar_text_color ColorRes 标题栏的文字颜色
title_bar_show_line boolean false 标题栏的下方的线条是否显示
loading_view_color ColorRes loading动画颜色
loading_view_background ColorRes loading动画背景色
recycle_view_empty_layout LayoutRes emptyLayout 列表空页面

使用示例:

```
<style name="AppThemeBarStyle" parent="Theme.AppCompat.Light.NoActionBar">
    <!--全局标题栏和状态栏配置-->
    <item name="title_bar_height">80dp</item>
    <item name="title_bar_background">@color/colorPrimary</item>
    <item name="title_bar_back_icon">@drawable/back</item>
    <item name="title_bar_text_color">@color/white</item>
    <item name="title_bar_show_line">false</item>
    <item name="loading_view_color">@color/colorAccent</item>
    <item name="loading_view_background">@color/white</item>
    <!--全局标题栏和状态栏配置-->
</style>
```
复制代码

2. Activity

  • 使用MVP的继承BaseVMActivity
  • 不使用MVP的继承BaseActivity

3. Fragment

  • 使用MVP的继承BaseVMFragment
  • 不使用MVP的继承BaseFragment

4. 如果使用RecycleView的时候,Adapter可以继承RecycleAdapter来使用

adapter使用了ViewBanding,只需要实现以下两个方法

override fun itemViewBanding(): Class<ItemUserBinding> {
      return ItemUserBinding::class.java
  }

override fun bindViewHolder(holder: CommonViewHolder<ItemUserBinding>, m: User, position: Int) {
  holder.viewBanding {
      it.name.text = m.name
  }
}
复制代码

5. 注解使用

5.1 Title-标题

属性 类型 必须 默认 说明
value StringRes 标题内容
backgroundColor ColorRes 全局标题背景色 标题背景色
textColor ColorRes 全局标题文字颜色 标题文字颜色
backIcon DrawableRes 全局标题返回按钮图标 标题返回按钮图标

5.2 OnClickFirstDrawable-标题上第一个图标按钮的点击事件

属性 类型 必须 默认 说明
value StringRes 按钮图片内容

5.3 OnClickFirstText-标题上第一个文字按钮的点击事件

属性 类型 必须 默认 说明
value StringRes 按钮文字内容

5.4 OnClickSecondDrawable-标题上第二个图标按钮的点击事件

属性 类型 必须 默认 说明
value StringRes 按钮图片内容

5.5 OnClickSecondText-标题上第二个文字按钮的点击事件

属性 类型 必须 默认 说明
value StringRes 按钮文字内容

5.6 StatusBar-状态栏

属性 类型 必须 默认 说明
hide boolean false 隐藏状态栏
enabled boolean false 状态栏是否可用
transparent boolean false 状态栏透明

5.7 Prefs-SharedPreferences注解生成器

属性 类型 必须 默认 说明
value String "" 别名
mode PrefsMode PrefsMode.MODE_PRIVATE 模式,对应PreferencesMode

5.8 PrefsField-SharedPreferences字段注解

属性 类型 必须 默认 说明
value String "" 字段别名,如果为空则取修饰字段的参数名称

6. 刷新分页

使用RefreshLayoutWrapper+RecyclerAdapter控件实现刷新功能

  • RefreshLayoutWrapper继承于SmartRefreshLayout,具体使用请看SmartRefreshLayout官方文档,默认每页数据量为16,如果想修改每页数据量,可使用如下方法更改:

    RefreshLayoutWrapper.pageSize = 16
    复制代码
  • RefreshLayoutWrapper实现了IPageControl,可以通过调用接口内的方法类获取刷新控件的状态和更改状态

    //获取刷新的状态
    iPageControl.getRefreshStatus()
    复制代码
  • RecyclerAdapter在实例化的时候传入IPageControl, 获取数据成功之后,只需要调用autoUpdateList(list)方法, 可以自动RefreshLayoutWrapper页码和刷新状态变化

  • 数据更新失败可以调用RecyclerAdapter.updateFailed()

  • 获取每页的数据量和下一页的页码,可以调用一下方法

    //每页的数据量
    RecyclerAdapter.pageSize = 16
    //下一页的页码
    RecyclerAdapter.nextPageIndex = 1
    复制代码

7. 文件下载器(DownloadManager))

  • 单文件下载方法download(DownloadInfo,DownloadCallback)
    DownloadManager.download(downloadUrl, {
            
        }, { readLength, countLength ->
            progressLiveData.value = (readLength * 100 / countLength).toInt()
        })
    复制代码
    • DownloadInfo

      data class DownloadInfo(
            /**
             * 域名
             */
            val baseUrl:String,
            /**
             * 下载地址
             */
            val url:String,
            /**
             * 连接超时时间(单位:秒)
             */
            val connectTimeout:Long = 5
      ){
              override fun toString(): String {
                      return "$baseUrl$url"
              }
      }
      复制代码
    • DownloadCallback

      interface DownloadCallback {
          /**
           * 开始下载
           */
          fun onStart()
      
          /**
           * 下载成功
           * @param path 本地保存的地址
           */
          fun onSuccess(path:String)
      
          /**
           * 下载完成
           */
          fun onComplete()
      
          /**
           * 下载进度
           * @param readLength 读取的进度
           * @param countLength 总进度
           */
          fun onProgress(readLength:Long,countLength:Long)
      
          /**
           * 下载错误
           * @param t 错误信息
           */
          fun onError(t:Throwable)
      }
      复制代码

第三方库

SmartRefreshLayout-刷新控件

Immersionbar-状态栏

RxJava3

RxAndroid

OkHttp

Retrofit

Gson

AndroidUtilKTX-工具类

LoadingView-Loading动画

猜你喜欢

转载自juejin.im/post/7019293070709489678