├── .gitignore ├── MvvmModulePatternSample.zip ├── README.md ├── app ├── .gitignore ├── build.gradle ├── mvvm.jks ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── mou │ │ └── mvvmmodule │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── mou │ │ │ └── mvvmmodule │ │ │ ├── core │ │ │ └── App.kt │ │ │ ├── di │ │ │ ├── component │ │ │ │ └── AppComponent.kt │ │ │ ├── module │ │ │ │ ├── ActivityModule.kt │ │ │ │ ├── AppModule.kt │ │ │ │ └── ViewModelModule.kt │ │ │ └── mvvm │ │ │ │ ├── bean │ │ │ │ └── ArticleBean.kt │ │ │ │ ├── model │ │ │ │ └── ApiService.kt │ │ │ │ ├── view │ │ │ │ └── MainActivity.kt │ │ │ │ └── viewmodel │ │ │ │ └── MainViewModel.kt │ │ │ └── util │ │ │ ├── AppUtils.java │ │ │ └── KtAppUtils.kt │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── mou │ └── mvvmmodule │ └── ExampleUnitTest.kt ├── build.gradle ├── component_build.gradle ├── config.gradle ├── config_build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── images ├── a.jpg ├── b.jpg ├── c.jpg ├── e.jpg └── logo.jpg ├── lib_basemvvm ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── mou │ │ └── basemvvm │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── mou │ │ │ └── basemvvm │ │ │ ├── android │ │ │ ├── FactoryModule.kt │ │ │ └── ViewModelKey.kt │ │ │ ├── base │ │ │ ├── BaseActivity.kt │ │ │ ├── BaseApplication.kt │ │ │ ├── BaseFragment.kt │ │ │ ├── BaseViewModel.kt │ │ │ ├── IActivity.kt │ │ │ ├── IView.kt │ │ │ └── ViewModelFactory.kt │ │ │ ├── helper │ │ │ ├── annotation │ │ │ │ ├── PageStateType.java │ │ │ │ └── RefreshType.java │ │ │ ├── extens │ │ │ │ ├── BaseBinds.kt │ │ │ │ ├── ContextExtens.kt │ │ │ │ ├── ObservableItemField.kt │ │ │ │ └── RxJavaExtens.kt │ │ │ ├── listener │ │ │ │ ├── ClickPresenter.kt │ │ │ │ └── RefreshPresenter.kt │ │ │ └── network │ │ │ │ ├── ApiException.kt │ │ │ │ ├── EmptyException.kt │ │ │ │ ├── NetInterceptor.kt │ │ │ │ ├── NetMgr.kt │ │ │ │ ├── NetProvider.kt │ │ │ │ ├── NullStringToEmptyAdapterFactory.kt │ │ │ │ └── RequestHandler.kt │ │ │ ├── integration │ │ │ ├── AppDelegate.kt │ │ │ ├── AppLifeCycles.kt │ │ │ ├── ConfigModule.kt │ │ │ └── ManifestParser.kt │ │ │ └── widget │ │ │ ├── LoadDialog.kt │ │ │ └── dialog │ │ │ ├── AlertController.kt │ │ │ ├── CommonDialog.kt │ │ │ ├── DialogHelper.kt │ │ │ └── DialogViewHelper.kt │ └── res │ │ ├── anim │ │ ├── dialog_from_bottom_anim_in.xml │ │ ├── dialog_from_bottom_anim_out.xml │ │ ├── dialog_scale_anim_in.xml │ │ └── dialog_scale_anim_out.xml │ │ ├── layout │ │ └── public_dialog_load.xml │ │ └── values │ │ ├── strings.xml │ │ └── style.xml │ └── test │ └── java │ └── com │ └── mou │ └── basemvvm │ └── ExampleUnitTest.java ├── lib_common ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── fortunes │ │ └── commonsdk │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── fortunes │ │ │ └── commonsdk │ │ │ ├── bean │ │ │ └── UserInfoBean.kt │ │ │ ├── binds │ │ │ ├── NormalBinds.kt │ │ │ └── NormalExtens.kt │ │ │ ├── core │ │ │ ├── ActivityLifecycleCallbacksImpl.kt │ │ │ ├── ApplicationLifeCyclesImpl.kt │ │ │ ├── FragmentLifecycleCallbacksImpl.kt │ │ │ ├── GlobalConfiguration.kt │ │ │ └── RouterConstants.kt │ │ │ ├── inter │ │ │ └── MyTextChangeListner.kt │ │ │ ├── network │ │ │ ├── HttpException.kt │ │ │ ├── HttpStatusConstants.kt │ │ │ ├── HttpUrlConstants.kt │ │ │ ├── RxHttpExtens.kt │ │ │ ├── api │ │ │ │ ├── BaseApiService.kt │ │ │ │ └── BaseApiServiceManager.kt │ │ │ ├── bean │ │ │ │ └── BaseBean.kt │ │ │ └── provider │ │ │ │ ├── BaseNetProvider.kt │ │ │ │ └── NoHeaderNetProvider.kt │ │ │ ├── utils │ │ │ ├── HideKeyBoardUtil.kt │ │ │ ├── ImageUtils.kt │ │ │ ├── MD5.java │ │ │ ├── MyToast.kt │ │ │ ├── NavigationUtils.kt │ │ │ ├── RxBusUtils.kt │ │ │ ├── UniqueIdUtils.java │ │ │ ├── myStartActivity.kt │ │ │ ├── perimission │ │ │ │ └── EasyPermissionHelper.kt │ │ │ └── sp │ │ │ │ └── EasySharedPreferences.kt │ │ │ └── view │ │ │ ├── NoScrollViewPager.kt │ │ │ ├── filter │ │ │ ├── ChineseFilter.kt │ │ │ └── PhoneFilter.kt │ │ │ ├── photoviewer │ │ │ ├── BaseLazyFragment.kt │ │ │ ├── OnLongClickListener.kt │ │ │ ├── PhotoViewer.kt │ │ │ ├── PhotoViewerFragment.kt │ │ │ ├── PhotoViewerPagerAdapter.kt │ │ │ ├── Utils.kt │ │ │ ├── ViewPagerFixed.kt │ │ │ ├── WrapperView.kt │ │ │ └── photoview │ │ │ │ ├── Compat.java │ │ │ │ ├── CustomGestureDetector.java │ │ │ │ ├── OnGestureListener.java │ │ │ │ ├── OnMatrixChangedListener.java │ │ │ │ ├── OnOutsidePhotoTapListener.java │ │ │ │ ├── OnPhotoTapListener.java │ │ │ │ ├── OnScaleChangedListener.java │ │ │ │ ├── OnSingleFlingListener.java │ │ │ │ ├── OnViewDragListener.java │ │ │ │ ├── OnViewFingerUpListener.java │ │ │ │ ├── OnViewTapListener.java │ │ │ │ ├── PhotoView.java │ │ │ │ ├── PhotoViewAttacher.java │ │ │ │ └── Util.java │ │ │ ├── statusview │ │ │ └── MultipleStatusView.kt │ │ │ └── toolbar │ │ │ └── MyToolBarLayout.kt │ └── res │ │ ├── anim │ │ ├── public_bottomhide.xml │ │ ├── public_bottomshow.xml │ │ ├── public_centerhide.xml │ │ ├── public_centershow.xml │ │ ├── public_shake_anim.xml │ │ └── public_shake_cricle.xml │ │ ├── color │ │ └── public_text_gray_color.xml │ │ ├── drawable │ │ ├── public_login_btn_style.xml │ │ ├── public_no_selected_dot.xml │ │ └── public_selected_dot.xml │ │ ├── layout │ │ ├── public_activity_photoviewer.xml │ │ ├── public_dialog_list_item.xml │ │ ├── public_item_picture.xml │ │ ├── public_layout_holder.xml │ │ ├── public_layout_toolbar.xml │ │ ├── public_status_empty_view.xml │ │ ├── public_status_error_view.xml │ │ ├── public_status_loading_view.xml │ │ ├── public_status_no_network_view.xml │ │ └── public_title_bar.xml │ │ ├── mipmap-hdpi │ │ └── public_ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── public_ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── public_ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ ├── public_back_icon.png │ │ ├── public_close_icon.png │ │ ├── public_dialog_close.png │ │ ├── public_finger_dialog.png │ │ ├── public_ic_launcher.png │ │ ├── public_icon_arrow_right.png │ │ ├── public_icon_back.png │ │ ├── public_icon_call.png │ │ ├── public_icon_close.png │ │ ├── public_icon_complete.png │ │ ├── public_icon_fail.png │ │ ├── public_icon_location.png │ │ ├── public_icon_return.png │ │ ├── public_icon_search.png │ │ ├── public_icon_underway.png │ │ ├── public_icon_wait.png │ │ ├── public_operator_close.png │ │ ├── public_status_empty.png │ │ └── public_status_network.png │ │ ├── mipmap-xxxhdpi │ │ └── public_ic_launcher.png │ │ ├── values │ │ ├── attr.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── ids.xml │ │ ├── strings.xml │ │ ├── styles.xml │ │ └── view_style.xml │ │ └── xml │ │ ├── file_paths_public.xml │ │ └── network_security_config.xml │ └── test │ └── java │ └── com │ └── fortunes │ └── commonsdk │ └── ExampleUnitTest.java ├── module_login ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── mou │ │ └── login │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── debug │ │ └── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── mou │ │ │ └── login │ │ │ ├── core │ │ │ ├── App.kt │ │ │ └── GlobalConfiguration.kt │ │ │ ├── di │ │ │ ├── component │ │ │ │ └── AppComponent.kt │ │ │ └── module │ │ │ │ ├── ActivityModule.kt │ │ │ │ ├── AppModule.kt │ │ │ │ ├── FragmentModule.kt │ │ │ │ └── ViewModelModule.kt │ │ │ └── mvvm │ │ │ ├── model │ │ │ ├── data │ │ │ │ └── LoginBean.kt │ │ │ └── repository │ │ │ │ └── ApiService.kt │ │ │ ├── view │ │ │ └── LoginActivity.kt │ │ │ └── viewmodel │ │ │ └── LoginViewModel.kt │ ├── release │ │ └── AndroidManifest.xml │ └── res │ │ ├── layout │ │ └── login_activity_login.xml │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── mou │ └── login │ └── ExampleUnitTest.java ├── module_mine ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── mou │ │ └── mine │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── debug │ │ └── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── mou │ │ │ └── mine │ │ │ ├── core │ │ │ ├── App.kt │ │ │ └── GlobalConfiguration.kt │ │ │ ├── di │ │ │ ├── component │ │ │ │ └── AppComponent.kt │ │ │ └── module │ │ │ │ ├── ActivityModule.kt │ │ │ │ ├── AppModule.kt │ │ │ │ ├── FragmentModule.kt │ │ │ │ └── ViewModelModule.kt │ │ │ └── mvvm │ │ │ ├── model │ │ │ ├── data │ │ │ │ └── mineBean.kt │ │ │ └── repository │ │ │ │ └── ApiService.kt │ │ │ ├── view │ │ │ └── MineActivity.kt │ │ │ └── viewmodel │ │ │ └── MineViewModel.kt │ ├── release │ │ └── AndroidManifest.xml │ └── res │ │ ├── layout │ │ ├── mine_activity_mine.xml │ │ └── mine_my_item_order.xml │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── mou │ └── mine │ └── ExampleUnitTest.java ├── mvvm.jks └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | /.idea 15 | -------------------------------------------------------------------------------- /MvvmModulePatternSample.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouxuefei/MvvmModulePatternSample/fcec4d40e882dbd209bb6bc59ba84f3aee1f71ce/MvvmModulePatternSample.zip -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ![在这里插入图片描述](./images/logo.jpg) 4 | ##### 主要技术点 5 | 6 | 1. [**Kotlin**](https://www.kotlincn.net/) 7 | 2. [**MVVM**](https://github.com/Dawish/GoogleArchitectureDemo) 8 | 3. [**Databinding**](http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0811/3290.html) 9 | 4. [**Arouter路由**](https://github.com/alibaba/ARouter) 10 | 5. [**Dagger依赖注入**](https://dagger.dev/) 11 | 6. [**Rxjava**](https://github.com/ReactiveX/RxJava) 12 | 7. [**Retrofit**](http://square.github.io/retrofit/) 13 | 14 | #### 项目介绍 15 | [kotlin版本组件化+mvvm项目架构](https://blog.csdn.net/villa_mou/article/details/91862507 "标题") 16 | 17 | 18 | #### 分支 19 | 20 | * master=>有dagger的分支 21 | * noDagger=>去掉dagger的分支 22 | * noDataBinding=>去掉DataBinding和dagger的分支 23 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply from: "../config_build.gradle" 3 | 4 | android { 5 | defaultConfig { 6 | applicationId "com.mou.mvvmmodule" 7 | } 8 | 9 | flavorDimensions "verison" 10 | productFlavors { 11 | //打包assembleVersionDevDebug 12 | versionDev{ 13 | dimension "verison" 14 | } 15 | //gradlew clean assembleVersionTestDebug 16 | versionTest { 17 | dimension "verison" 18 | } 19 | // gradlew clean assembleVersionOnlineRelease 20 | versionOnline{ 21 | dimension "verison" 22 | } 23 | } 24 | 25 | buildTypes { 26 | release { 27 | minifyEnabled false 28 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 29 | } 30 | } 31 | } 32 | 33 | dependencies { 34 | if (!isBuildModule.toBoolean()) { 35 | implementation project(':module_login') 36 | implementation project(':module_mine') 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/mvvm.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mouxuefei/MvvmModulePatternSample/fcec4d40e882dbd209bb6bc59ba84f3aee1f71ce/app/mvvm.jks -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/mou/mvvmmodule/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.mou.mvvmmodule 2 | 3 | import android.support.test.InstrumentationRegistry 4 | import android.support.test.runner.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getTargetContext() 22 | assertEquals("com.mou.mvvmmodule", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/mou/mvvmmodule/core/App.kt: -------------------------------------------------------------------------------- 1 | package com.mou.mvvmmodule.core 2 | 3 | import com.mou.basemvvm.base.BaseApplication 4 | import com.mou.mvvmmodule.di.component.DaggerAppComponent 5 | 6 | 7 | class App : BaseApplication() { 8 | override fun injectComponent() { 9 | DaggerAppComponent.builder().application(this).build().inject(this) 10 | } 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mou/mvvmmodule/di/component/AppComponent.kt: -------------------------------------------------------------------------------- 1 | package com.mou.mvvmmodule.di.component 2 | 3 | import android.app.Application 4 | import com.mou.basemvvm.android.FactoryModule 5 | import com.mou.mvvmmodule.core.App 6 | import com.mou.mvvmmodule.di.module.AppModule 7 | import dagger.BindsInstance 8 | import dagger.Component 9 | import dagger.android.support.AndroidSupportInjectionModule 10 | import javax.inject.Singleton 11 | 12 | 13 | @Singleton 14 | @Component( 15 | modules = [ 16 | AndroidSupportInjectionModule::class, 17 | FactoryModule::class, 18 | AppModule::class,//app模块 19 | com.mou.login.di.module.AppModule::class,//添加登录模块组件 20 | com.mou.mine.di.module.AppModule::class//添加个人中心模块 21 | ] 22 | ) 23 | interface AppComponent { 24 | @Component.Builder 25 | interface Builder { 26 | @BindsInstance 27 | fun application(application: Application): Builder 28 | 29 | fun build(): AppComponent 30 | } 31 | 32 | fun inject(application: App) 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mou/mvvmmodule/di/module/ActivityModule.kt: -------------------------------------------------------------------------------- 1 | package com.mou.mvvmmodule.di.module 2 | 3 | import com.mou.mvvmmodule.di.mvvm.view.MainActivity 4 | import dagger.Module 5 | import dagger.android.ContributesAndroidInjector 6 | 7 | 8 | 9 | @Module 10 | abstract class ActivityModule { 11 | @ContributesAndroidInjector 12 | abstract fun contributeMainActivity(): MainActivity 13 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mou/mvvmmodule/di/module/AppModule.kt: -------------------------------------------------------------------------------- 1 | package com.mou.mvvmmodule.di.module 2 | 3 | import android.app.Application 4 | import com.fortunes.commonsdk.network.HttpUrlConstants 5 | import com.fortunes.commonsdk.network.provider.BaseNetProvider 6 | import com.mou.basemvvm.helper.network.NetMgr 7 | import com.mou.mvvmmodule.di.mvvm.model.ApiService 8 | import dagger.Module 9 | import dagger.Provides 10 | import javax.inject.Singleton 11 | 12 | 13 | 14 | @Module(includes = [ 15 | ActivityModule::class, 16 | ViewModelModule::class]) 17 | class AppModule { 18 | @Provides 19 | @Singleton 20 | fun provideService(application: Application) = NetMgr.getRetrofit(HttpUrlConstants.getBaseUrl(), 21 | BaseNetProvider(application) 22 | ).create( 23 | ApiService::class.java)!! 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mou/mvvmmodule/di/module/ViewModelModule.kt: -------------------------------------------------------------------------------- 1 | package com.mou.mvvmmodule.di.module 2 | 3 | import androidx.lifecycle.ViewModel 4 | import com.mou.basemvvm.android.ViewModelKey 5 | import com.mou.mvvmmodule.di.mvvm.viewmodel.MainViewModel 6 | import dagger.Binds 7 | import dagger.Module 8 | import dagger.multibindings.IntoMap 9 | 10 | 11 | 12 | @Module 13 | abstract class ViewModelModule { 14 | 15 | @Binds 16 | @IntoMap 17 | @ViewModelKey(MainViewModel::class) 18 | abstract fun bindMainViewModel(viewModel: MainViewModel): ViewModel 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mou/mvvmmodule/di/mvvm/bean/ArticleBean.kt: -------------------------------------------------------------------------------- 1 | package com.mou.mvvmmodule.di.mvvm.bean 2 | 3 | /** 4 | * @FileName: ArticleBean.java 5 | * @author: villa_mou 6 | * @date: 04-14:43 7 | * @version V1.0 <描述当前版本功能> 8 | * @desc 9 | */ 10 | 11 | 12 | data class ArticleBean( 13 | val curPage: Int, 14 | val datas: List, 15 | val offset: Int, 16 | val over: Boolean, 17 | val pageCount: Int, 18 | val size: Int, 19 | val total: Int 20 | ) 21 | 22 | data class ArticleData( 23 | val apkLink: String, 24 | val author: String, 25 | val chapterId: Int, 26 | val chapterName: String, 27 | val collect: Boolean, 28 | val courseId: Int, 29 | val desc: String, 30 | val envelopePic: String, 31 | val fresh: Boolean, 32 | val id: Int, 33 | val link: String, 34 | val niceDate: String, 35 | val origin: String, 36 | val prefix: String, 37 | val projectLink: String, 38 | val publishTime: Long, 39 | val superChapterId: Int, 40 | val superChapterName: String, 41 | val tags: List, 42 | val title: String, 43 | val type: Int, 44 | val userId: Int, 45 | val visible: Int, 46 | val zan: Int 47 | ) 48 | 49 | data class Tag( 50 | val name: String, 51 | val url: String 52 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/mou/mvvmmodule/di/mvvm/model/ApiService.kt: -------------------------------------------------------------------------------- 1 | package com.mou.mvvmmodule.di.mvvm.model 2 | 3 | import com.fortunes.commonsdk.network.bean.BaseBean 4 | import com.mou.mvvmmodule.di.mvvm.bean.ArticleBean 5 | import io.reactivex.Single 6 | import retrofit2.http.GET 7 | 8 | interface ApiService { 9 | 10 | 11 | /** 12 | * 判断是否上线 13 | */ 14 | @GET("article/list/1/json") 15 | fun getArticle(): Single> 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/mou/mvvmmodule/di/mvvm/view/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.mou.mvvmmodule.di.mvvm.view 2 | 3 | import com.alibaba.android.arouter.facade.annotation.Route 4 | import com.fortunes.commonsdk.core.RouterConstants 5 | import com.fortunes.commonsdk.network.onHttpSubscribeNoToast 6 | import com.fortunes.commonsdk.utils.NavigationUtils 7 | import com.mou.basemvvm.base.BaseActivity 8 | import com.mou.basemvvm.helper.extens.bindDialogOrLifeCycle 9 | import com.mou.basemvvm.helper.extens.toast 10 | import com.mou.mvvmmodule.R 11 | import com.mou.mvvmmodule.databinding.ActivityMainBinding 12 | import com.mou.mvvmmodule.di.mvvm.viewmodel.MainViewModel 13 | import dagger.android.DispatchingAndroidInjector 14 | import dagger.android.support.HasSupportFragmentInjector 15 | import kotlinx.android.synthetic.main.activity_main.* 16 | import javax.inject.Inject 17 | 18 | 19 | @Route(path = RouterConstants.MAIN_ACTIVITY) 20 | class MainActivity : BaseActivity() { 21 | override fun getLayoutId() = R.layout.activity_main 22 | private val mViewModel by lazy { 23 | createVM() 24 | } 25 | 26 | override fun initView() { 27 | //设置viewModel 28 | mBinding.apply { 29 | vm=mViewModel 30 | } 31 | btn.setOnClickListener { 32 | mViewModel 33 | .getArticle() 34 | .bindDialogOrLifeCycle(this) 35 | .onHttpSubscribeNoToast(this) { 36 | toast("成功") 37 | } 38 | } 39 | btn_login.setOnClickListener { 40 | NavigationUtils.goLoginActivity() 41 | } 42 | 43 | btn_mine.setOnClickListener { 44 | NavigationUtils.goMineActivity() 45 | } 46 | } 47 | 48 | override fun initData() { 49 | } 50 | } 51 | 52 | -------------------------------------------------------------------------------- /app/src/main/java/com/mou/mvvmmodule/di/mvvm/viewmodel/MainViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.mou.mvvmmodule.di.mvvm.viewmodel 2 | 3 | import com.fortunes.commonsdk.network.bean.BaseBean 4 | import com.mou.basemvvm.base.BaseViewModel 5 | import com.mou.basemvvm.helper.extens.ObservableItemField 6 | import com.mou.basemvvm.helper.extens.async 7 | import com.mou.mvvmmodule.di.mvvm.bean.ArticleBean 8 | import com.mou.mvvmmodule.di.mvvm.model.ApiService 9 | import io.reactivex.Single 10 | import timber.log.Timber 11 | import javax.inject.Inject 12 | 13 | 14 | class MainViewModel @Inject constructor(private val apiService: ApiService) : BaseViewModel() { 15 | val chapterName = ObservableItemField() 16 | val link = ObservableItemField() 17 | 18 | fun getArticle(): Single> { 19 | return apiService 20 | .getArticle() 21 | .async() 22 | .doOnSuccess { 23 | chapterName.set(it.data.datas[0].chapterName) 24 | link.set(it.data.datas[0].link) 25 | } 26 | .doOnError { 27 | Timber.d("doOnError") 28 | } 29 | } 30 | } 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 13 | 14 |