├── .gitignore ├── .idea ├── gradle.xml ├── misc.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── rdc │ │ └── bms │ │ └── q_comic │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ └── litepal.xml │ ├── java │ │ └── com │ │ │ └── rdc │ │ │ └── bms │ │ │ └── q_comic │ │ │ ├── app │ │ │ └── App.java │ │ │ ├── base │ │ │ ├── BaseAbsFragment.java │ │ │ ├── BaseActivity.java │ │ │ ├── BaseBookShelfCell.java │ │ │ ├── BaseBookShelfTabFragment.java │ │ │ ├── BaseBookShelfVO.java │ │ │ ├── BaseDTO.java │ │ │ ├── BaseFragment.java │ │ │ ├── BaseLazyAbsFragment.java │ │ │ ├── BaseLazyFragment.java │ │ │ └── BasePresenter.java │ │ │ ├── bean │ │ │ ├── BannerBean.java │ │ │ ├── BookBean.java │ │ │ ├── BookBillBean.java │ │ │ ├── BookDetailVO.java │ │ │ ├── BookInfoBean.java │ │ │ ├── ChapterBean.java │ │ │ ├── ComicBean.java │ │ │ ├── HotKeyBean.java │ │ │ ├── ItemBean.java │ │ │ ├── RankBean.java │ │ │ ├── SearchHistoryBean.java │ │ │ ├── TypeBean.java │ │ │ └── rv_cell │ │ │ │ ├── BannerCell.java │ │ │ │ ├── BookBillCell.java │ │ │ │ ├── BookBillDetailCell.java │ │ │ │ ├── BookCell.java │ │ │ │ ├── BookInfoCell.java │ │ │ │ ├── BookListCell.java │ │ │ │ ├── ChapterNumCell.java │ │ │ │ ├── CollectCell.java │ │ │ │ ├── ComicCell.java │ │ │ │ ├── DirCell.java │ │ │ │ ├── FanCell.java │ │ │ │ ├── HistoryCell.java │ │ │ │ ├── ItemCell.java │ │ │ │ ├── MyBookBillCell.java │ │ │ │ ├── RankCell.java │ │ │ │ ├── SearchHistoryCell.java │ │ │ │ ├── StatisticCell.java │ │ │ │ └── TypeBeanCell.java │ │ │ ├── config │ │ │ ├── Constant.java │ │ │ └── ItemType.java │ │ │ ├── listener │ │ │ ├── ILifeCycle.java │ │ │ ├── OnComicClickListener.java │ │ │ ├── OnEditListener.java │ │ │ └── OnScrollYChangeForAlphaListener.java │ │ │ ├── mvp │ │ │ ├── contract │ │ │ │ ├── IBookBillDetailContract.java │ │ │ │ ├── IBookDetailContract.java │ │ │ │ ├── IBookListContract.java │ │ │ │ ├── ICollectContract.java │ │ │ │ ├── IComicContract.java │ │ │ │ ├── IHistoryContract.java │ │ │ │ ├── IHomeContract.java │ │ │ │ ├── IMainContract.java │ │ │ │ ├── IMyBookBillContract.java │ │ │ │ ├── IRankContract.java │ │ │ │ ├── ISearchContract.java │ │ │ │ ├── ISearchResultContract.java │ │ │ │ └── ITypeContract.java │ │ │ ├── model │ │ │ │ ├── BookBillModel.java │ │ │ │ ├── BookDetailModel.java │ │ │ │ ├── BookModel.java │ │ │ │ ├── CollectModel.java │ │ │ │ ├── ComicModel.java │ │ │ │ ├── FootPrintModel.java │ │ │ │ ├── SearchModel.java │ │ │ │ ├── SearchResultModel.java │ │ │ │ ├── db │ │ │ │ │ ├── CollectBean.java │ │ │ │ │ └── HistoryBean.java │ │ │ │ ├── dto │ │ │ │ │ ├── BookBillDetailContainerDTO.java │ │ │ │ │ ├── BookBillDetailHeadDTO.java │ │ │ │ │ ├── BookListDTO.java │ │ │ │ │ ├── ComicDTO.java │ │ │ │ │ ├── ComicInfoDTO.java │ │ │ │ │ ├── HomePageDTO.java │ │ │ │ │ ├── HotKeyDTO.java │ │ │ │ │ ├── PageDTO.java │ │ │ │ │ ├── RankDTO.java │ │ │ │ │ └── SearchDTO.java │ │ │ │ ├── service │ │ │ │ │ ├── BookBillService.java │ │ │ │ │ ├── ComicService.java │ │ │ │ │ └── SearchService.java │ │ │ │ └── vo │ │ │ │ │ ├── BookBillDetailVO.java │ │ │ │ │ ├── BookTabDetailVO.java │ │ │ │ │ ├── BookTabDirVO.java │ │ │ │ │ ├── BookTabSupportVO.java │ │ │ │ │ ├── BookTopInfoVO.java │ │ │ │ │ ├── CollectVO.java │ │ │ │ │ ├── HistoryVO.java │ │ │ │ │ └── MyBookBillVO.java │ │ │ ├── presenter │ │ │ │ ├── BookBillDetailPresenter.java │ │ │ │ ├── BookBillPresenter.java │ │ │ │ ├── BookDetailPresenter.java │ │ │ │ ├── CollectPresenter.java │ │ │ │ ├── ComicPresenter.java │ │ │ │ ├── HistoryPresenter.java │ │ │ │ ├── HomePresenter.java │ │ │ │ ├── MainPresenter.java │ │ │ │ ├── MyBookBillPresenter.java │ │ │ │ ├── RankPresenter.java │ │ │ │ ├── SearchPresenter.java │ │ │ │ ├── SearchResultPresenter.java │ │ │ │ └── TypePresenter.java │ │ │ └── view │ │ │ │ ├── activity │ │ │ │ ├── BookBillActivity.java │ │ │ │ ├── BookBillDetailActivity.java │ │ │ │ ├── BookDetailActivity.java │ │ │ │ ├── ComicActivity.java │ │ │ │ ├── LaunchActivity.java │ │ │ │ ├── MainActivity.java │ │ │ │ ├── SearchActivity.java │ │ │ │ └── SearchResultActivity.java │ │ │ │ └── fragment │ │ │ │ ├── BookBillFragment.java │ │ │ │ ├── BookDetail │ │ │ │ ├── TabDetailFragment.java │ │ │ │ ├── TabDirFragment.java │ │ │ │ └── TabSupportFragment.java │ │ │ │ ├── BookShelf │ │ │ │ ├── BookShelfFragment.java │ │ │ │ ├── CollectFragment.java │ │ │ │ ├── HistoryFragment.java │ │ │ │ └── MyBookBillFragment.java │ │ │ │ ├── HomeFragment.java │ │ │ │ ├── MineFragment.java │ │ │ │ ├── RankFragment.java │ │ │ │ ├── SearchResultFragment.java │ │ │ │ ├── TypeContainerFragment.java │ │ │ │ └── TypeFragment.java │ │ │ ├── util │ │ │ ├── ActivityCollectorUtil.java │ │ │ ├── AnimateUtil.java │ │ │ ├── GlideUtil.java │ │ │ ├── GsonUtil.java │ │ │ ├── ImageUtil.java │ │ │ ├── JsoupUtil.java │ │ │ ├── PhotoUtil.java │ │ │ ├── RetrofitUtil.java │ │ │ ├── ScreenUtil.java │ │ │ ├── StartActUtil.java │ │ │ ├── diffutil │ │ │ │ ├── BookBillDiffUtil.java │ │ │ │ ├── ChapterDiffUtil.java │ │ │ │ ├── CollectDiffUtil.java │ │ │ │ ├── ComicDiffUtil.java │ │ │ │ └── HistoryDiffUtil.java │ │ │ └── fileprovider.java │ │ │ └── widget │ │ │ ├── ListenOffsetYNestedScrollView.java │ │ │ ├── NoScrollViewPager.java │ │ │ └── ViewPagerForScrollView.java │ └── res │ │ ├── color │ │ └── color_state_menu_navi.xml │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable-xhdpi │ │ ├── bg_hot_key_blue.xml │ │ ├── bg_hot_key_light_green.xml │ │ ├── bg_hot_key_orange.xml │ │ ├── bg_hot_key_purple.xml │ │ ├── bg_support_statistics_green.xml │ │ ├── bg_support_statistics_orange.xml │ │ ├── ic_ach_award.png │ │ ├── ic_ach_gift.png │ │ ├── ic_ach_gradle.png │ │ ├── ic_ach_month.png │ │ ├── ic_ach_recommend.png │ │ ├── ic_ach_share.png │ │ ├── ic_launcher.png │ │ ├── ic_read_brightness_b.png │ │ ├── ic_read_catalog_ic.png │ │ ├── ic_read_catalog_order.png │ │ ├── ic_read_catalog_reverse.png │ │ ├── ic_read_definition_high.png │ │ ├── ic_read_definition_low.png │ │ ├── ic_read_definition_middle.png │ │ ├── ic_read_set.png │ │ ├── ic_read_start.png │ │ ├── ic_read_stop.png │ │ ├── icon_chapter_read.png │ │ ├── pic_load_error.png │ │ ├── svg_arrow_bottom.png │ │ ├── svg_arrow_left.png │ │ ├── svg_arrow_right.png │ │ ├── svg_arrow_top.png │ │ ├── svg_author_dk.png │ │ ├── svg_author_xr.png │ │ ├── svg_blue_share.png │ │ ├── svg_clock.png │ │ ├── svg_delete.png │ │ ├── svg_error.png │ │ ├── svg_fire_grey.png │ │ ├── svg_fire_red.png │ │ ├── svg_fire_white.png │ │ ├── svg_money_grey.png │ │ ├── svg_money_red.png │ │ ├── svg_money_white.png │ │ ├── svg_orange_comment.png │ │ ├── svg_red_book_count.png │ │ ├── svg_red_like_normal.png │ │ ├── svg_red_like_pressed.png │ │ ├── svg_red_nav_bar_love.png │ │ ├── svg_red_normal_like.png │ │ ├── svg_red_point.png │ │ ├── svg_red_pressed_like.png │ │ ├── svg_red_select.png │ │ ├── svg_red_work.png │ │ ├── svg_tab_bar_find.png │ │ ├── svg_tab_bar_find_hl.png │ │ ├── svg_tab_bar_homepage.png │ │ ├── svg_tab_bar_kind.png │ │ ├── svg_tab_bar_kind_hl.png │ │ ├── svg_tab_bar_main_hl.png │ │ ├── svg_tab_bar_mine.png │ │ ├── svg_tab_bar_mine_hl.png │ │ ├── svg_ticket_grey.png │ │ ├── svg_ticket_red.png │ │ ├── svg_ticket_white.png │ │ ├── svg_white_nav_bar_back.png │ │ ├── svg_white_nav_bar_love.png │ │ ├── svg_white_normal_like.png │ │ ├── svg_white_pressed_like.png │ │ └── svg_white_select.png │ │ ├── drawable │ │ ├── bg_black_transparent.xml │ │ ├── bg_book_bill_detail_head.xml │ │ ├── bg_btn_chapter.xml │ │ ├── bg_btn_offline_cache.xml │ │ ├── bg_btn_start_read.xml │ │ ├── bg_edittext_search.xml │ │ ├── bg_hot_key_dark_green.xml │ │ ├── bg_hot_key_red.xml │ │ ├── bg_oval_stroke.xml │ │ ├── bg_support_statistics_red.xml │ │ ├── bg_tag_black.xml │ │ ├── black_oval_bg.xml │ │ ├── ic_launcher_background.xml │ │ ├── ic_reader_error.png │ │ ├── selector_tab_bookshelf.xml │ │ ├── selector_tab_home.xml │ │ ├── selector_tab_kind.xml │ │ └── selector_tab_mine.xml │ │ ├── layout │ │ ├── activity_book_bill.xml │ │ ├── activity_book_bill_detail.xml │ │ ├── activity_book_detail.xml │ │ ├── activity_comic.xml │ │ ├── activity_launch.xml │ │ ├── activity_main.xml │ │ ├── activity_search.xml │ │ ├── activity_search_result.xml │ │ ├── cell_banner.xml │ │ ├── cell_book_bill.xml │ │ ├── cell_book_bill_detaill.xml │ │ ├── cell_book_collect.xml │ │ ├── cell_book_history.xml │ │ ├── cell_book_home.xml │ │ ├── cell_book_info.xml │ │ ├── cell_book_list.xml │ │ ├── cell_chapter_num.xml │ │ ├── cell_comic.xml │ │ ├── cell_dir.xml │ │ ├── cell_item.xml │ │ ├── cell_rank.xml │ │ ├── cell_search_history.xml │ │ ├── cell_statistic.xml │ │ ├── cell_support_fan.xml │ │ ├── cell_support_fan_top3.xml │ │ ├── cell_type.xml │ │ ├── fragment_bookshelf.xml │ │ ├── fragment_home.xml │ │ ├── fragment_mine.xml │ │ ├── fragment_tab_detail.xml │ │ ├── fragment_tab_dir.xml │ │ ├── fragment_tab_support.xml │ │ ├── fragment_type.xml │ │ ├── fragment_type_detail.xml │ │ ├── hotkey_tagflowlayout.xml │ │ ├── layout_check.xml │ │ ├── layout_comic_list.xml │ │ ├── layout_select.xml │ │ ├── layout_top.xml │ │ ├── loading_layout.xml │ │ └── tag_tagflowlayout.xml │ │ ├── menu │ │ └── main_bottom_menus.xml │ │ ├── mipmap-hdpi │ │ ├── icon_new.png │ │ ├── icon_ranking.png │ │ ├── point_0.png │ │ ├── point_1.png │ │ └── svg_red_nav_bar_back.png │ │ ├── mipmap-mdpi │ │ ├── ic_logo.png │ │ ├── pic_main_boy.png │ │ ├── pic_main_girl.png │ │ ├── svg_pic_list_dream.png │ │ ├── svg_pic_list_fast.png │ │ ├── svg_pic_list_fire.png │ │ ├── svg_pic_list_jd.png │ │ ├── svg_pic_list_love.png │ │ ├── svg_pic_list_new.png │ │ ├── svg_red_nav_bar_search.png │ │ └── svg_white_nav_bar_search.png │ │ └── values │ │ ├── colors.xml │ │ ├── dimen.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── rdc │ └── bms │ └── q_comic │ └── ExampleUnitTest.java ├── build.gradle ├── easy_rv_adapter ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── rdc │ │ └── bms │ │ └── easy_rv_adapter │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── rdc │ │ │ └── bms │ │ │ └── easy_rv_adapter │ │ │ ├── OnClickViewRvListener.java │ │ │ ├── Utils.java │ │ │ ├── base │ │ │ ├── BaseRvAdapter.java │ │ │ ├── BaseRvCell.java │ │ │ ├── BaseRvStateCell.java │ │ │ ├── BaseRvViewHolder.java │ │ │ ├── Cell.java │ │ │ └── RvSimpleAdapter.java │ │ │ ├── cell │ │ │ ├── EmptyCell.java │ │ │ ├── ErrorCell.java │ │ │ ├── LoadMoreCell.java │ │ │ └── LoadingCell.java │ │ │ ├── config │ │ │ └── ItemType.java │ │ │ └── fragment │ │ │ └── AbsFragment.java │ └── res │ │ ├── layout │ │ ├── rv_base_fragment_layout.xml │ │ ├── rv_empty_layout.xml │ │ ├── rv_error_layout.xml │ │ ├── rv_load_more_layout.xml │ │ ├── rv_loading_layout.xml │ │ └── rv_state_layout.xml │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── rdc │ └── bms │ └── easy_rv_adapter │ └── ExampleUnitTest.java ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches/build_file_checksums.ser 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | .DS_Store 9 | /build 10 | /captures 11 | .externalNativeBuild 12 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Q_Comic 2 | 仿知音漫客APP,目前已经完成了基本浏览、搜索、收藏等基本功能。 3 | # 界面 4 | ![](https://upload-images.jianshu.io/upload_images/5643593-a620c6dbd0d17e19.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 5 | ![](https://upload-images.jianshu.io/upload_images/5643593-ee22c0ae87bb2cb8.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 6 | ![未命名_meitu_3.jpg](https://upload-images.jianshu.io/upload_images/5643593-87c20c581fbedec2.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 7 | ![未命名_meitu_2.jpg](https://upload-images.jianshu.io/upload_images/5643593-bbcc694a63c720ea.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 8 | ![未命名_meitu_4.jpg](https://upload-images.jianshu.io/upload_images/5643593-7772dce8fdaf87ef.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 9 | # 结束 10 | 本应用所有数据均来自网络,未经允许,请勿用于商业用途。 11 | 12 | 如有侵权,请联系作者删除! 13 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 27 5 | defaultConfig { 6 | applicationId "com.rdc.bms.q_comic" 7 | minSdkVersion 21 8 | targetSdkVersion 27 9 | versionCode 1 10 | versionName "1.0" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation fileTree(dir: 'libs', include: ['*.jar']) 23 | implementation project(':easy_rv_adapter') 24 | implementation 'com.youth.banner:banner:1.4.10' 25 | implementation 'com.hyman:flowlayout-lib:1.1.2' 26 | implementation 'com.android.support:appcompat-v7:27.1.1' 27 | implementation 'com.android.support.constraint:constraint-layout:1.1.3' 28 | implementation 'com.android.support:cardview-v7:27.1.1' 29 | implementation 'com.android.support:design:27.1.1' 30 | implementation 'com.jakewharton:butterknife:8.8.1' 31 | implementation 'com.android.support:support-v4:27.1.1' 32 | annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' 33 | implementation 'com.google.code.gson:gson:2.8.2' 34 | 35 | implementation 'de.hdodenhof:circleimageview:3.0.0' 36 | implementation 'org.jsoup:jsoup:1.9.2' 37 | implementation 'org.litepal.android:java:3.0.0' 38 | implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.5.1' 39 | implementation 'jp.wasabeef:glide-transformations:3.0.1' 40 | 41 | implementation "io.reactivex.rxjava2:rxjava:2.2.5" 42 | implementation 'io.reactivex.rxjava2:rxandroid:2.1.0' 43 | implementation 'com.squareup.retrofit2:retrofit:2.5.0' 44 | implementation 'com.squareup.retrofit2:converter-gson:2.3.0' 45 | implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0' 46 | implementation 'com.github.LinYaoTian:LeavesLoading:1.0.2' 47 | 48 | implementation 'com.android.support:recyclerview-v7:27.1.1' 49 | implementation 'com.github.bumptech.glide:glide:4.8.0' 50 | annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0' 51 | testImplementation 'junit:junit:4.12' 52 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 53 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 54 | } 55 | -------------------------------------------------------------------------------- /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/rdc/bms/q_comic/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.rdc.bms.q_comic", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/assets/litepal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | 22 | 23 | 24 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 53 | 54 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/app/App.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.app; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.app.Application; 5 | import android.content.Context; 6 | 7 | import org.litepal.LitePal; 8 | 9 | public class App extends Application { 10 | 11 | @SuppressLint("StaticFieldLeak") 12 | private static Context sContext; 13 | 14 | @Override 15 | public void onCreate() { 16 | super.onCreate(); 17 | LitePal.initialize(this); 18 | LitePal.getDatabase(); 19 | sContext = getApplicationContext(); 20 | } 21 | 22 | public static Context getContext() { 23 | return sContext; 24 | } 25 | 26 | 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/base/BaseAbsFragment.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.base; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.NonNull; 5 | import android.support.annotation.Nullable; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.Toast; 10 | 11 | import com.rdc.bms.easy_rv_adapter.fragment.AbsFragment; 12 | 13 | public abstract class BaseAbsFragment

extends AbsFragment { 14 | 15 | protected P mPresenter; 16 | 17 | protected abstract P getInstance(); 18 | 19 | protected void showToast(String msg){ 20 | Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT).show(); 21 | } 22 | 23 | @Nullable 24 | @Override 25 | public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 26 | mPresenter = getInstance(); 27 | if (mPresenter != null){ 28 | mPresenter.attachView(this); 29 | } 30 | return super.onCreateView(inflater, container, savedInstanceState); 31 | } 32 | 33 | @Override 34 | public void onDestroyView() { 35 | super.onDestroyView(); 36 | if (mPresenter != null){ 37 | mPresenter.detachView(); 38 | } 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/base/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.base; 2 | 3 | import android.os.Build; 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.view.View; 8 | import android.widget.EditText; 9 | import android.widget.Toast; 10 | 11 | import com.rdc.bms.q_comic.util.ActivityCollectorUtil; 12 | 13 | import butterknife.ButterKnife; 14 | 15 | 16 | public abstract class BaseActivity extends AppCompatActivity{ 17 | protected String TAG; 18 | protected T mPresenter; 19 | 20 | @Override 21 | protected void onCreate(@Nullable Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | setStatusTextColor(true); 24 | TAG = this.getClass().getSimpleName(); 25 | ActivityCollectorUtil.addActivity(this); 26 | setContentView(setLayoutResID()); 27 | ButterKnife.bind(this); 28 | mPresenter = getInstance(); 29 | if (mPresenter !=null){ 30 | mPresenter.attachView(this); 31 | } 32 | initData(savedInstanceState); 33 | initView(); 34 | initListener(); 35 | } 36 | 37 | /** 38 | * 设置状态栏字体颜色 39 | * @param isDark 40 | */ 41 | protected void setStatusTextColor(boolean isDark){ 42 | if (isDark){ 43 | //黑色字体 44 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 45 | getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); 46 | } 47 | }else { 48 | //白色字体 49 | getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); 50 | } 51 | } 52 | 53 | @Override 54 | protected void onDestroy() { 55 | if (mPresenter != null) { 56 | mPresenter.detachView(); 57 | } 58 | ActivityCollectorUtil.removeActivity(this); 59 | super.onDestroy(); 60 | } 61 | 62 | protected abstract int setLayoutResID(); 63 | 64 | protected abstract T getInstance(); 65 | 66 | protected abstract void initData(Bundle savedInstanceState); 67 | 68 | protected abstract void initView(); 69 | 70 | protected abstract void initListener(); 71 | 72 | public void showToast(String text) { 73 | Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); 74 | } 75 | 76 | protected static String getString(EditText et) { 77 | return et.getText().toString(); 78 | } 79 | 80 | 81 | 82 | } 83 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/base/BaseBookShelfVO.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.base; 2 | 3 | public class BaseBookShelfVO { 4 | public boolean isSelect; 5 | public boolean isStartSelect; 6 | 7 | public boolean isSelect() { 8 | return isSelect; 9 | } 10 | 11 | public void setSelect(boolean select) { 12 | isSelect = select; 13 | } 14 | 15 | public boolean isStartSelect() { 16 | return isStartSelect; 17 | } 18 | 19 | public void setStartSelect(boolean startSelect) { 20 | isStartSelect = startSelect; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/base/BaseDTO.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.base; 2 | 3 | public abstract class BaseDTO { 4 | 5 | protected int code; 6 | 7 | protected String msg; 8 | 9 | public abstract E transform(); 10 | 11 | public final boolean isSuccess(){ 12 | return code == 0; 13 | } 14 | 15 | public int getCode() { 16 | return code; 17 | } 18 | 19 | public void setCode(int code) { 20 | this.code = code; 21 | } 22 | 23 | public String getMsg() { 24 | return msg == null ? "" : msg; 25 | } 26 | 27 | public void setMsg(String msg) { 28 | this.msg = msg == null ? "" : msg; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/base/BasePresenter.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.base; 2 | 3 | 4 | public class BasePresenter{ 5 | 6 | public final String TAG = "LYT"; 7 | 8 | private V view; 9 | 10 | public void attachView(V v){ 11 | view = v; 12 | } 13 | 14 | public void detachView(){ 15 | view = null; 16 | } 17 | 18 | public boolean isAttachView(){ 19 | return view != null; 20 | } 21 | 22 | public V getMVPView(){ 23 | return view; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/bean/BannerBean.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.bean; 2 | 3 | /** 4 | * 首页轮播图实体 5 | */ 6 | public class BannerBean { 7 | 8 | private String title; 9 | private String imageUrl; 10 | private String bookId; 11 | 12 | @Override 13 | public String toString() { 14 | return "BannerBean{" + 15 | "title='" + title + '\'' + 16 | ", imageUrl='" + imageUrl + '\'' + 17 | ", bookId=" + bookId + 18 | '}'; 19 | } 20 | 21 | public BannerBean(String title, String imageUrl, String bookId) { 22 | this.title = title; 23 | this.imageUrl = imageUrl; 24 | this.bookId = bookId; 25 | } 26 | 27 | public BannerBean(){ 28 | 29 | } 30 | 31 | public String getTitle() { 32 | return title == null ? "" : title; 33 | } 34 | 35 | public void setTitle(String title) { 36 | this.title = title == null ? "" : title; 37 | } 38 | 39 | public String getImageUrl() { 40 | return imageUrl == null ? "" : imageUrl; 41 | } 42 | 43 | public void setImageUrl(String imageUrl) { 44 | this.imageUrl = imageUrl == null ? "" : imageUrl; 45 | } 46 | 47 | public String getBookId() { 48 | return bookId; 49 | } 50 | 51 | public void setBookId(String bookId) { 52 | this.bookId = bookId; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/bean/BookBillBean.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.bean; 2 | 3 | import org.litepal.annotation.Column; 4 | import org.litepal.crud.LitePalSupport; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | import java.util.Objects; 9 | 10 | /** 11 | * 书单 12 | */ 13 | public class BookBillBean extends LitePalSupport { 14 | private ArrayList bookIdList; 15 | private String title; 16 | private int num; 17 | private String intro; 18 | @Column(unique = true) 19 | private String bookBillId; 20 | 21 | public long getPrimaryKey(){ 22 | return getBaseObjId(); 23 | } 24 | 25 | @Override 26 | public boolean equals(Object o) { 27 | if (this == o) return true; 28 | if (o == null || getClass() != o.getClass()) return false; 29 | BookBillBean that = (BookBillBean) o; 30 | return Objects.equals(bookBillId, that.bookBillId); 31 | } 32 | 33 | @Override 34 | public int hashCode() { 35 | return Objects.hash(bookBillId); 36 | } 37 | 38 | @Override 39 | public String toString() { 40 | return "BookBillBean{" + 41 | "bookIdList=" + bookIdList.toString() + 42 | ", title='" + title + '\'' + 43 | ", num=" + num + 44 | ", intro='" + intro + '\'' + 45 | ", bookBillId='" + bookBillId + '\'' + 46 | '}'; 47 | } 48 | 49 | public ArrayList getBookIdList() { 50 | return bookIdList; 51 | } 52 | 53 | public void setBookIdList(ArrayList bookIdList) { 54 | this.bookIdList = bookIdList; 55 | } 56 | 57 | public String getTitle() { 58 | return title == null ? "" : title; 59 | } 60 | 61 | public void setTitle(String title) { 62 | this.title = title == null ? "" : title; 63 | } 64 | 65 | public int getNum() { 66 | return num; 67 | } 68 | 69 | public void setNum(int num) { 70 | this.num = num; 71 | } 72 | 73 | public String getIntro() { 74 | return intro == null ? "" : intro; 75 | } 76 | 77 | public void setIntro(String intro) { 78 | this.intro = intro == null ? "" : intro; 79 | } 80 | 81 | public String getBookBillId() { 82 | return bookBillId == null ? "" : bookBillId; 83 | } 84 | 85 | public void setBookBillId(String bookBillId) { 86 | this.bookBillId = bookBillId == null ? "" : bookBillId; 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/bean/BookInfoBean.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.bean; 2 | 3 | import com.rdc.bms.q_comic.mvp.model.vo.BookTabDetailVO; 4 | 5 | public class BookInfoBean { 6 | private String intro; 7 | private String authorName; 8 | private String authorCoverUrl; 9 | private String fansNum; 10 | private String notice; 11 | private int priorityResId; 12 | 13 | public static BookInfoBean toThis(BookTabDetailVO bean){ 14 | BookInfoBean bookInfoBean = new BookInfoBean(); 15 | bookInfoBean.intro = bean.getIntro(); 16 | bookInfoBean.authorName = bean.getAuthorName(); 17 | bookInfoBean.authorCoverUrl = bean.getAuthorCoverUrl(); 18 | bookInfoBean.fansNum = bean.getFansNum(); 19 | bookInfoBean.notice = bean.getNotice(); 20 | bookInfoBean.priorityResId = bean.getPriorityResId(); 21 | return bookInfoBean; 22 | } 23 | 24 | public int getPriorityResId() { 25 | return priorityResId; 26 | } 27 | 28 | public void setPriorityResId(int priorityResId) { 29 | this.priorityResId = priorityResId; 30 | } 31 | 32 | public String getIntro() { 33 | return intro == null ? "" : intro; 34 | } 35 | 36 | public void setIntro(String intro) { 37 | this.intro = intro == null ? "" : intro; 38 | } 39 | 40 | public String getAuthorName() { 41 | return authorName == null ? "" : authorName; 42 | } 43 | 44 | public void setAuthorName(String authorName) { 45 | this.authorName = authorName == null ? "" : authorName; 46 | } 47 | 48 | public String getAuthorCoverUrl() { 49 | return authorCoverUrl == null ? "" : authorCoverUrl; 50 | } 51 | 52 | public void setAuthorCoverUrl(String authorCoverUrl) { 53 | this.authorCoverUrl = authorCoverUrl == null ? "" : authorCoverUrl; 54 | } 55 | 56 | public String getFansNum() { 57 | return fansNum == null ? "" : fansNum; 58 | } 59 | 60 | public void setFansNum(String fansNum) { 61 | this.fansNum = fansNum == null ? "" : fansNum; 62 | } 63 | 64 | public String getNotice() { 65 | return notice == null ? "" : notice; 66 | } 67 | 68 | public void setNotice(String notice) { 69 | this.notice = notice == null ? "" : notice; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/bean/ComicBean.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.bean; 2 | 3 | public class ComicBean { 4 | 5 | private String imageUrl;//图片URL 6 | private boolean isFirstPage;//是否本章第一页漫画 7 | private boolean isLastPage;//是否时本章最后一个漫画 8 | private long chapterId;//所在章节ID 9 | private int page;//在本章节中的页数 10 | 11 | public String getComicId(){ 12 | return "*"+chapterId+"*"+page; 13 | } 14 | 15 | public int getPage() { 16 | return page; 17 | } 18 | 19 | public void setPage(int page) { 20 | this.page = page; 21 | } 22 | 23 | public long getChapterId() { 24 | return chapterId; 25 | } 26 | 27 | public void setChapterId(long chapterId) { 28 | this.chapterId = chapterId; 29 | } 30 | 31 | public String getImageUrl() { 32 | return imageUrl == null ? "" : imageUrl; 33 | } 34 | 35 | public void setImageUrl(String imageUrl) { 36 | this.imageUrl = imageUrl == null ? "" : imageUrl; 37 | } 38 | 39 | public boolean isFirstPage() { 40 | return isFirstPage; 41 | } 42 | 43 | public void setFirstPage(boolean firstPage) { 44 | isFirstPage = firstPage; 45 | } 46 | 47 | public boolean isLastPage() { 48 | return isLastPage; 49 | } 50 | 51 | public void setLastPage(boolean lastPage) { 52 | isLastPage = lastPage; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/bean/HotKeyBean.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.bean; 2 | 3 | public class HotKeyBean { 4 | 5 | private String key; 6 | private int colorResId; 7 | 8 | public String getKey() { 9 | return key == null ? "" : key; 10 | } 11 | 12 | public void setKey(String key) { 13 | this.key = key == null ? "" : key; 14 | } 15 | 16 | public int getColorResId() { 17 | return colorResId; 18 | } 19 | 20 | public void setColorResId(int colorResId) { 21 | this.colorResId = colorResId; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/bean/SearchHistoryBean.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.bean; 2 | 3 | import org.litepal.crud.LitePalSupport; 4 | 5 | public class SearchHistoryBean extends LitePalSupport { 6 | 7 | private String key; 8 | 9 | public SearchHistoryBean(String key) { 10 | this.key = key; 11 | } 12 | 13 | public SearchHistoryBean() { 14 | } 15 | 16 | public String getKey() { 17 | return key == null ? "" : key; 18 | } 19 | 20 | public void setKey(String key) { 21 | this.key = key == null ? "" : key; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/bean/TypeBean.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.bean; 2 | 3 | public class TypeBean { 4 | private String name;//分类名 5 | private String coverUrl;//分类封面 6 | private String typeId;//分类ID 7 | 8 | public String getName() { 9 | return name == null ? "" : name; 10 | } 11 | 12 | public void setName(String name) { 13 | this.name = name == null ? "" : name; 14 | } 15 | 16 | public String getCoverUrl() { 17 | return coverUrl == null ? "" : coverUrl; 18 | } 19 | 20 | public void setCoverUrl(String coverUrl) { 21 | this.coverUrl = coverUrl == null ? "" : coverUrl; 22 | } 23 | 24 | public String getTypeId() { 25 | return typeId == null ? "" : typeId; 26 | } 27 | 28 | public void setTypeId(String typeId) { 29 | this.typeId = typeId == null ? "" : typeId; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/bean/rv_cell/BannerCell.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.bean.rv_cell; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.ImageView; 8 | 9 | import com.bumptech.glide.Glide; 10 | import com.rdc.bms.easy_rv_adapter.base.BaseRvCell; 11 | import com.rdc.bms.easy_rv_adapter.base.BaseRvViewHolder; 12 | import com.rdc.bms.q_comic.R; 13 | import com.rdc.bms.q_comic.bean.BannerBean; 14 | import com.rdc.bms.q_comic.config.ItemType; 15 | import com.youth.banner.Banner; 16 | import com.youth.banner.BannerConfig; 17 | import com.youth.banner.loader.ImageLoader; 18 | 19 | import java.util.ArrayList; 20 | import java.util.List; 21 | 22 | public class BannerCell extends BaseRvCell> { 23 | 24 | private List mImageUrlList; 25 | private List mTitleList; 26 | 27 | public BannerCell(List bannerBeans) { 28 | super(bannerBeans); 29 | mImageUrlList = new ArrayList<>(); 30 | mTitleList = new ArrayList<>(); 31 | for (BannerBean bannerBean : bannerBeans) { 32 | mImageUrlList.add(bannerBean.getImageUrl()); 33 | mTitleList.add(bannerBean.getTitle()); 34 | } 35 | } 36 | 37 | @Override 38 | public void releaseResource() { 39 | } 40 | 41 | @Override 42 | public int getItemType() { 43 | return ItemType.TYPE_BANNER; 44 | } 45 | 46 | @Override 47 | public BaseRvViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 48 | View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cell_banner,parent,false); 49 | return new BaseRvViewHolder(view); 50 | } 51 | 52 | @Override 53 | public void onBindViewHolder(BaseRvViewHolder holder, int position) { 54 | Banner banner = (Banner) holder.getView(R.id.banner_cell_banner); 55 | banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR_TITLE_INSIDE); 56 | banner.setImageLoader(new ImageLoader() { 57 | @Override 58 | public void displayImage(Context context, Object path, ImageView imageView) { 59 | Glide.with(context).load(path).into(imageView); 60 | } 61 | }); 62 | 63 | banner.setImages(mImageUrlList); 64 | banner.setBannerTitles(mTitleList); 65 | banner.start(); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/bean/rv_cell/BookBillDetailCell.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.bean.rv_cell; 2 | 3 | import android.view.View; 4 | import android.view.ViewGroup; 5 | import android.widget.ImageView; 6 | import android.widget.TextView; 7 | 8 | import com.bumptech.glide.Glide; 9 | import com.rdc.bms.easy_rv_adapter.base.BaseRvCell; 10 | import com.rdc.bms.easy_rv_adapter.base.BaseRvViewHolder; 11 | import com.rdc.bms.q_comic.R; 12 | import com.rdc.bms.q_comic.bean.BookBean; 13 | import com.rdc.bms.q_comic.config.ItemType; 14 | 15 | public class BookBillDetailCell extends BaseRvCell { 16 | public BookBillDetailCell(BookBean bookBean) { 17 | super(bookBean); 18 | } 19 | 20 | @Override 21 | public void releaseResource() { 22 | 23 | } 24 | 25 | @Override 26 | public int getItemType() { 27 | return ItemType.TYPE_BOOK_BILL; 28 | } 29 | 30 | @Override 31 | public BaseRvViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 32 | return createSimpleHolder(parent, R.layout.cell_book_bill_detaill); 33 | } 34 | 35 | @Override 36 | public void onBindViewHolder(final BaseRvViewHolder holder, final int position) { 37 | ImageView ivCover = holder.getImageView(R.id.iv_cover_cell_book_bill_detail); 38 | TextView tvTitle = holder.getTextView(R.id.tv_title_cell_book_bill_detail); 39 | TextView tvIntro = holder.getTextView(R.id.tv_intro_cell_book_bill_detail); 40 | TextView tvRecent = holder.getTextView(R.id.tv_recent_chapter_cell_book_bill_detail); 41 | Glide.with(holder.getContext()) 42 | .load(mData.getCoverUrl()) 43 | .into(ivCover); 44 | tvTitle.setText(mData.getName()); 45 | tvRecent.setText(mData.getRecentChapter()); 46 | tvIntro.setText(mData.getSummary()); 47 | 48 | 49 | if (mListener != null){ 50 | holder.itemView.setOnClickListener(new View.OnClickListener() { 51 | @Override 52 | public void onClick(View v) { 53 | mListener.onClickItem(mData,position); 54 | } 55 | }); 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/bean/rv_cell/ChapterNumCell.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.bean.rv_cell; 2 | 3 | import android.view.LayoutInflater; 4 | import android.view.View; 5 | import android.view.ViewGroup; 6 | import android.widget.ImageView; 7 | import android.widget.TextView; 8 | 9 | import com.rdc.bms.easy_rv_adapter.base.BaseRvCell; 10 | import com.rdc.bms.easy_rv_adapter.base.BaseRvViewHolder; 11 | import com.rdc.bms.q_comic.R; 12 | import com.rdc.bms.q_comic.bean.ChapterBean; 13 | import com.rdc.bms.q_comic.config.ItemType; 14 | 15 | /** 16 | * 单纯只有话数 17 | */ 18 | public class ChapterNumCell extends BaseRvCell { 19 | 20 | public ChapterNumCell(ChapterBean chapter) { 21 | super(chapter); 22 | } 23 | 24 | @Override 25 | public void releaseResource() { 26 | 27 | } 28 | 29 | @Override 30 | public int getItemType() { 31 | return ItemType.TYPE_CHAPTER; 32 | } 33 | 34 | @Override 35 | public BaseRvViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 36 | return new BaseRvViewHolder(LayoutInflater.from(parent.getContext()) 37 | .inflate(R.layout.cell_chapter_num,parent,false)); 38 | } 39 | 40 | @Override 41 | public void onBindViewHolder(BaseRvViewHolder holder, final int position) { 42 | TextView tv = holder.getTextView(R.id.tv_num_cell_chapter_num); 43 | ImageView ivRead = holder.getImageView(R.id.iv_is_read_cell_chapter_num); 44 | ImageView ivUnRead = holder.getImageView(R.id.iv_un_read_cell_chapter_num); 45 | ivUnRead.setVisibility(mData.isHasRedPoint() && !mData.isRead()?View.VISIBLE:View.GONE); 46 | ivRead.setVisibility(mData.isRead()?View.VISIBLE:View.GONE); 47 | tv.setText(mData.getChapterNum()); 48 | if (mListener != null){ 49 | holder.itemView.setOnClickListener(new View.OnClickListener() { 50 | @Override 51 | public void onClick(View v) { 52 | mListener.onClickItem(mData,position); 53 | } 54 | }); 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/bean/rv_cell/CollectCell.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.bean.rv_cell; 2 | 3 | import android.view.View; 4 | import android.view.ViewGroup; 5 | import android.widget.ImageView; 6 | import android.widget.TextView; 7 | 8 | import com.bumptech.glide.Glide; 9 | import com.rdc.bms.easy_rv_adapter.base.BaseRvCell; 10 | import com.rdc.bms.easy_rv_adapter.base.BaseRvViewHolder; 11 | import com.rdc.bms.q_comic.R; 12 | import com.rdc.bms.q_comic.base.BaseBookShelfCell; 13 | import com.rdc.bms.q_comic.base.BaseBookShelfVO; 14 | import com.rdc.bms.q_comic.bean.BookBean; 15 | import com.rdc.bms.q_comic.config.ItemType; 16 | import com.rdc.bms.q_comic.mvp.model.vo.CollectVO; 17 | 18 | public class CollectCell extends BaseBookShelfCell { 19 | public CollectCell(CollectVO collectVO) { 20 | super(collectVO); 21 | } 22 | 23 | @Override 24 | public void releaseResource() { 25 | 26 | } 27 | 28 | @Override 29 | public int getItemType() { 30 | return ItemType.TYPE_SUBSCRIBE; 31 | } 32 | 33 | @Override 34 | public BaseRvViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 35 | return createSimpleHolder(parent, R.layout.cell_book_collect); 36 | } 37 | 38 | @Override 39 | public void onBindViewHolder(final BaseRvViewHolder holder, final int position) { 40 | super.onBindViewHolder(holder,position); 41 | TextView tvIsUpdated = holder.getTextView(R.id.tv_is_update_cell_book_collect); 42 | TextView tvName = holder.getTextView(R.id.tv_name_cell_book_collect); 43 | TextView tvRecentChapter = holder.getTextView(R.id.tv_recent_cell_book_collect); 44 | TextView tvRecordChapter = holder.getTextView(R.id.tv_record_cell_book_collect); 45 | ImageView ivCover = holder.getImageView(R.id.iv_cover_cell_book_collect); 46 | 47 | tvIsUpdated.setVisibility(mData.getBookBean().isUpdate()?View.VISIBLE:View.GONE); 48 | tvName.setText(mData.getBookBean().getName()); 49 | tvRecentChapter.setText(mData.getBookBean().getRecentChapter()); 50 | tvRecordChapter.setText(mData.getBookBean().getLastRecordChapter()); 51 | Glide.with(holder.getContext()).load(mData.getBookBean().getCoverUrl()).into(ivCover); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/bean/rv_cell/DirCell.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.bean.rv_cell; 2 | 3 | import android.view.View; 4 | import android.view.ViewGroup; 5 | import android.widget.ImageView; 6 | import android.widget.TextView; 7 | 8 | import com.bumptech.glide.Glide; 9 | import com.rdc.bms.easy_rv_adapter.base.BaseRvCell; 10 | import com.rdc.bms.easy_rv_adapter.base.BaseRvViewHolder; 11 | import com.rdc.bms.q_comic.R; 12 | import com.rdc.bms.q_comic.bean.ChapterBean; 13 | import com.rdc.bms.q_comic.config.ItemType; 14 | 15 | public class DirCell extends BaseRvCell { 16 | 17 | public DirCell(ChapterBean chapterBean) { 18 | super(chapterBean); 19 | } 20 | 21 | @Override 22 | public void releaseResource() { 23 | 24 | } 25 | 26 | @Override 27 | public int getItemType() { 28 | return ItemType.TYPE_DIR; 29 | } 30 | 31 | @Override 32 | public BaseRvViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 33 | return createSimpleHolder(parent,R.layout.cell_dir); 34 | } 35 | 36 | @Override 37 | public void onBindViewHolder(final BaseRvViewHolder holder, final int position) { 38 | ImageView iv = holder.getImageView(R.id.iv_cover_cell_dir); 39 | TextView tvNum = holder.getTextView(R.id.tv_chapter_num_cell_dir); 40 | TextView tvName = holder.getTextView(R.id.tv_chapter_name_cell_dir); 41 | 42 | Glide.with(holder.getContext()) 43 | .load(mData.getCoverUrl()) 44 | .into(iv); 45 | tvNum.setText(mData.getChapterNum()); 46 | tvName.setText(mData.getName()); 47 | holder.itemView.setBackgroundResource(mData.isChecked()? 48 | R.color.colorRed:android.R.color.transparent); 49 | if (mListener != null){ 50 | holder.itemView.setOnClickListener(new View.OnClickListener() { 51 | @Override 52 | public void onClick(View v) { 53 | mListener.onClickItem(mData,position); 54 | } 55 | }); 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/bean/rv_cell/FanCell.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.bean.rv_cell; 2 | 3 | import android.text.Html; 4 | import android.view.ViewGroup; 5 | import android.widget.TextView; 6 | 7 | import com.bumptech.glide.Glide; 8 | import com.bumptech.glide.request.RequestOptions; 9 | import com.rdc.bms.easy_rv_adapter.base.BaseRvCell; 10 | import com.rdc.bms.easy_rv_adapter.base.BaseRvViewHolder; 11 | import com.rdc.bms.q_comic.R; 12 | import com.rdc.bms.q_comic.mvp.model.vo.BookTabSupportVO; 13 | import com.rdc.bms.q_comic.config.ItemType; 14 | 15 | import de.hdodenhof.circleimageview.CircleImageView; 16 | 17 | public class FanCell extends BaseRvCell { 18 | public FanCell(BookTabSupportVO.Fan fan) { 19 | super(fan); 20 | } 21 | 22 | @Override 23 | public void releaseResource() { 24 | 25 | } 26 | 27 | @Override 28 | public int getItemType() { 29 | return ItemType.TYPE_FAN; 30 | } 31 | 32 | @Override 33 | public BaseRvViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 34 | return createSimpleHolder(parent,R.layout.cell_support_fan); 35 | } 36 | 37 | @Override 38 | public void onBindViewHolder(BaseRvViewHolder holder, int position) { 39 | TextView tvRank = holder.getTextView(R.id.tv_rank_cell_fan); 40 | TextView tvName = holder.getTextView(R.id.tv_name_cell_fan); 41 | CircleImageView civCover = (CircleImageView) holder.getView(R.id.civ_cover_cell_fan); 42 | TextView tvInfluence = holder.getTextView(R.id.tv_influence_cell_fan); 43 | 44 | tvRank.setText(String.valueOf(position+4)); 45 | tvName.setText(mData.getName()); 46 | Glide.with(holder.getContext()) 47 | .load(mData.getCoverUrl()) 48 | .apply(new RequestOptions().error(R.drawable.ic_reader_error)) 49 | .into(civCover); 50 | tvInfluence.setText(Html.fromHtml(mData.getInfluence())); 51 | 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/bean/rv_cell/HistoryCell.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.bean.rv_cell; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.view.View; 5 | import android.view.ViewGroup; 6 | import android.widget.ImageView; 7 | import android.widget.TextView; 8 | 9 | import com.bumptech.glide.Glide; 10 | import com.rdc.bms.easy_rv_adapter.base.BaseRvCell; 11 | import com.rdc.bms.easy_rv_adapter.base.BaseRvViewHolder; 12 | import com.rdc.bms.q_comic.R; 13 | import com.rdc.bms.q_comic.base.BaseBookShelfCell; 14 | import com.rdc.bms.q_comic.bean.BookBean; 15 | import com.rdc.bms.q_comic.config.ItemType; 16 | import com.rdc.bms.q_comic.mvp.model.vo.HistoryVO; 17 | 18 | public class HistoryCell extends BaseBookShelfCell { 19 | 20 | public HistoryCell(HistoryVO h) { 21 | super(h); 22 | } 23 | 24 | @Override 25 | public void releaseResource() { 26 | 27 | } 28 | 29 | @Override 30 | public int getItemType() { 31 | return ItemType.TYPE_HISTORY; 32 | } 33 | 34 | @Override 35 | public BaseRvViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 36 | return createSimpleHolder(parent, R.layout.cell_book_history); 37 | } 38 | 39 | @SuppressLint("SetTextI18n") 40 | @Override 41 | public void onBindViewHolder(BaseRvViewHolder holder, final int position) { 42 | super.onBindViewHolder(holder, position); 43 | TextView tvName = holder.getTextView(R.id.tv_name_cell_book_history); 44 | TextView tvRecord = holder.getTextView(R.id.tv_record_cell_book_history); 45 | ImageView ivCover = holder.getImageView(R.id.iv_cover_cell_book_history); 46 | tvName.setText(mData.getBookBean().getName()); 47 | tvRecord.setText("已读:"+mData.getBookBean().getLastRecordChapter()); 48 | Glide.with(holder.getContext()).load(mData.getBookBean().getCoverUrl()).into(ivCover); 49 | if (mListener != null){ 50 | holder.itemView.setOnClickListener(new View.OnClickListener() { 51 | @Override 52 | public void onClick(View v) { 53 | mListener.onClickItem(mData,position); 54 | } 55 | }); 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/bean/rv_cell/SearchHistoryCell.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.bean.rv_cell; 2 | 3 | import android.view.LayoutInflater; 4 | import android.view.View; 5 | import android.view.ViewGroup; 6 | import android.widget.ImageView; 7 | import android.widget.TextView; 8 | 9 | import com.rdc.bms.easy_rv_adapter.base.BaseRvCell; 10 | import com.rdc.bms.easy_rv_adapter.base.BaseRvViewHolder; 11 | import com.rdc.bms.q_comic.R; 12 | import com.rdc.bms.q_comic.bean.SearchHistoryBean; 13 | import com.rdc.bms.q_comic.config.ItemType; 14 | 15 | public class SearchHistoryCell extends BaseRvCell { 16 | 17 | public SearchHistoryCell(SearchHistoryBean searchHistoryBean) { 18 | super(searchHistoryBean); 19 | } 20 | 21 | @Override 22 | public void releaseResource() { 23 | 24 | } 25 | 26 | @Override 27 | public int getItemType() { 28 | return ItemType.TYPE_SEARCH_HISTORY; 29 | } 30 | 31 | @Override 32 | public BaseRvViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 33 | return new BaseRvViewHolder(LayoutInflater.from(parent.getContext()) 34 | .inflate(R.layout.cell_search_history,parent,false)); 35 | } 36 | 37 | @Override 38 | public void onBindViewHolder(final BaseRvViewHolder holder, final int position) { 39 | TextView tvHistory = holder.getTextView(R.id.tv_history_cell_search_history); 40 | ImageView ivDelete = holder.getImageView(R.id.iv_delete_cell_search_history); 41 | tvHistory.setText(mData.getKey()); 42 | if (mListener != null){ 43 | ivDelete.setOnClickListener(new View.OnClickListener() { 44 | @Override 45 | public void onClick(View v) { 46 | mListener.onClick(v,position); 47 | } 48 | }); 49 | holder.itemView.setOnClickListener(new View.OnClickListener() { 50 | @Override 51 | public void onClick(View v) { 52 | mListener.onClickItem(mData,position); 53 | } 54 | }); 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/bean/rv_cell/StatisticCell.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.bean.rv_cell; 2 | 3 | import android.text.Html; 4 | import android.view.ViewGroup; 5 | import android.widget.ImageView; 6 | import android.widget.TextView; 7 | 8 | import com.bumptech.glide.Glide; 9 | import com.rdc.bms.easy_rv_adapter.base.BaseRvCell; 10 | import com.rdc.bms.easy_rv_adapter.base.BaseRvViewHolder; 11 | import com.rdc.bms.q_comic.R; 12 | import com.rdc.bms.q_comic.mvp.model.vo.BookTabSupportVO; 13 | import com.rdc.bms.q_comic.config.ItemType; 14 | 15 | public class StatisticCell extends BaseRvCell { 16 | 17 | public StatisticCell(BookTabSupportVO.SupportItem supportItem) { 18 | super(supportItem); 19 | } 20 | 21 | @Override 22 | public void releaseResource() { 23 | 24 | } 25 | 26 | @Override 27 | public int getItemType() { 28 | return ItemType.TYPE_STATISTIC; 29 | } 30 | 31 | @Override 32 | public BaseRvViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 33 | return createSimpleHolder(parent, R.layout.cell_statistic); 34 | } 35 | 36 | @Override 37 | public void onBindViewHolder(BaseRvViewHolder holder, int position) { 38 | TextView tvName = holder.getTextView(R.id.tv_name_cell_statistic); 39 | TextView tvValue = holder.getTextView(R.id.tv_value_cell_statistic); 40 | ImageView ivCover = holder.getImageView(R.id.iv_icon_cell_statistic); 41 | 42 | tvName.setText(mData.getOption()); 43 | tvName.setTextColor(holder.getContext().getResources().getColor(mData.getColorTextResId())); 44 | tvValue.setTextColor(holder.getContext().getResources().getColor(mData.getColorTextResId())); 45 | tvValue.setText(Html.fromHtml(mData.getNum())); 46 | holder.itemView.setBackgroundResource(mData.getDrawableBgResId()); 47 | Glide.with(holder.getContext()).load(mData.getIconResId()).into(ivCover); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/bean/rv_cell/TypeBeanCell.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.bean.rv_cell; 2 | 3 | import android.view.LayoutInflater; 4 | import android.view.View; 5 | import android.view.ViewGroup; 6 | 7 | import com.bumptech.glide.Glide; 8 | import com.rdc.bms.easy_rv_adapter.base.BaseRvCell; 9 | import com.rdc.bms.easy_rv_adapter.base.BaseRvViewHolder; 10 | import com.rdc.bms.q_comic.R; 11 | import com.rdc.bms.q_comic.bean.TypeBean; 12 | import com.rdc.bms.q_comic.config.ItemType; 13 | 14 | public class TypeBeanCell extends BaseRvCell { 15 | public TypeBeanCell(TypeBean typeBean) { 16 | super(typeBean); 17 | } 18 | 19 | @Override 20 | public void releaseResource() { 21 | 22 | } 23 | 24 | @Override 25 | public int getItemType() { 26 | return ItemType.TYPE_BOOK; 27 | } 28 | 29 | @Override 30 | public BaseRvViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 31 | return new BaseRvViewHolder(LayoutInflater.from(parent.getContext()) 32 | .inflate(R.layout.cell_type,parent,false)); 33 | } 34 | 35 | @Override 36 | public void onBindViewHolder(final BaseRvViewHolder holder, final int position) { 37 | holder.getTextView(R.id.tv_name_cell_type).setText(mData.getName()); 38 | Glide.with(holder.getContext()) 39 | .load(mData.getCoverUrl()) 40 | .into(holder.getImageView(R.id.iv_cover_cell_type)); 41 | if (mListener != null){ 42 | holder.itemView.setOnClickListener(new View.OnClickListener() { 43 | @Override 44 | public void onClick(View v) { 45 | mListener.onClickItem(mData,position); 46 | } 47 | }); 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/config/ItemType.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.config; 2 | 3 | public class ItemType { 4 | public static final int TYPE_BANNER = 0; 5 | public static final int TYPE_BOOK_LIST = 1; 6 | public static final int TYPE_BOOK = 2; 7 | public static final int TYPE_BOOK_BILL = 3; 8 | 9 | public static final int TYPE_SEARCH_HISTORY = 4; 10 | public static final int TYPE_CHAPTER = 5; 11 | 12 | public static final int TYPE_TAB_COMIC_LIST_RECOMMEND = 6; 13 | public static final int TYPE_TAB_COMIC_LIST_OTHER_WORKS = 7; 14 | public static final int TYPE_TAB_COMIC_INFO = 8; 15 | 16 | public static final int TYPE_FAN = 9; 17 | public static final int TYPE_STATISTIC = 10; 18 | 19 | public static final int TYPE_COMIC = 11; 20 | public static final int TYPE_DIR = 12; 21 | public static final int TYPE_SUBSCRIBE = 13; 22 | public static final int TYPE_HISTORY = 14; 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/listener/ILifeCycle.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.listener; 2 | 3 | 4 | public interface ILifeCycle { 5 | void onCreate(); 6 | 7 | void onReStart(); 8 | 9 | void onStart(); 10 | 11 | void onResume(); 12 | 13 | void onPause(); 14 | 15 | void onStop(); 16 | 17 | void onDestroy(); 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/listener/OnComicClickListener.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.listener; 2 | 3 | public interface OnComicClickListener { 4 | void onClick(String comicId); 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/listener/OnEditListener.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.listener; 2 | 3 | public interface OnEditListener { 4 | /** 5 | * 开始编辑 6 | */ 7 | void onStartEdit(); 8 | 9 | /** 10 | * 编辑结束 11 | */ 12 | void onEndEdit(); 13 | 14 | /** 15 | * 全选或取消全选 16 | * @param isSelect 17 | */ 18 | void onSelectAll(boolean isSelect); 19 | 20 | /** 21 | * 点击删除 22 | */ 23 | void onDelete(); 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/listener/OnScrollYChangeForAlphaListener.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.listener; 2 | 3 | public interface OnScrollYChangeForAlphaListener { 4 | void changeTopLayoutTransport(int alpha); 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/contract/IBookBillDetailContract.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.contract; 2 | 3 | import com.rdc.bms.q_comic.mvp.model.vo.BookBillDetailVO; 4 | 5 | import java.util.ArrayList; 6 | 7 | public interface IBookBillDetailContract { 8 | interface View{ 9 | void setBookDetailData(BookBillDetailVO data); 10 | void onError(String msg); 11 | } 12 | 13 | interface Presenter { 14 | void getBookBillDetailData(String bookId); 15 | void collectBookBill(boolean isCollect); 16 | void updateBookBill(); 17 | void setCoverBookIdList(ArrayList coverBookIdList); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/contract/IBookDetailContract.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.contract; 2 | 3 | import com.rdc.bms.q_comic.bean.BookDetailVO; 4 | import com.rdc.bms.q_comic.bean.ChapterBean; 5 | 6 | import java.util.List; 7 | 8 | public interface IBookDetailContract { 9 | interface View{ 10 | void setBookDetailData(BookDetailVO bean); 11 | void setReadRecord(List newList); 12 | void setLastRecordChapter(ChapterBean chapter,boolean first); 13 | void onError(String msg); 14 | } 15 | 16 | interface Presenter{ 17 | void getBookDetailData(String bookId); 18 | //获取读者读了哪些章节 19 | void getAllRecord(); 20 | //获取最近读的章节(用于btnStartRead显示,和保存数据库) 21 | void getLastRecordChapter(); 22 | void collect(boolean isCollect); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/contract/IBookListContract.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.contract; 2 | 3 | import com.rdc.bms.q_comic.bean.BookBillBean; 4 | 5 | import java.util.List; 6 | 7 | public interface IBookListContract{ 8 | interface view{ 9 | void setBookList(List list); 10 | void showError(String msg); 11 | void setNoMore(); 12 | } 13 | 14 | interface presenter{ 15 | void getBookBillList(String tagName); 16 | void clearFlag();//重新加载数据,清除之前的标志值 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/contract/ICollectContract.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.contract; 2 | 3 | import com.rdc.bms.q_comic.bean.BookBean; 4 | import com.rdc.bms.q_comic.mvp.model.vo.CollectVO; 5 | 6 | import java.util.List; 7 | 8 | public interface ICollectContract { 9 | interface View{ 10 | void setCollectData(List oldList, List newList); 11 | void onError(String msg); 12 | } 13 | 14 | interface Presenter{ 15 | void getCollectData(); 16 | void startEdit(); 17 | void endEdit(); 18 | void deleteBooks(); 19 | void selectAll(boolean isSelect); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/contract/IComicContract.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.contract; 2 | 3 | 4 | import com.rdc.bms.q_comic.bean.ChapterBean; 5 | import com.rdc.bms.q_comic.bean.ComicBean; 6 | 7 | import java.util.List; 8 | 9 | public interface IComicContract { 10 | interface View{ 11 | void finishedGetComicData(List chapterList); 12 | void updateComic(List newComicList,List oldComicList); 13 | void rvDirScrollTo(int index); 14 | void rvComicScrollTo(int index); 15 | void onError(String msg); 16 | void setChapterTip(String title, String count, String total); 17 | void setDirItemSelected(int index); 18 | ComicBean getReadingComic(); 19 | } 20 | 21 | interface Presenter{ 22 | void setImageQuality(int quality); 23 | List getDirList(); 24 | List getComicList(); 25 | int getCurComicListFirstIndex(); 26 | void indexRvDirFirst(); 27 | void getComic(String comicId,long startChapterId); 28 | void updateComicData(ChapterBean data); 29 | void sendMessage(int what,Object obj); 30 | ChapterBean getChapterById(long chapterId); 31 | void onRecyclerViewScroll(int dy,int firstVisibleItemIndex,int lastVisibleItemIndex); 32 | ChapterBean getReadingChapter(); 33 | void saveLastRecordChapter(ChapterBean chapterBean); 34 | void saveReadChapter(ChapterBean chapterBean); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/contract/IHistoryContract.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.contract; 2 | 3 | import com.rdc.bms.easy_rv_adapter.OnClickViewRvListener; 4 | import com.rdc.bms.q_comic.bean.BookBean; 5 | import com.rdc.bms.q_comic.mvp.model.vo.HistoryVO; 6 | 7 | import java.util.List; 8 | 9 | public interface IHistoryContract { 10 | interface View{ 11 | void setHistoryData(List oldList, List newList); 12 | void onError(String msg); 13 | void noMore(); 14 | } 15 | 16 | interface Presenter{ 17 | void refresh(); 18 | void getHistoryData(); 19 | void startEdit(); 20 | void endEdit(); 21 | void deleteBooks(); 22 | void selectAll(boolean isSelect); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/contract/IHomeContract.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.contract; 2 | 3 | import com.rdc.bms.q_comic.bean.BannerBean; 4 | import com.rdc.bms.q_comic.bean.ItemBean; 5 | 6 | import java.util.List; 7 | 8 | public interface IHomeContract { 9 | 10 | interface Presenter{ 11 | void getHomePageData(); 12 | } 13 | 14 | interface View{ 15 | void showData(List bannerList, List itemBeanList); 16 | void onError(String msg); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/contract/IMainContract.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.contract; 2 | 3 | import java.util.List; 4 | 5 | public interface IMainContract { 6 | 7 | interface Presenter{ 8 | void getKindTitleList(); 9 | } 10 | 11 | interface View{ 12 | void setKindTitle(List list); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/contract/IMyBookBillContract.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.contract; 2 | 3 | import com.rdc.bms.q_comic.bean.BookBillBean; 4 | import com.rdc.bms.q_comic.mvp.model.vo.MyBookBillVO; 5 | 6 | import java.util.List; 7 | 8 | public interface IMyBookBillContract { 9 | interface View{ 10 | void setMyBookBillData(List oldList, List newList); 11 | void onError(String msg); 12 | } 13 | 14 | interface Presenter{ 15 | void getMyBookBillData(); 16 | void startEdit(); 17 | void endEdit(); 18 | void deleteBooks(); 19 | void selectAll(boolean isSelect); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/contract/IRankContract.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.contract; 2 | 3 | import com.rdc.bms.q_comic.bean.RankBean; 4 | 5 | import java.util.List; 6 | 7 | public interface IRankContract { 8 | interface View{ 9 | void setRankData(List list); 10 | void onError(String msg); 11 | } 12 | 13 | interface Presenter{ 14 | void getRankData(int kind); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/contract/ISearchContract.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.contract; 2 | 3 | import com.rdc.bms.q_comic.bean.SearchHistoryBean; 4 | import com.rdc.bms.q_comic.bean.HotKeyBean; 5 | 6 | import java.util.List; 7 | 8 | public interface ISearchContract { 9 | interface View{ 10 | void setHotKeys(List list); 11 | void setHistoryList(List list); 12 | void onError(String msg); 13 | } 14 | 15 | interface Presenter{ 16 | void getHotKeys(); 17 | void getHistoryList(); 18 | void addHistory(List list, SearchHistoryBean searchHistoryBean); 19 | void saveHistoryList(List list); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/contract/ISearchResultContract.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.contract; 2 | 3 | import com.rdc.bms.q_comic.bean.BookBean; 4 | 5 | import java.util.List; 6 | 7 | public interface ISearchResultContract { 8 | interface View{ 9 | void onError(String msg); 10 | void noMore(); 11 | void setSearchResult(List list); 12 | } 13 | 14 | interface Presenter{ 15 | void SearchKey(String key); 16 | void SearchType(String type); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/contract/ITypeContract.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.contract; 2 | 3 | import com.rdc.bms.q_comic.bean.TypeBean; 4 | 5 | import java.util.List; 6 | 7 | public interface ITypeContract { 8 | interface View{ 9 | void setTypeList(List list); 10 | void onError(String msg); 11 | } 12 | 13 | interface Presenter{ 14 | void getTypeList(int kind); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/model/ComicModel.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.model; 2 | 3 | import com.rdc.bms.q_comic.config.Constant; 4 | import com.rdc.bms.q_comic.mvp.model.dto.ComicInfoDTO; 5 | 6 | import com.rdc.bms.q_comic.mvp.model.service.ComicService; 7 | import com.rdc.bms.q_comic.util.RetrofitUtil; 8 | 9 | import io.reactivex.Observer; 10 | import io.reactivex.android.schedulers.AndroidSchedulers; 11 | import io.reactivex.schedulers.Schedulers; 12 | 13 | public class ComicModel { 14 | public void getComic(Observer observer, String bookId){ 15 | RetrofitUtil.bind(Constant.BASE_URL_WEB_JSON).create(ComicService.class) 16 | .getComicInfo(bookId) 17 | .subscribeOn(Schedulers.io()) 18 | .unsubscribeOn(Schedulers.io()) 19 | .observeOn(AndroidSchedulers.mainThread()) 20 | .subscribe(observer); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/model/FootPrintModel.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.model; 2 | 3 | import android.util.Log; 4 | 5 | import com.rdc.bms.q_comic.bean.BookBean; 6 | 7 | import org.litepal.LitePal; 8 | 9 | import java.util.List; 10 | 11 | import io.reactivex.Observable; 12 | import io.reactivex.ObservableEmitter; 13 | import io.reactivex.ObservableOnSubscribe; 14 | import io.reactivex.Observer; 15 | import io.reactivex.android.schedulers.AndroidSchedulers; 16 | import io.reactivex.schedulers.Schedulers; 17 | 18 | public class FootPrintModel { 19 | 20 | public void getMyCollect(Observer> observer){ 21 | Observable.create(new ObservableOnSubscribe>() { 22 | @Override 23 | public void subscribe(ObservableEmitter> emitter){ 24 | try { 25 | List list = LitePal.where("isCollect = ?","1").find(BookBean.class); 26 | Log.d("FootPrintModel", "subscribe: "+list.size()); 27 | emitter.onNext(list); 28 | }catch (Exception e){ 29 | e.printStackTrace(); 30 | emitter.onError(e); 31 | }finally { 32 | emitter.onComplete(); 33 | } 34 | } 35 | }).subscribeOn(Schedulers.io()) 36 | .unsubscribeOn(Schedulers.io()) 37 | .observeOn(AndroidSchedulers.mainThread()) 38 | .subscribe(observer); 39 | } 40 | 41 | public void getHistoryRead(Observer> observer){ 42 | Observable.create(new ObservableOnSubscribe>() { 43 | @Override 44 | public void subscribe(ObservableEmitter> emitter){ 45 | try { 46 | emitter.onNext(LitePal.where("").find(BookBean.class)); 47 | }catch (Exception e){ 48 | e.printStackTrace(); 49 | emitter.onError(e); 50 | }finally { 51 | emitter.onComplete(); 52 | } 53 | } 54 | }).subscribeOn(Schedulers.io()) 55 | .unsubscribeOn(Schedulers.io()) 56 | .observeOn(AndroidSchedulers.mainThread()) 57 | .subscribe(observer); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/model/SearchModel.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.model; 2 | 3 | import com.rdc.bms.q_comic.bean.SearchHistoryBean; 4 | import com.rdc.bms.q_comic.config.Constant; 5 | import com.rdc.bms.q_comic.mvp.model.dto.HotKeyDTO; 6 | import com.rdc.bms.q_comic.mvp.model.service.SearchService; 7 | import com.rdc.bms.q_comic.util.RetrofitUtil; 8 | 9 | import org.litepal.LitePal; 10 | 11 | import java.util.List; 12 | 13 | import io.reactivex.Observable; 14 | import io.reactivex.ObservableEmitter; 15 | import io.reactivex.ObservableOnSubscribe; 16 | import io.reactivex.Observer; 17 | import io.reactivex.android.schedulers.AndroidSchedulers; 18 | import io.reactivex.schedulers.Schedulers; 19 | 20 | public class SearchModel { 21 | public void getHotKeys(Observer observer){ 22 | RetrofitUtil.bind(Constant.BASE_URL_WEB_JSON).create(SearchService.class) 23 | .getHotKeys() 24 | .subscribeOn(Schedulers.io()) 25 | .unsubscribeOn(Schedulers.io()) 26 | .observeOn(AndroidSchedulers.mainThread()) 27 | .subscribe(observer); 28 | } 29 | 30 | public void getSearchHistory(Observer> observer){ 31 | Observable.create(new ObservableOnSubscribe>() { 32 | @Override 33 | public void subscribe(ObservableEmitter> emitter) { 34 | List list = LitePal.findAll(SearchHistoryBean.class); 35 | emitter.onNext(list); 36 | } 37 | }).subscribeOn(Schedulers.io()) 38 | .unsubscribeOn(Schedulers.io()) 39 | .observeOn(AndroidSchedulers.mainThread()) 40 | .subscribe(observer); 41 | } 42 | 43 | public void saveHistoryList(final List list){ 44 | LitePal.deleteAll(SearchHistoryBean.class); 45 | LitePal.saveAll(list); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/model/SearchResultModel.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.model; 2 | 3 | import com.rdc.bms.q_comic.config.Constant; 4 | import com.rdc.bms.q_comic.mvp.model.dto.SearchDTO; 5 | import com.rdc.bms.q_comic.mvp.model.service.SearchService; 6 | import com.rdc.bms.q_comic.util.RetrofitUtil; 7 | 8 | import io.reactivex.Observer; 9 | import io.reactivex.android.schedulers.AndroidSchedulers; 10 | import io.reactivex.schedulers.Schedulers; 11 | 12 | public class SearchResultModel { 13 | 14 | public void searchType(Observer observer, final String type, int page){ 15 | RetrofitUtil.bind(Constant.BASE_URL_WEB_JSON).create(SearchService.class) 16 | .search(type,"",page) 17 | .subscribeOn(Schedulers.io()) 18 | .unsubscribeOn(Schedulers.io()) 19 | .observeOn(AndroidSchedulers.mainThread()) 20 | .subscribe(observer); 21 | } 22 | 23 | public void searchKey(Observer observer, int page, String key){ 24 | RetrofitUtil.bind(Constant.BASE_URL_WEB_JSON).create(SearchService.class) 25 | .search("all",key,page) 26 | .subscribeOn(Schedulers.io()) 27 | .unsubscribeOn(Schedulers.io()) 28 | .observeOn(AndroidSchedulers.mainThread()) 29 | .subscribe(observer); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/model/db/CollectBean.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.model.db; 2 | 3 | import org.litepal.annotation.Column; 4 | import org.litepal.crud.LitePalSupport; 5 | 6 | import java.util.Date; 7 | 8 | public class CollectBean extends LitePalSupport { 9 | @Column(unique = true) 10 | private long bookPrimaryKey; 11 | private Date time; 12 | 13 | public long getBookPrimaryKey() { 14 | return bookPrimaryKey; 15 | } 16 | 17 | public void setBookPrimaryKey(long bookPrimaryKey) { 18 | this.bookPrimaryKey = bookPrimaryKey; 19 | } 20 | 21 | public Date getTime() { 22 | return time; 23 | } 24 | 25 | public void setTime(Date time) { 26 | this.time = time; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/model/db/HistoryBean.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.model.db; 2 | 3 | import org.litepal.annotation.Column; 4 | import org.litepal.crud.LitePalSupport; 5 | 6 | import java.util.Date; 7 | 8 | public class HistoryBean extends LitePalSupport { 9 | @Column(unique = true) 10 | private long bookPrimaryKey; 11 | private Date time; 12 | 13 | public long getBookPrimaryKey() { 14 | return bookPrimaryKey; 15 | } 16 | 17 | public void setBookPrimaryKey(long bookPrimaryKey) { 18 | this.bookPrimaryKey = bookPrimaryKey; 19 | } 20 | 21 | public Date getTime() { 22 | return time; 23 | } 24 | 25 | public void setTime(Date time) { 26 | this.time = time; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/model/dto/HomePageDTO.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.model.dto; 2 | 3 | import com.rdc.bms.q_comic.bean.BannerBean; 4 | import com.rdc.bms.q_comic.bean.ItemBean; 5 | 6 | import java.util.List; 7 | 8 | public class HomePageDTO { 9 | 10 | private List bannerList; 11 | private List itemList; 12 | 13 | public HomePageDTO(List bannerList, List itemList) { 14 | this.bannerList = bannerList; 15 | this.itemList = itemList; 16 | } 17 | 18 | public HomePageDTO(){ 19 | 20 | } 21 | 22 | public List getBannerList() { 23 | return bannerList; 24 | } 25 | 26 | public void setBannerList(List bannerList) { 27 | this.bannerList = bannerList; 28 | } 29 | 30 | public List getItemList() { 31 | return itemList; 32 | } 33 | 34 | public void setItemList(List itemList) { 35 | this.itemList = itemList; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/model/dto/PageDTO.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.model.dto; 2 | 3 | public class PageDTO { 4 | private int totalPage; 5 | private int currentPage; 6 | 7 | @Override 8 | public String toString() { 9 | return "PageDTO{" + 10 | "totalPage=" + totalPage + 11 | ", currentPage=" + currentPage + 12 | '}'; 13 | } 14 | 15 | public PageDTO(){ 16 | 17 | } 18 | 19 | public PageDTO(int totalPage, int currentPage) { 20 | this.totalPage = totalPage; 21 | this.currentPage = currentPage; 22 | } 23 | 24 | /** 25 | * 是否还有更多页 26 | * @return 27 | */ 28 | public boolean hasMore(){ 29 | return totalPage > currentPage; 30 | } 31 | 32 | public int getTotalPage() { 33 | return totalPage; 34 | } 35 | 36 | public void setTotalPage(int totalPage) { 37 | this.totalPage = totalPage; 38 | } 39 | 40 | public int getCurrentPage() { 41 | return currentPage; 42 | } 43 | 44 | public void setCurrentPage(int currentPage) { 45 | this.currentPage = currentPage; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/model/dto/RankDTO.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.model.dto; 2 | 3 | import com.rdc.bms.q_comic.bean.RankBean; 4 | 5 | import java.util.List; 6 | 7 | public class RankDTO { 8 | 9 | 10 | List kinkList; 11 | List comicRankList; 12 | 13 | public RankDTO(List kinkList, List comicRankList) { 14 | this.kinkList = kinkList; 15 | this.comicRankList = comicRankList; 16 | } 17 | 18 | public RankDTO() { 19 | } 20 | 21 | public List getKinkList() { 22 | return kinkList; 23 | } 24 | 25 | public void setKinkList(List kinkList) { 26 | this.kinkList = kinkList; 27 | } 28 | 29 | public List getComicRankList() { 30 | return comicRankList; 31 | } 32 | 33 | public void setComicRankList(List comicRankList) { 34 | this.comicRankList = comicRankList; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/model/service/BookBillService.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.model.service; 2 | 3 | import com.rdc.bms.q_comic.config.Constant; 4 | import com.rdc.bms.q_comic.mvp.model.dto.BookBillDetailContainerDTO; 5 | import com.rdc.bms.q_comic.mvp.model.dto.BookBillDetailHeadDTO; 6 | import com.rdc.bms.q_comic.mvp.model.dto.BookListDTO; 7 | 8 | import io.reactivex.Observable; 9 | import io.reactivex.Observer; 10 | import retrofit2.http.POST; 11 | import retrofit2.http.Query; 12 | 13 | public interface BookBillService { 14 | 15 | @POST(Constant.BOOK_BILL) 16 | Observable getBookBillList(@Query("page") int page, 17 | @Query("tagname") String tagName, 18 | @Query("client-type") String clientType, 19 | @Query("client-version") String clientVersion, 20 | @Query("localtime") long localTime); 21 | 22 | @POST(Constant.BOOK_BILL_HEAD) 23 | Observable getBookBillDetailHead(@Query("book_id") String bookId); 24 | 25 | @POST(Constant.BOOK_BILL_CONTAINER) 26 | Observable getBookBillContainer(@Query("book_id") String bookId,@Query("page_size") int pageSize); 27 | 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/model/service/ComicService.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.model.service; 2 | 3 | import com.rdc.bms.q_comic.config.Constant; 4 | import com.rdc.bms.q_comic.mvp.model.dto.ComicDTO; 5 | import com.rdc.bms.q_comic.mvp.model.dto.ComicInfoDTO; 6 | 7 | import io.reactivex.Observable; 8 | import retrofit2.http.GET; 9 | import retrofit2.http.Query; 10 | 11 | public interface ComicService { 12 | @GET(Constant.COMIC_INFO) 13 | Observable getComicInfo(@Query("comic_id") String comicId); 14 | @GET(Constant.COMIC) 15 | Observable getComic(@Query("comic_id") String comicId); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/model/service/SearchService.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.model.service; 2 | 3 | import com.rdc.bms.q_comic.config.Constant; 4 | import com.rdc.bms.q_comic.mvp.model.dto.HotKeyDTO; 5 | import com.rdc.bms.q_comic.mvp.model.dto.SearchDTO; 6 | 7 | import io.reactivex.Observable; 8 | import retrofit2.http.GET; 9 | import retrofit2.http.Query; 10 | 11 | public interface SearchService { 12 | @GET(Constant.SEARCH) 13 | Observable search(@Query("type") String type, 14 | @Query("key") String key, 15 | @Query("page") int page); 16 | 17 | @GET(Constant.HOT_KEYS) 18 | Observable getHotKeys(); 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/model/vo/BookTabDirVO.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.model.vo; 2 | 3 | import com.rdc.bms.q_comic.bean.ChapterBean; 4 | 5 | import java.util.List; 6 | 7 | public class BookTabDirVO { 8 | 9 | private String updateTime; 10 | private List chapterList; 11 | 12 | public String getUpdateTime() { 13 | return updateTime == null ? "" : updateTime; 14 | } 15 | 16 | public void setUpdateTime(String updateTime) { 17 | this.updateTime = updateTime == null ? "" : updateTime; 18 | } 19 | 20 | public List getChapterList() { 21 | return chapterList; 22 | } 23 | 24 | public void setChapterList(List chapterList) { 25 | this.chapterList = chapterList; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/model/vo/BookTopInfoVO.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.model.vo; 2 | 3 | import java.util.List; 4 | 5 | public class BookTopInfoVO { 6 | 7 | private String name; 8 | private String score; 9 | private String coverUrl; 10 | private String author; 11 | private List mTagList; 12 | private String fireNum;//热度 13 | private boolean isCollected;//是否收藏 14 | 15 | @Override 16 | public String toString() { 17 | return "BookTopInfoVO{" + 18 | "name='" + name + '\'' + 19 | ", score='" + score + '\'' + 20 | ", coverUrl='" + coverUrl + '\'' + 21 | ", author='" + author + '\'' + 22 | ", mTagList=" + mTagList + 23 | ", fireNum='" + fireNum + '\'' + 24 | ", isCollected=" + isCollected + 25 | '}'; 26 | } 27 | 28 | public String getScore() { 29 | return score == null ? "" : score; 30 | } 31 | 32 | public void setScore(String score) { 33 | this.score = score == null ? "" : score; 34 | } 35 | 36 | public String getName() { 37 | return name == null ? "" : name; 38 | } 39 | 40 | public void setName(String name) { 41 | this.name = name == null ? "" : name; 42 | } 43 | 44 | public String getCoverUrl() { 45 | return coverUrl == null ? "" : coverUrl; 46 | } 47 | 48 | public void setCoverUrl(String coverUrl) { 49 | this.coverUrl = coverUrl == null ? "" : coverUrl; 50 | } 51 | 52 | public String getAuthor() { 53 | return author == null ? "" : author; 54 | } 55 | 56 | public void setAuthor(String author) { 57 | this.author = author == null ? "" : author; 58 | } 59 | 60 | public List getmTagList() { 61 | return mTagList; 62 | } 63 | 64 | public void setmTagList(List mTagList) { 65 | this.mTagList = mTagList; 66 | } 67 | 68 | public String getFireNum() { 69 | return fireNum == null ? "" : fireNum; 70 | } 71 | 72 | public void setFireNum(String fireNum) { 73 | this.fireNum = fireNum == null ? "" : fireNum; 74 | } 75 | 76 | public boolean isCollected() { 77 | return isCollected; 78 | } 79 | 80 | public void setCollected(boolean collected) { 81 | isCollected = collected; 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/model/vo/CollectVO.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.model.vo; 2 | 3 | import com.rdc.bms.q_comic.base.BaseBookShelfVO; 4 | import com.rdc.bms.q_comic.bean.BookBean; 5 | 6 | import java.util.Objects; 7 | 8 | public class CollectVO extends BaseBookShelfVO implements Cloneable { 9 | private BookBean bookBean; 10 | public CollectVO(BookBean bookBean) { 11 | this.bookBean = bookBean; 12 | } 13 | 14 | 15 | @Override 16 | public CollectVO clone(){ 17 | CollectVO vo = null; 18 | try { 19 | vo = (CollectVO) super.clone(); 20 | } catch (CloneNotSupportedException e) { 21 | e.printStackTrace(); 22 | } 23 | return vo; 24 | } 25 | 26 | @Override 27 | public boolean equals(Object o) { 28 | if (this == o) return true; 29 | if (o == null || getClass() != o.getClass()) return false; 30 | CollectVO collectVO = (CollectVO) o; 31 | return Objects.equals(bookBean.getBookId(), collectVO.bookBean.getBookId()); 32 | } 33 | 34 | 35 | @Override 36 | public int hashCode() { 37 | return Objects.hash(bookBean.getBookId()); 38 | } 39 | 40 | public BookBean getBookBean() { 41 | return bookBean; 42 | } 43 | 44 | public void setBookBean(BookBean bookBean) { 45 | this.bookBean = bookBean; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/model/vo/HistoryVO.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.model.vo; 2 | 3 | import com.rdc.bms.q_comic.base.BaseBookShelfVO; 4 | import com.rdc.bms.q_comic.bean.BookBean; 5 | 6 | import java.util.Objects; 7 | 8 | public class HistoryVO extends BaseBookShelfVO implements Cloneable { 9 | private BookBean bookBean; 10 | public HistoryVO(BookBean bookBean) { 11 | this.bookBean = bookBean; 12 | } 13 | 14 | 15 | @Override 16 | public HistoryVO clone(){ 17 | HistoryVO vo = null; 18 | try { 19 | vo = (HistoryVO) super.clone(); 20 | } catch (CloneNotSupportedException e) { 21 | e.printStackTrace(); 22 | } 23 | return vo; 24 | } 25 | 26 | @Override 27 | public boolean equals(Object o) { 28 | if (this == o) return true; 29 | if (o == null || getClass() != o.getClass()) return false; 30 | HistoryVO historyVO = (HistoryVO) o; 31 | return Objects.equals(bookBean.getBookId(), historyVO.bookBean.getBookId()); 32 | } 33 | 34 | 35 | @Override 36 | public int hashCode() { 37 | return Objects.hash(bookBean.getBookId()); 38 | } 39 | 40 | public BookBean getBookBean() { 41 | return bookBean; 42 | } 43 | 44 | public void setBookBean(BookBean bookBean) { 45 | this.bookBean = bookBean; 46 | } 47 | } -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/model/vo/MyBookBillVO.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.model.vo; 2 | 3 | import com.rdc.bms.q_comic.base.BaseBookShelfVO; 4 | import com.rdc.bms.q_comic.bean.BookBillBean; 5 | 6 | import java.util.Objects; 7 | 8 | public class MyBookBillVO extends BaseBookShelfVO implements Cloneable { 9 | private BookBillBean bookBillBean; 10 | 11 | public MyBookBillVO(BookBillBean bookBillBean) { 12 | this.bookBillBean = bookBillBean; 13 | } 14 | 15 | @Override 16 | public MyBookBillVO clone(){ 17 | MyBookBillVO vo = null; 18 | try { 19 | vo = (MyBookBillVO) super.clone(); 20 | } catch (CloneNotSupportedException e) { 21 | e.printStackTrace(); 22 | } 23 | return vo; 24 | } 25 | 26 | @Override 27 | public boolean equals(Object o) { 28 | if (this == o) return true; 29 | if (o == null || getClass() != o.getClass()) return false; 30 | MyBookBillVO that = (MyBookBillVO) o; 31 | return Objects.equals(bookBillBean.getBookBillId(), that.bookBillBean.getBookBillId()); 32 | } 33 | 34 | @Override 35 | public int hashCode() { 36 | return Objects.hash(bookBillBean.getBookBillId()); 37 | } 38 | 39 | public BookBillBean getBookBillBean() { 40 | return bookBillBean; 41 | } 42 | 43 | public void setBookBillBean(BookBillBean bookBillBean) { 44 | this.bookBillBean = bookBillBean; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/presenter/BookBillPresenter.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.presenter; 2 | 3 | import android.util.Log; 4 | 5 | import com.rdc.bms.q_comic.base.BasePresenter; 6 | import com.rdc.bms.q_comic.mvp.model.dto.PageDTO; 7 | import com.rdc.bms.q_comic.mvp.contract.IBookListContract; 8 | import com.rdc.bms.q_comic.mvp.model.BookBillModel; 9 | import com.rdc.bms.q_comic.mvp.model.dto.BookListDTO; 10 | 11 | import io.reactivex.Observer; 12 | import io.reactivex.disposables.Disposable; 13 | 14 | public class BookBillPresenter extends BasePresenter 15 | implements IBookListContract.presenter { 16 | 17 | private BookBillModel mModel; 18 | 19 | private PageDTO mPageDTO; 20 | 21 | public BookBillPresenter(){ 22 | mModel = new BookBillModel(); 23 | mPageDTO = new PageDTO(2,0); 24 | } 25 | 26 | @Override 27 | public void getBookBillList(String tagName) { 28 | Log.d("BookBillPresenter", "getBookBillList: "+mPageDTO.toString()); 29 | if (mPageDTO.hasMore()){ 30 | mModel.getBookBillList(new Observer() { 31 | @Override 32 | public void onSubscribe(Disposable d) { 33 | 34 | } 35 | 36 | @Override 37 | public void onNext(BookListDTO bookListDTO) { 38 | mPageDTO = bookListDTO.getPageBean(); 39 | getMVPView().setBookList(bookListDTO.getBookListBeanList()); 40 | } 41 | 42 | @Override 43 | public void onError(Throwable e) { 44 | if(isAttachView()){ 45 | getMVPView().showError(e.getMessage()); 46 | } 47 | } 48 | 49 | @Override 50 | public void onComplete() { 51 | 52 | } 53 | },tagName, mPageDTO.getCurrentPage()+1); 54 | }else { 55 | if (isAttachView()){ 56 | getMVPView().setNoMore(); 57 | } 58 | } 59 | } 60 | 61 | @Override 62 | public void clearFlag() { 63 | mPageDTO = new PageDTO(2,0); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/presenter/HomePresenter.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.presenter; 2 | 3 | import com.rdc.bms.q_comic.base.BasePresenter; 4 | import com.rdc.bms.q_comic.mvp.contract.IHomeContract; 5 | import com.rdc.bms.q_comic.mvp.model.BookModel; 6 | import com.rdc.bms.q_comic.mvp.model.dto.HomePageDTO; 7 | 8 | import io.reactivex.Observer; 9 | import io.reactivex.disposables.Disposable; 10 | 11 | public class HomePresenter extends BasePresenter implements IHomeContract.Presenter { 12 | 13 | private BookModel mBookModel; 14 | 15 | public HomePresenter(){ 16 | mBookModel = new BookModel(); 17 | } 18 | 19 | 20 | @Override 21 | public void getHomePageData() { 22 | mBookModel.getHomePageData(new Observer() { 23 | @Override 24 | public void onSubscribe(Disposable d) { 25 | 26 | } 27 | 28 | @Override 29 | public void onNext(HomePageDTO homePageDTO) { 30 | if (isAttachView()){ 31 | getMVPView().showData(homePageDTO.getBannerList(),homePageDTO.getItemList()); 32 | } 33 | } 34 | 35 | @Override 36 | public void onError(Throwable e) { 37 | if (isAttachView()){ 38 | getMVPView().onError(e.getMessage()); 39 | } 40 | } 41 | 42 | @Override 43 | public void onComplete() { 44 | 45 | } 46 | }); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/presenter/MainPresenter.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.presenter; 2 | 3 | import com.rdc.bms.q_comic.base.BasePresenter; 4 | import com.rdc.bms.q_comic.mvp.contract.IMainContract; 5 | import com.rdc.bms.q_comic.mvp.model.BookModel; 6 | 7 | import java.util.List; 8 | 9 | import io.reactivex.Observer; 10 | import io.reactivex.disposables.Disposable; 11 | 12 | public class MainPresenter extends BasePresenter 13 | implements IMainContract.Presenter { 14 | 15 | private BookModel mBookModel; 16 | 17 | public MainPresenter(){ 18 | mBookModel = new BookModel(); 19 | } 20 | 21 | @Override 22 | public void getKindTitleList() { 23 | mBookModel.getKindTitleList(new Observer>() { 24 | @Override 25 | public void onSubscribe(Disposable d) { 26 | 27 | } 28 | 29 | @Override 30 | public void onNext(List strings) { 31 | if (isAttachView()){ 32 | getMVPView().setKindTitle(strings); 33 | } 34 | } 35 | 36 | @Override 37 | public void onError(Throwable e) { 38 | 39 | } 40 | 41 | @Override 42 | public void onComplete() { 43 | 44 | } 45 | }); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/presenter/RankPresenter.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.presenter; 2 | 3 | import com.rdc.bms.q_comic.base.BasePresenter; 4 | import com.rdc.bms.q_comic.bean.RankBean; 5 | import com.rdc.bms.q_comic.mvp.contract.IRankContract; 6 | import com.rdc.bms.q_comic.mvp.model.BookModel; 7 | 8 | import java.util.List; 9 | 10 | import io.reactivex.Observer; 11 | import io.reactivex.disposables.Disposable; 12 | 13 | public class RankPresenter extends BasePresenter 14 | implements IRankContract.Presenter { 15 | 16 | private BookModel mBookModel; 17 | 18 | public RankPresenter(){ 19 | mBookModel = new BookModel(); 20 | } 21 | 22 | @Override 23 | public void getRankData(int kind) { 24 | mBookModel.getRankData(new Observer>() { 25 | @Override 26 | public void onSubscribe(Disposable d) { 27 | 28 | } 29 | 30 | @Override 31 | public void onNext(List rankBeans) { 32 | if (isAttachView()){ 33 | getMVPView().setRankData(rankBeans); 34 | } 35 | } 36 | 37 | @Override 38 | public void onError(Throwable e) { 39 | if (isAttachView()){ 40 | getMVPView().onError(e.getMessage()); 41 | } 42 | } 43 | 44 | @Override 45 | public void onComplete() { 46 | 47 | } 48 | },kind); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/presenter/TypePresenter.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.presenter; 2 | 3 | import com.rdc.bms.q_comic.base.BasePresenter; 4 | import com.rdc.bms.q_comic.bean.TypeBean; 5 | import com.rdc.bms.q_comic.mvp.contract.ITypeContract; 6 | import com.rdc.bms.q_comic.mvp.model.BookModel; 7 | 8 | import java.util.List; 9 | 10 | import io.reactivex.Observer; 11 | import io.reactivex.disposables.Disposable; 12 | 13 | public class TypePresenter extends BasePresenter implements ITypeContract.Presenter { 14 | 15 | private BookModel mBookModel; 16 | 17 | public TypePresenter(){ 18 | mBookModel = new BookModel(); 19 | } 20 | 21 | @Override 22 | public void getTypeList(int kind) { 23 | mBookModel.getTypeBeanList(new Observer>() { 24 | @Override 25 | public void onSubscribe(Disposable d) { 26 | 27 | } 28 | 29 | @Override 30 | public void onNext(List typeBeans) { 31 | if (isAttachView()){ 32 | getMVPView().setTypeList(typeBeans); 33 | } 34 | } 35 | 36 | @Override 37 | public void onError(Throwable e) { 38 | if (isAttachView()){ 39 | getMVPView().onError(e.getMessage()); 40 | } 41 | } 42 | 43 | @Override 44 | public void onComplete() { 45 | 46 | } 47 | },kind); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/view/activity/LaunchActivity.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.view.activity; 2 | 3 | import android.os.Handler; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.os.Bundle; 6 | 7 | import com.rdc.bms.q_comic.R; 8 | import com.rdc.bms.q_comic.base.BaseActivity; 9 | import com.rdc.bms.q_comic.base.BasePresenter; 10 | import com.rdc.bms.q_comic.util.StartActUtil; 11 | 12 | public class LaunchActivity extends BaseActivity { 13 | 14 | @Override 15 | protected void onCreate(Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | setContentView(R.layout.activity_launch); 18 | } 19 | 20 | @Override 21 | protected int setLayoutResID() { 22 | return R.layout.activity_launch; 23 | } 24 | 25 | @Override 26 | protected BasePresenter getInstance() { 27 | return null; 28 | } 29 | 30 | @Override 31 | protected void initData(Bundle savedInstanceState) { 32 | new Thread(new Runnable() { 33 | @Override 34 | public void run() { 35 | try { 36 | Thread.sleep(1500); 37 | } catch (InterruptedException e) { 38 | e.printStackTrace(); 39 | }finally { 40 | StartActUtil.toMainAct(LaunchActivity.this); 41 | finish(); 42 | } 43 | } 44 | }).start(); 45 | } 46 | 47 | @Override 48 | protected void initView() { 49 | 50 | } 51 | 52 | @Override 53 | protected void initListener() { 54 | 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/view/activity/SearchResultActivity.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.view.activity; 2 | 3 | import android.content.Intent; 4 | import android.support.v4.app.FragmentTransaction; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | import android.widget.ImageView; 8 | import android.widget.TextView; 9 | 10 | import com.rdc.bms.q_comic.R; 11 | import com.rdc.bms.q_comic.base.BaseActivity; 12 | import com.rdc.bms.q_comic.base.BasePresenter; 13 | import com.rdc.bms.q_comic.mvp.view.fragment.SearchResultFragment; 14 | 15 | import butterknife.BindView; 16 | 17 | public class SearchResultActivity extends BaseActivity { 18 | 19 | @BindView(R.id.iv_back_layout_top) 20 | ImageView mIvBack; 21 | @BindView(R.id.tv_title_layout_top) 22 | TextView mTvTitle; 23 | 24 | private String mTitle; 25 | 26 | @Override 27 | protected void onCreate(Bundle savedInstanceState) { 28 | super.onCreate(savedInstanceState); 29 | } 30 | 31 | @Override 32 | protected int setLayoutResID() { 33 | return R.layout.activity_search_result; 34 | } 35 | 36 | @Override 37 | protected BasePresenter getInstance() { 38 | return null; 39 | } 40 | 41 | @Override 42 | protected void initData(Bundle savedInstanceState) { 43 | 44 | } 45 | 46 | @Override 47 | protected void initView() { 48 | Intent intent = getIntent(); 49 | if (intent != null){ 50 | mTitle = intent.getStringExtra("title"); 51 | SearchResultFragment f = new SearchResultFragment(); 52 | f.setData(intent.getStringExtra("type"), 53 | intent.getStringExtra("key")); 54 | FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 55 | transaction.replace(R.id.fl_root_act_type_detail,f); 56 | transaction.commit(); 57 | } 58 | } 59 | 60 | @Override 61 | protected void initListener() { 62 | mIvBack.setOnClickListener(new View.OnClickListener() { 63 | @Override 64 | public void onClick(View v) { 65 | onBackPressed(); 66 | } 67 | }); 68 | mTvTitle.setText(mTitle); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/mvp/view/fragment/MineFragment.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.mvp.view.fragment; 2 | 3 | import android.os.Bundle; 4 | 5 | import com.rdc.bms.q_comic.R; 6 | import com.rdc.bms.q_comic.base.BaseFragment; 7 | import com.rdc.bms.q_comic.base.BaseLazyFragment; 8 | import com.rdc.bms.q_comic.base.BasePresenter; 9 | 10 | public class MineFragment extends BaseLazyFragment { 11 | @Override 12 | protected BasePresenter getInstance() { 13 | return null; 14 | } 15 | 16 | @Override 17 | protected int setLayoutResourceId() { 18 | return R.layout.fragment_mine; 19 | } 20 | 21 | @Override 22 | protected void initData(Bundle bundle) { 23 | 24 | } 25 | 26 | @Override 27 | protected void initView() { 28 | 29 | } 30 | 31 | @Override 32 | protected void setListener() { 33 | 34 | } 35 | 36 | @Override 37 | protected void lazyLoad() { 38 | if (!isVisible || !isPrepared || isLoaded){ 39 | return; 40 | } 41 | 42 | isLoaded = true; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/util/ActivityCollectorUtil.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.util; 2 | 3 | import android.app.Activity; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | 9 | /** 10 | * Created by Lin Yaotian on 2018/4/15. 11 | */ 12 | 13 | public class ActivityCollectorUtil { 14 | 15 | private static List activities = new ArrayList<>(); 16 | 17 | public static void addActivity(Activity activity){ 18 | activities.add(activity); 19 | } 20 | 21 | public static void removeActivity(Activity activity){ 22 | activities.remove(activity); 23 | } 24 | 25 | public static void finishAll(){ 26 | for (Activity activity : activities) { 27 | if (!activity.isFinishing()){ 28 | activity.finish(); 29 | } 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/util/AnimateUtil.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.util; 2 | 3 | import android.widget.ImageView; 4 | 5 | import com.rdc.bms.q_comic.R; 6 | 7 | public class AnimateUtil { 8 | /** 9 | * 点击喜欢时的动画 10 | * @param view 11 | * @param isLike 目前的状态(没点击前) 12 | */ 13 | public static void likeAnimate(final ImageView view, boolean isLike) { 14 | if (isLike){ 15 | //取消喜欢 16 | view.setImageResource(R.drawable.svg_red_like_normal); 17 | }else { 18 | //喜欢 19 | view.setImageResource(R.drawable.svg_red_like_pressed); 20 | } 21 | view.animate().scaleX(1.5f).scaleY(1.5f).withEndAction(new Runnable() { 22 | @Override 23 | public void run() { 24 | view.animate().scaleX(1f).scaleY(1f); 25 | } 26 | }); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/util/GlideUtil.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.util; 2 | 3 | import android.content.Context; 4 | import android.widget.ImageView; 5 | 6 | public class GlideUtil { 7 | 8 | 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/util/RetrofitUtil.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.util; 2 | 3 | import com.google.gson.Gson; 4 | 5 | import java.util.concurrent.TimeUnit; 6 | 7 | import okhttp3.OkHttpClient; 8 | import retrofit2.Retrofit; 9 | import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; 10 | import retrofit2.converter.gson.GsonConverterFactory; 11 | 12 | /** 13 | * Created by yyj on 2018/07/31. email: 2209011667@qq.com 14 | */ 15 | 16 | public class RetrofitUtil { 17 | public static Retrofit bind(String BASE_URL) { 18 | 19 | Retrofit retrofit = new Retrofit.Builder() 20 | .baseUrl(BASE_URL) 21 | .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 22 | .addConverterFactory(GsonConverterFactory.create()) 23 | .client(getClient()) 24 | .build(); 25 | 26 | return retrofit; 27 | } 28 | 29 | public static Retrofit bind(String BASE_URL, Gson gson) { 30 | 31 | Retrofit retrofit = new Retrofit.Builder() 32 | .baseUrl(BASE_URL) 33 | .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 34 | .addConverterFactory(GsonConverterFactory.create(gson)) 35 | .client(getClient()) 36 | .build(); 37 | 38 | return retrofit; 39 | } 40 | 41 | private static OkHttpClient getClient() { 42 | OkHttpClient.Builder builder = new OkHttpClient().newBuilder() 43 | .connectTimeout(10, TimeUnit.SECONDS)//设置超时时间 44 | .readTimeout(10, TimeUnit.SECONDS)//设置读取超时时间 45 | .writeTimeout(10, TimeUnit.SECONDS);//设置写入超时时间 46 | OkHttpClient mOkHttpClient = builder.build(); 47 | return mOkHttpClient; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/util/diffutil/BookBillDiffUtil.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.util.diffutil; 2 | 3 | import android.support.annotation.Nullable; 4 | import android.support.v7.util.DiffUtil; 5 | 6 | import com.rdc.bms.q_comic.bean.BookBillBean; 7 | import com.rdc.bms.q_comic.bean.rv_cell.MyBookBillCell; 8 | import com.rdc.bms.q_comic.mvp.model.vo.MyBookBillVO; 9 | 10 | import java.util.List; 11 | 12 | public class BookBillDiffUtil extends DiffUtil.Callback { 13 | private List mOldDatas,mNewDatas; 14 | 15 | public BookBillDiffUtil(List mOldDatas, List mNewDatas) { 16 | this.mOldDatas = mOldDatas; 17 | this.mNewDatas = mNewDatas; 18 | } 19 | 20 | @Override 21 | public int getOldListSize() { 22 | return mOldDatas == null?0:mOldDatas.size(); 23 | } 24 | 25 | @Override 26 | public int getNewListSize() { 27 | return mNewDatas==null?0:mNewDatas.size(); 28 | } 29 | 30 | @Override 31 | public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { 32 | return mNewDatas.get(newItemPosition).getBookBillBean().getBookBillId() 33 | .equals(mOldDatas.get(oldItemPosition).getBookBillBean().getBookBillId()); 34 | } 35 | 36 | @Override 37 | public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { 38 | MyBookBillVO oldItem = mOldDatas.get(oldItemPosition); 39 | MyBookBillVO newItem = mNewDatas.get(newItemPosition); 40 | return oldItem.isSelect() == newItem.isSelect() 41 | && oldItem.isStartSelect() == newItem.isStartSelect() 42 | && oldItem.getBookBillBean().getNum() == newItem.getBookBillBean().getNum() 43 | && oldItem.getBookBillBean().getTitle().equals(newItem.getBookBillBean().getTitle()) 44 | && newItem.getBookBillBean().getBookIdList().containsAll(oldItem.getBookBillBean().getBookIdList()); 45 | } 46 | 47 | @Nullable 48 | @Override 49 | public Object getChangePayload(int oldItemPosition, int newItemPosition) { 50 | return super.getChangePayload(oldItemPosition, newItemPosition); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/util/diffutil/ChapterDiffUtil.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.util.diffutil; 2 | 3 | import android.support.annotation.Nullable; 4 | import android.support.v7.util.DiffUtil; 5 | 6 | import com.rdc.bms.q_comic.bean.ChapterBean; 7 | import com.rdc.bms.q_comic.bean.ComicBean; 8 | 9 | import java.util.List; 10 | 11 | public class ChapterDiffUtil extends DiffUtil.Callback{ 12 | 13 | private List mOldDatas,mNewDatas; 14 | 15 | public ChapterDiffUtil(List mOldDatas, List mNewDatas) { 16 | this.mOldDatas = mOldDatas; 17 | this.mNewDatas = mNewDatas; 18 | } 19 | 20 | @Override 21 | public int getOldListSize() { 22 | return mOldDatas == null?0:mOldDatas.size(); 23 | } 24 | 25 | @Override 26 | public int getNewListSize() { 27 | return mNewDatas==null?0:mNewDatas.size(); 28 | } 29 | 30 | @Override 31 | public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { 32 | return mNewDatas.get(newItemPosition).getChapterId() 33 | == (mOldDatas.get(oldItemPosition).getChapterId()); 34 | } 35 | 36 | @Override 37 | public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { 38 | return mNewDatas.get(newItemPosition).isRead() == 39 | mOldDatas.get(oldItemPosition).isRead(); 40 | } 41 | 42 | @Nullable 43 | @Override 44 | public Object getChangePayload(int oldItemPosition, int newItemPosition) { 45 | return super.getChangePayload(oldItemPosition, newItemPosition); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/util/diffutil/CollectDiffUtil.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.util.diffutil; 2 | 3 | import android.support.annotation.Nullable; 4 | import android.support.v7.util.DiffUtil; 5 | 6 | import com.rdc.bms.q_comic.bean.BookBean; 7 | import com.rdc.bms.q_comic.mvp.model.vo.CollectVO; 8 | 9 | import java.util.List; 10 | 11 | public class CollectDiffUtil extends DiffUtil.Callback { 12 | private List mOldDatas,mNewDatas; 13 | 14 | public CollectDiffUtil(List mOldDatas, List mNewDatas) { 15 | this.mOldDatas = mOldDatas; 16 | this.mNewDatas = mNewDatas; 17 | } 18 | 19 | @Override 20 | public int getOldListSize() { 21 | return mOldDatas == null?0:mOldDatas.size(); 22 | } 23 | 24 | @Override 25 | public int getNewListSize() { 26 | return mNewDatas==null?0:mNewDatas.size(); 27 | } 28 | 29 | @Override 30 | public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { 31 | return mNewDatas.get(newItemPosition).getBookBean().getBookId() 32 | .equals(mOldDatas.get(oldItemPosition).getBookBean().getBookId()); 33 | } 34 | 35 | @Override 36 | public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { 37 | CollectVO newItem = mNewDatas.get(newItemPosition); 38 | CollectVO oldItem = mOldDatas.get(oldItemPosition); 39 | return oldItem.isStartSelect() == newItem.isStartSelect() 40 | && oldItem.isSelect() == newItem.isSelect() 41 | && newItem.getBookBean().getLastRecordChapterId() == (oldItem.getBookBean().getLastRecordChapterId()) 42 | && newItem.getBookBean().isUpdate() == oldItem.getBookBean().isUpdate() 43 | && newItem.getBookBean().getRecentChapter().equals((oldItem.getBookBean().getRecentChapter())); 44 | } 45 | 46 | @Nullable 47 | @Override 48 | public Object getChangePayload(int oldItemPosition, int newItemPosition) { 49 | return super.getChangePayload(oldItemPosition, newItemPosition); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/util/diffutil/ComicDiffUtil.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.util.diffutil; 2 | 3 | import android.support.annotation.Nullable; 4 | import android.support.v7.util.DiffUtil; 5 | 6 | import com.rdc.bms.q_comic.bean.ComicBean; 7 | 8 | import java.util.List; 9 | 10 | public class ComicDiffUtil extends DiffUtil.Callback{ 11 | 12 | private List mOldDatas,mNewDatas; 13 | 14 | public ComicDiffUtil(List mOldDatas, List mNewDatas) { 15 | this.mOldDatas = mOldDatas; 16 | this.mNewDatas = mNewDatas; 17 | } 18 | 19 | @Override 20 | public int getOldListSize() { 21 | return mOldDatas == null?0:mOldDatas.size(); 22 | } 23 | 24 | @Override 25 | public int getNewListSize() { 26 | return mNewDatas==null?0:mNewDatas.size(); 27 | } 28 | 29 | @Override 30 | public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { 31 | return mNewDatas.get(newItemPosition).getComicId() 32 | .equals(mOldDatas.get(oldItemPosition).getComicId()); 33 | } 34 | 35 | @Override 36 | public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { 37 | return mNewDatas.get(newItemPosition).getImageUrl() 38 | .equals(mOldDatas.get(oldItemPosition).getImageUrl()); 39 | } 40 | 41 | @Nullable 42 | @Override 43 | public Object getChangePayload(int oldItemPosition, int newItemPosition) { 44 | return super.getChangePayload(oldItemPosition, newItemPosition); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/util/diffutil/HistoryDiffUtil.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.util.diffutil; 2 | 3 | import android.support.annotation.Nullable; 4 | import android.support.v7.util.DiffUtil; 5 | 6 | import com.rdc.bms.q_comic.mvp.model.vo.CollectVO; 7 | import com.rdc.bms.q_comic.mvp.model.vo.HistoryVO; 8 | 9 | import java.util.List; 10 | 11 | public class HistoryDiffUtil extends DiffUtil.Callback { 12 | private List mOldDatas,mNewDatas; 13 | 14 | public HistoryDiffUtil(List mOldDatas, List mNewDatas) { 15 | this.mOldDatas = mOldDatas; 16 | this.mNewDatas = mNewDatas; 17 | } 18 | 19 | @Override 20 | public int getOldListSize() { 21 | return mOldDatas == null?0:mOldDatas.size(); 22 | } 23 | 24 | @Override 25 | public int getNewListSize() { 26 | return mNewDatas==null?0:mNewDatas.size(); 27 | } 28 | 29 | @Override 30 | public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { 31 | return mNewDatas.get(newItemPosition).getBookBean().getBookId() 32 | .equals(mOldDatas.get(oldItemPosition).getBookBean().getBookId()); 33 | } 34 | 35 | @Override 36 | public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { 37 | HistoryVO newItem = mNewDatas.get(newItemPosition); 38 | HistoryVO oldItem = mOldDatas.get(oldItemPosition); 39 | return oldItem.isStartSelect() == newItem.isStartSelect() 40 | && oldItem.isSelect() == newItem.isSelect() 41 | && newItem.getBookBean().getLastRecordChapterId() == (oldItem.getBookBean().getLastRecordChapterId()) 42 | && newItem.getBookBean().getRecentChapter().equals((oldItem.getBookBean().getRecentChapter())); 43 | } 44 | 45 | @Nullable 46 | @Override 47 | public Object getChangePayload(int oldItemPosition, int newItemPosition) { 48 | return super.getChangePayload(oldItemPosition, newItemPosition); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/util/fileprovider.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.util; 2 | 3 | import android.support.v4.content.FileProvider; 4 | 5 | public class fileprovider extends FileProvider { 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/widget/NoScrollViewPager.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.widget; 2 | 3 | import android.content.Context; 4 | import android.support.annotation.NonNull; 5 | import android.support.annotation.Nullable; 6 | import android.support.v4.view.ViewPager; 7 | import android.util.AttributeSet; 8 | import android.view.MotionEvent; 9 | 10 | public class NoScrollViewPager extends ViewPager { 11 | private boolean isScroll; 12 | 13 | public NoScrollViewPager(@NonNull Context context, @Nullable AttributeSet attrs) { 14 | super(context, attrs); 15 | } 16 | 17 | public NoScrollViewPager(Context context) { 18 | super(context); 19 | } 20 | /** 21 | * 1.dispatchTouchEvent一般情况不做处理 22 | *,如果修改了默认的返回值,子孩子都无法收到事件 23 | */ 24 | @Override 25 | public boolean dispatchTouchEvent(MotionEvent ev) { 26 | return super.dispatchTouchEvent(ev); // return true;不行 27 | } 28 | /** 29 | * 是否拦截 30 | * 拦截:会走到自己的onTouchEvent方法里面来 31 | * 不拦截:事件传递给子孩子 32 | */ 33 | @Override 34 | public boolean onInterceptTouchEvent(MotionEvent ev) { 35 | // return false;//可行,不拦截事件, 36 | // return true;//不行,孩子无法处理事件 37 | //return super.onInterceptTouchEvent(ev);//不行,会有细微移动 38 | if (isScroll){ 39 | return super.onInterceptTouchEvent(ev); 40 | }else{ 41 | return false; 42 | } 43 | } 44 | 45 | /** 46 | * 是否消费事件 47 | * 消费:事件就结束 48 | * 不消费:往父控件传 49 | */ 50 | @Override 51 | public boolean onTouchEvent(MotionEvent ev) { 52 | //return false;// 可行,不消费,传给父控件 53 | //return true;// 可行,消费,拦截事件 54 | //super.onTouchEvent(ev); //不行, 55 | //虽然onInterceptTouchEvent中拦截了, 56 | //但是如果viewpage里面子控件不是viewgroup,还是会调用这个方法. 57 | if (isScroll){ 58 | return super.onTouchEvent(ev); 59 | }else { 60 | return true;// 可行,消费,拦截事件 61 | } 62 | } 63 | public void setScroll(boolean scroll) { 64 | isScroll = scroll; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /app/src/main/java/com/rdc/bms/q_comic/widget/ViewPagerForScrollView.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic.widget; 2 | 3 | import android.content.Context; 4 | import android.support.v4.view.ViewPager; 5 | import android.util.AttributeSet; 6 | import android.view.View; 7 | 8 | public class ViewPagerForScrollView extends ViewPager { 9 | public ViewPagerForScrollView(Context context) { 10 | super(context); 11 | } 12 | 13 | public ViewPagerForScrollView(Context context, AttributeSet attrs) { 14 | super(context, attrs); 15 | } 16 | 17 | @Override 18 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 19 | 20 | int height = 0; 21 | for (int i = 0; i < getChildCount(); i++) { 22 | View child = getChildAt(i); 23 | child.measure(widthMeasureSpec, View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 24 | int h = child.getMeasuredHeight(); 25 | if (h > height) 26 | height = h; 27 | } 28 | 29 | heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY); 30 | 31 | super.onMeasure(widthMeasureSpec, heightMeasureSpec); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/res/color/color_state_menu_navi.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /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/drawable-xhdpi/bg_hot_key_blue.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/bg_hot_key_light_green.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/bg_hot_key_orange.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/bg_hot_key_purple.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/bg_support_statistics_green.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/bg_support_statistics_orange.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_ach_award.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/ic_ach_award.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_ach_gift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/ic_ach_gift.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_ach_gradle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/ic_ach_gradle.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_ach_month.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/ic_ach_month.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_ach_recommend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/ic_ach_recommend.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_ach_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/ic_ach_share.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_read_brightness_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/ic_read_brightness_b.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_read_catalog_ic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/ic_read_catalog_ic.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_read_catalog_order.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/ic_read_catalog_order.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_read_catalog_reverse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/ic_read_catalog_reverse.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_read_definition_high.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/ic_read_definition_high.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_read_definition_low.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/ic_read_definition_low.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_read_definition_middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/ic_read_definition_middle.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_read_set.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/ic_read_set.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_read_start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/ic_read_start.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_read_stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/ic_read_stop.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/icon_chapter_read.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/icon_chapter_read.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/pic_load_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/pic_load_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_arrow_bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_arrow_bottom.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_arrow_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_arrow_left.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_arrow_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_arrow_right.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_arrow_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_arrow_top.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_author_dk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_author_dk.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_author_xr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_author_xr.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_blue_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_blue_share.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_clock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_clock.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_fire_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_fire_grey.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_fire_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_fire_red.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_fire_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_fire_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_money_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_money_grey.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_money_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_money_red.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_money_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_money_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_orange_comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_orange_comment.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_red_book_count.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_red_book_count.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_red_like_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_red_like_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_red_like_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_red_like_pressed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_red_nav_bar_love.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_red_nav_bar_love.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_red_normal_like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_red_normal_like.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_red_point.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_red_point.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_red_pressed_like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_red_pressed_like.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_red_select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_red_select.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_red_work.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_red_work.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_tab_bar_find.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_tab_bar_find.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_tab_bar_find_hl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_tab_bar_find_hl.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_tab_bar_homepage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_tab_bar_homepage.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_tab_bar_kind.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_tab_bar_kind.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_tab_bar_kind_hl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_tab_bar_kind_hl.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_tab_bar_main_hl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_tab_bar_main_hl.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_tab_bar_mine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_tab_bar_mine.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_tab_bar_mine_hl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_tab_bar_mine_hl.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_ticket_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_ticket_grey.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_ticket_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_ticket_red.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_ticket_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_ticket_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_white_nav_bar_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_white_nav_bar_back.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_white_nav_bar_love.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_white_nav_bar_love.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_white_normal_like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_white_normal_like.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_white_pressed_like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_white_pressed_like.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/svg_white_select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable-xhdpi/svg_white_select.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_black_transparent.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_book_bill_detail_head.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_btn_chapter.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_btn_offline_cache.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_btn_start_read.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_edittext_search.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_hot_key_dark_green.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_hot_key_red.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_oval_stroke.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_support_statistics_red.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_tag_black.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/black_oval_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reader_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/drawable/ic_reader_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_tab_bookshelf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_tab_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_tab_kind.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_tab_mine.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_launch.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 24 | 25 | 36 | 37 | 52 | 53 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 18 | 19 | 20 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_search_result.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 13 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/cell_banner.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/cell_book_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 17 | 18 | 29 | 30 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/res/layout/cell_chapter_num.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 23 | 24 | 32 | 33 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/res/layout/cell_comic.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | 15 | 16 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/cell_dir.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 17 | 18 | 25 | 34 | 35 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /app/src/main/res/layout/cell_statistic.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 25 | 26 | 40 | 41 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /app/src/main/res/layout/cell_type.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 15 | 16 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_mine.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_tab_detail.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_type.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | 17 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_type_detail.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 14 | 15 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/hotkey_tagflowlayout.xml: -------------------------------------------------------------------------------- 1 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_check.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 17 | 18 | 26 | 27 | 31 | 32 | 40 | 41 | 42 | 43 | 44 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_comic_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 17 | 18 | 29 | 30 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_select.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_top.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | 23 | 24 | 36 | 37 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /app/src/main/res/layout/loading_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 26 | 27 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/res/layout/tag_tagflowlayout.xml: -------------------------------------------------------------------------------- 1 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/menu/main_bottom_menus.xml: -------------------------------------------------------------------------------- 1 | 2 |

3 | 6 | 9 | 12 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/icon_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/mipmap-hdpi/icon_new.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/icon_ranking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/mipmap-hdpi/icon_ranking.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/point_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/mipmap-hdpi/point_0.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/point_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/mipmap-hdpi/point_1.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/svg_red_nav_bar_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/mipmap-hdpi/svg_red_nav_bar_back.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/mipmap-mdpi/ic_logo.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/pic_main_boy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/mipmap-mdpi/pic_main_boy.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/pic_main_girl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/mipmap-mdpi/pic_main_girl.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/svg_pic_list_dream.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/mipmap-mdpi/svg_pic_list_dream.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/svg_pic_list_fast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/mipmap-mdpi/svg_pic_list_fast.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/svg_pic_list_fire.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/mipmap-mdpi/svg_pic_list_fire.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/svg_pic_list_jd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/mipmap-mdpi/svg_pic_list_jd.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/svg_pic_list_love.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/mipmap-mdpi/svg_pic_list_love.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/svg_pic_list_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/mipmap-mdpi/svg_pic_list_new.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/svg_red_nav_bar_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/mipmap-mdpi/svg_red_nav_bar_search.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/svg_white_nav_bar_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/app/src/main/res/mipmap-mdpi/svg_white_nav_bar_search.png -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | @color/colorRed 4 | @color/colorRed 5 | @color/colorRed 6 | 7 | #ffffff 8 | #f3bd7e 9 | #F36653 10 | #7BC730 11 | #00CEBB 12 | #FFA742 13 | #5DBDFF 14 | #A1A8FF 15 | #ff3399 16 | #00bbff 17 | #979797 18 | #f6c90d 19 | #a7734b 20 | #000000 21 | #787878 22 | 23 | #00000000 24 | 25 | #eeeeff 26 | #fc7365 27 | #ff9f71 28 | #ffc477 29 | #f5f5f5 30 | #55000000 31 | #96000000 32 | #c7f36653 33 | #c7000000 34 | #d4ffffff 35 | 36 | #FC6352 37 | #FEE0DD 38 | #0AE1B5 39 | #CCF9F0 40 | #FF9116 41 | #FDF3D5 42 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimen.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 15sp 4 | 18sp 5 | 22sp 6 | 13sp 7 | 11sp 8 | 9 | 75dp 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Q漫 3 | 4 | 5 | 本程序仅供学习参考使用,严禁任何商业用途 6 | 更多 7 | 推荐 8 | 最新 9 | 排行 10 | 热门 11 | 刷新 12 | 可按 漫画名 或 漫画家 搜索 13 | 热门搜索 14 | 搜索历史 15 | 离线缓存 16 | 开始阅读 17 | 最后更新: 18 | 升序 19 | 上一页 20 | 下一页 21 | 相关推荐 22 | 剧情简介 23 | 作者信息 24 | 作者公告 25 | 粉丝影响力 26 | 降序 27 | 设置 28 | 自动 29 | 画质 30 | 亮度 31 | 目录 32 | 正序 33 | 编辑 34 | 更新 35 | 全选 36 | 删除 37 | 38 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 14 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/test/java/com/rdc/bms/q_comic/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.q_comic; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | 5 | repositories { 6 | google() 7 | jcenter() 8 | } 9 | dependencies { 10 | classpath 'com.android.tools.build:gradle:3.2.1' 11 | 12 | 13 | // NOTE: Do not place your application dependencies here; they belong 14 | // in the individual module build.gradle files 15 | } 16 | } 17 | 18 | allprojects { 19 | repositories { 20 | google() 21 | jcenter() 22 | maven { url 'https://jitpack.io' } 23 | } 24 | } 25 | 26 | task clean(type: Delete) { 27 | delete rootProject.buildDir 28 | } 29 | -------------------------------------------------------------------------------- /easy_rv_adapter/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /easy_rv_adapter/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 27 5 | 6 | 7 | 8 | defaultConfig { 9 | minSdkVersion 21 10 | targetSdkVersion 27 11 | versionCode 1 12 | versionName "1.0" 13 | 14 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 15 | 16 | } 17 | 18 | buildTypes { 19 | release { 20 | minifyEnabled false 21 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 22 | } 23 | } 24 | 25 | } 26 | 27 | dependencies { 28 | implementation fileTree(dir: 'libs', include: ['*.jar']) 29 | implementation 'com.android.support:recyclerview-v7:27.1.1' 30 | implementation 'com.android.support:appcompat-v7:27.1.1' 31 | implementation 'com.android.support.constraint:constraint-layout:1.1.3' 32 | implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.5.1' 33 | testImplementation 'junit:junit:4.12' 34 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 35 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 36 | } 37 | -------------------------------------------------------------------------------- /easy_rv_adapter/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 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/androidTest/java/com/rdc/bms/easy_rv_adapter/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.easy_rv_adapter; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.rdc.bms.easy_rv_adapter.test", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/java/com/rdc/bms/easy_rv_adapter/OnClickViewRvListener.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.easy_rv_adapter; 2 | 3 | import android.view.View; 4 | 5 | import com.rdc.bms.easy_rv_adapter.base.BaseRvViewHolder; 6 | 7 | public interface OnClickViewRvListener { 8 | /** 9 | * RecyclerView中点击了Item中的View 10 | * @param view 11 | * @param view 12 | */ 13 | void onClick(View view,int position); 14 | 15 | void onClickItem(C data,int position); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/java/com/rdc/bms/easy_rv_adapter/Utils.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.easy_rv_adapter; 2 | 3 | import android.content.Context; 4 | 5 | public class Utils { 6 | /** 7 | * dp 转换 px 8 | * @param context 9 | * @param dip 10 | * @return 11 | */ 12 | public static int dpToPx(Context context, float dip) { 13 | final float SCALE = context.getResources().getDisplayMetrics().density; 14 | float valueDips = dip; 15 | int valuePixels = (int) (valueDips * SCALE + 0.5f); 16 | return valuePixels; 17 | } 18 | 19 | 20 | } 21 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/java/com/rdc/bms/easy_rv_adapter/base/BaseRvCell.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.easy_rv_adapter.base; 2 | 3 | 4 | import android.content.Context; 5 | import android.support.v7.widget.RecyclerView; 6 | import android.view.LayoutInflater; 7 | import android.view.ViewGroup; 8 | 9 | import com.rdc.bms.easy_rv_adapter.OnClickViewRvListener; 10 | 11 | public abstract class BaseRvCell implements Cell { 12 | 13 | public T mData; 14 | 15 | public OnClickViewRvListener mListener; 16 | 17 | public final BaseRvViewHolder createSimpleHolder(ViewGroup parent,int layoutResId){ 18 | return new BaseRvViewHolder(LayoutInflater.from(parent.getContext()) 19 | .inflate(layoutResId,parent,false)); 20 | } 21 | 22 | @Override 23 | public long getItemId(int position) { 24 | return RecyclerView.NO_ID; 25 | } 26 | 27 | /** 28 | * 添加监听事件 29 | * @param mListener 30 | */ 31 | public void setListener(OnClickViewRvListener mListener) { 32 | this.mListener = mListener; 33 | } 34 | 35 | public BaseRvCell(T t){ 36 | mData = t; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/java/com/rdc/bms/easy_rv_adapter/base/BaseRvStateCell.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.easy_rv_adapter.base; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.LinearLayout; 8 | 9 | import com.rdc.bms.easy_rv_adapter.R; 10 | 11 | /** 12 | * 用于存放特殊的ItemCell, 13 | * 例如HeaderView,FooterView 14 | */ 15 | public abstract class BaseRvStateCell extends BaseRvCell { 16 | 17 | protected View mView; 18 | protected int mHeight = 0; 19 | 20 | public BaseRvStateCell(Object o) { 21 | super(o); 22 | } 23 | 24 | 25 | public void setHeight(int height) { 26 | mHeight = height; 27 | } 28 | 29 | public void setView(View view) { 30 | mView = view; 31 | } 32 | 33 | @Override 34 | public void releaseResource() { 35 | if(mView!=null){ 36 | mView = null; 37 | } 38 | } 39 | 40 | @Override 41 | public BaseRvViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 42 | View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rv_state_layout,null); 43 | //如果调用者没有设置显示的View就用默认的View 44 | if(mView == null){ 45 | mView = getDefaultView(parent.getContext()); 46 | } 47 | if(mView!=null){ 48 | LinearLayout container = view.findViewById(R.id.rv_cell_state_root_layout); 49 | container.removeAllViews(); 50 | container.addView(mView); 51 | } 52 | ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 53 | if(mHeight > 0){ 54 | params.height = mHeight; 55 | } 56 | view.setLayoutParams(params); 57 | return new BaseRvViewHolder(view); 58 | } 59 | 60 | /** 61 | * 子类提供的默认布局,当没有通过{@link #setView(View)}设置显示的View的时候,就显示默认的View 62 | * @return 返回默认布局 63 | */ 64 | protected abstract View getDefaultView(Context context); 65 | } 66 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/java/com/rdc/bms/easy_rv_adapter/base/BaseRvViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.easy_rv_adapter.base; 2 | 3 | import android.content.Context; 4 | import android.support.v7.widget.RecyclerView; 5 | import android.util.SparseArray; 6 | import android.view.View; 7 | import android.widget.Button; 8 | import android.widget.ImageView; 9 | import android.widget.TextView; 10 | 11 | public class BaseRvViewHolder extends RecyclerView.ViewHolder { 12 | 13 | private SparseArray views; 14 | private View mItemView; 15 | 16 | public BaseRvViewHolder(View itemView) { 17 | super(itemView); 18 | views = new SparseArray<>(); 19 | mItemView = itemView; 20 | } 21 | 22 | public Context getContext(){ 23 | return mItemView.getContext(); 24 | } 25 | 26 | /** 27 | * 获取 ItemView (这里指的是整个Item项) 28 | * @return 29 | */ 30 | public View getItemView(){ 31 | return mItemView; 32 | } 33 | 34 | public View getView(int resId){ 35 | return retrieveView(resId); 36 | } 37 | 38 | public TextView getTextView(int resId){ 39 | return retrieveView(resId); 40 | } 41 | 42 | public ImageView getImageView(int resId){ 43 | return retrieveView(resId); 44 | } 45 | 46 | public Button getButton(int resId){ 47 | return retrieveView(resId); 48 | } 49 | 50 | public void setText(int resId,CharSequence text){ 51 | getTextView(resId).setText(text); 52 | } 53 | 54 | public void setText(int resId,int strId){ 55 | getTextView(resId).setText(strId); 56 | } 57 | 58 | @SuppressWarnings("unchecked") 59 | protected V retrieveView(int viewId){ 60 | View view = views.get(viewId); 61 | if(view == null){ 62 | view = mItemView.findViewById(viewId); 63 | views.put(viewId,view); 64 | } 65 | return (V) view; 66 | } 67 | 68 | 69 | } 70 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/java/com/rdc/bms/easy_rv_adapter/base/Cell.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.easy_rv_adapter.base; 2 | 3 | import android.view.ViewGroup; 4 | 5 | public interface Cell { 6 | 7 | long getItemId(int position); 8 | 9 | /** 10 | * 回收资源 11 | */ 12 | void releaseResource(); 13 | 14 | /** 15 | * 获取 viewType 16 | * @return 17 | */ 18 | int getItemType(); 19 | 20 | /** 21 | * 创建 ViewHolder 22 | * @param parent 23 | * @param viewType 24 | * @return 25 | */ 26 | BaseRvViewHolder onCreateViewHolder(ViewGroup parent, int viewType); 27 | 28 | /** 29 | * 数据绑定 30 | * @param holder 31 | * @param position 32 | */ 33 | void onBindViewHolder(BaseRvViewHolder holder, int position); 34 | 35 | } 36 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/java/com/rdc/bms/easy_rv_adapter/cell/EmptyCell.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.easy_rv_adapter.cell; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | 8 | import com.rdc.bms.easy_rv_adapter.R; 9 | import com.rdc.bms.easy_rv_adapter.base.BaseRvCell; 10 | import com.rdc.bms.easy_rv_adapter.base.BaseRvStateCell; 11 | import com.rdc.bms.easy_rv_adapter.base.BaseRvViewHolder; 12 | import com.rdc.bms.easy_rv_adapter.config.ItemType; 13 | 14 | public class EmptyCell extends BaseRvStateCell { 15 | 16 | public EmptyCell(Object o) { 17 | super(o); 18 | } 19 | 20 | @Override 21 | public void releaseResource() { 22 | 23 | } 24 | 25 | @Override 26 | public int getItemType() { 27 | return ItemType.EMPTY_TYPE; 28 | } 29 | 30 | @Override 31 | protected View getDefaultView(Context context) { 32 | return LayoutInflater.from(context).inflate(R.layout.rv_empty_layout,null); 33 | } 34 | 35 | @Override 36 | public void onBindViewHolder(BaseRvViewHolder holder, int position) { 37 | 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/java/com/rdc/bms/easy_rv_adapter/cell/ErrorCell.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.easy_rv_adapter.cell; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | 7 | import com.rdc.bms.easy_rv_adapter.R; 8 | import com.rdc.bms.easy_rv_adapter.base.BaseRvStateCell; 9 | import com.rdc.bms.easy_rv_adapter.base.BaseRvViewHolder; 10 | import com.rdc.bms.easy_rv_adapter.config.ItemType; 11 | 12 | public class ErrorCell extends BaseRvStateCell { 13 | 14 | public ErrorCell(Object o) { 15 | super(o); 16 | } 17 | 18 | @Override 19 | protected View getDefaultView(Context context) { 20 | return LayoutInflater.from(context).inflate(R.layout.rv_error_layout,null); 21 | } 22 | 23 | @Override 24 | public int getItemType() { 25 | return ItemType.ERROR_TYPE; 26 | } 27 | 28 | @Override 29 | public void onBindViewHolder(BaseRvViewHolder holder, int position) { 30 | 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/java/com/rdc/bms/easy_rv_adapter/cell/LoadMoreCell.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.easy_rv_adapter.cell; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | 7 | import com.rdc.bms.easy_rv_adapter.R; 8 | import com.rdc.bms.easy_rv_adapter.Utils; 9 | import com.rdc.bms.easy_rv_adapter.base.BaseRvStateCell; 10 | import com.rdc.bms.easy_rv_adapter.base.BaseRvViewHolder; 11 | import com.rdc.bms.easy_rv_adapter.config.ItemType; 12 | 13 | public class LoadMoreCell extends BaseRvStateCell { 14 | public static final int mDefaultHeight = 80;//dp 15 | public LoadMoreCell(Object o) { 16 | super(o); 17 | } 18 | 19 | @Override 20 | public int getItemType() { 21 | return ItemType.LOAD_MORE_TYPE; 22 | } 23 | 24 | 25 | @Override 26 | public void onBindViewHolder(BaseRvViewHolder holder, int position) { 27 | 28 | } 29 | 30 | @Override 31 | protected View getDefaultView(Context context) { 32 | // 设置LoadMore View显示的默认高度 33 | setHeight(Utils.dpToPx(context,mDefaultHeight)); 34 | return LayoutInflater.from(context).inflate(R.layout.rv_load_more_layout,null); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/java/com/rdc/bms/easy_rv_adapter/cell/LoadingCell.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.easy_rv_adapter.cell; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | 7 | import com.rdc.bms.easy_rv_adapter.R; 8 | import com.rdc.bms.easy_rv_adapter.base.BaseRvStateCell; 9 | import com.rdc.bms.easy_rv_adapter.base.BaseRvViewHolder; 10 | import com.rdc.bms.easy_rv_adapter.config.ItemType; 11 | 12 | public class LoadingCell extends BaseRvStateCell { 13 | 14 | public LoadingCell(Object o) { 15 | super(o); 16 | } 17 | 18 | @Override 19 | public int getItemType() { 20 | return ItemType.LOADING_TYPE; 21 | } 22 | 23 | @Override 24 | public void onBindViewHolder(BaseRvViewHolder holder, int position) { 25 | 26 | } 27 | 28 | @Override 29 | protected View getDefaultView(Context context) { 30 | return LayoutInflater.from(context).inflate(R.layout.rv_loading_layout,null); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/java/com/rdc/bms/easy_rv_adapter/config/ItemType.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.easy_rv_adapter.config; 2 | 3 | public class ItemType { 4 | public static final int ERROR_TYPE = Integer.MAX_VALUE -1; 5 | public static final int EMPTY_TYPE = Integer.MAX_VALUE -2; 6 | public static final int LOADING_TYPE = Integer.MAX_VALUE -3; 7 | public static final int LOAD_MORE_TYPE = Integer.MAX_VALUE -4; 8 | } 9 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/res/layout/rv_base_fragment_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 11 | 12 | 13 | 20 | 21 | 25 | 26 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/res/layout/rv_empty_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 11 | 12 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/res/layout/rv_error_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 16 | 17 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/res/layout/rv_load_more_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 15 | 20 | 27 | 28 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/res/layout/rv_loading_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 14 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/res/layout/rv_state_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | RVAdapterLib 3 | 加载错误,请稍后重试 4 | 暂时还没有数据 5 | 正在加载… 6 | -------------------------------------------------------------------------------- /easy_rv_adapter/src/test/java/com/rdc/bms/easy_rv_adapter/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.rdc.bms.easy_rv_adapter; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx1536m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | 15 | 16 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LinYaoTian/Q_Comic/eff2d33aec4e8025ca3f84eb7de8b24bbadcdba2/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':easy_rv_adapter' 2 | --------------------------------------------------------------------------------