├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── dev │ └── release │ │ └── output.json ├── pro │ └── release │ │ └── output.json ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── allen │ │ └── wanandroid │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── allen │ │ │ └── wanandroid │ │ │ ├── adapter │ │ │ ├── CategoryHomeAdapter.java │ │ │ ├── CategoryTagFlowAdapter.java │ │ │ ├── CollectAdapter.java │ │ │ ├── CommonFragmentAdapter.java │ │ │ ├── CommonFragmentWithTitleAdapter.java │ │ │ ├── HomeAdapter.java │ │ │ ├── ProjectArticleAdapter.java │ │ │ └── TagFlowAdapter.java │ │ │ ├── api │ │ │ ├── ApiModel.java │ │ │ └── ApiService.java │ │ │ ├── app │ │ │ └── App.java │ │ │ ├── arouter │ │ │ ├── ARouterHelper.java │ │ │ ├── ARouterPath.java │ │ │ └── LoginInterceptor.java │ │ │ ├── bean │ │ │ ├── BannerBean.java │ │ │ ├── CategoryBean.java │ │ │ ├── CollectBean.java │ │ │ ├── HomeBean.java │ │ │ ├── HotBean.java │ │ │ ├── MovieBean.java │ │ │ └── UserBean.java │ │ │ ├── broadcast │ │ │ └── LoginBroadcastReceiver.java │ │ │ ├── constant │ │ │ └── BundleKey.java │ │ │ ├── db │ │ │ ├── DaoMaster.java │ │ │ ├── DaoSession.java │ │ │ ├── StringConverter.java │ │ │ └── UserBeanDao.java │ │ │ ├── ui │ │ │ ├── MainActivity.java │ │ │ ├── SplashActivity.java │ │ │ ├── article │ │ │ │ ├── ArticleFragment.java │ │ │ │ ├── ArticlePresenter.java │ │ │ │ ├── ArticleTabViewPagerActivity.java │ │ │ │ └── ArticleView.java │ │ │ ├── category │ │ │ │ ├── CategoryHomeFragment.java │ │ │ │ ├── CategoryHomePresenter.java │ │ │ │ └── CategoryHomeView.java │ │ │ ├── collect │ │ │ │ ├── CollectPresenter.java │ │ │ │ ├── CollectView.java │ │ │ │ └── UserCollectActivity.java │ │ │ ├── home │ │ │ │ └── HomeFragment.java │ │ │ ├── login │ │ │ │ ├── LoginActivity.java │ │ │ │ ├── LoginPresenter.java │ │ │ │ └── LoginView.java │ │ │ ├── mine │ │ │ │ ├── AboutActivity.java │ │ │ │ ├── MineHomeFragment.java │ │ │ │ ├── MineHomePresenter.java │ │ │ │ ├── MineHomeView.java │ │ │ │ └── SettingActivity.java │ │ │ ├── project │ │ │ │ ├── ProjectArticleFragment.java │ │ │ │ ├── ProjectArticlePresenter.java │ │ │ │ ├── ProjectArticleView.java │ │ │ │ ├── ProjectHomeFragment.java │ │ │ │ ├── ProjectHomePresenter.java │ │ │ │ └── ProjectHomeView.java │ │ │ ├── search │ │ │ │ ├── HotSearchFragment.java │ │ │ │ ├── SearchActivity.java │ │ │ │ ├── SearchPresenter.java │ │ │ │ ├── SearchResultFragment.java │ │ │ │ └── SearchViewView.java │ │ │ └── webview │ │ │ │ ├── WebViewActivity.java │ │ │ │ ├── WebViewPresenter.java │ │ │ │ └── WebViewView.java │ │ │ ├── utils │ │ │ ├── DbUtils.java │ │ │ ├── DisplayUtils.java │ │ │ └── GlideUtils.java │ │ │ └── widget │ │ │ └── CustomViewPager.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── ic_launcher_background.xml │ │ ├── ic_search_close_white_24dp.xml │ │ ├── ic_search_white_24dp.xml │ │ ├── progress_web_view_bg.xml │ │ ├── shape_category_tag_bg.xml │ │ └── shape_tag_bg.xml │ │ ├── layout │ │ ├── activity_about.xml │ │ ├── activity_article.xml │ │ ├── activity_login.xml │ │ ├── activity_main.xml │ │ ├── activity_setting.xml │ │ ├── activity_splash.xml │ │ ├── activity_webview.xml │ │ ├── adapter_item_category.xml │ │ ├── adapter_item_category_tag.xml │ │ ├── adapter_item_collect.xml │ │ ├── adapter_item_header_banner.xml │ │ ├── adapter_item_home.xml │ │ ├── adapter_item_project_article.xml │ │ ├── dialog_loading_layout.xml │ │ ├── fragment_category_home.xml │ │ ├── fragment_home.xml │ │ ├── fragment_hot_search.xml │ │ ├── fragment_mine.xml │ │ ├── fragment_movie.xml │ │ ├── fragment_project.xml │ │ ├── fragment_search.xml │ │ ├── item_tag.xml │ │ ├── recycler_view.xml │ │ └── recycler_view_empty_layout.xml │ │ ├── menu │ │ └── toolbar_search_menu.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── icon_arrow_b.png │ │ └── icon_arrow_r.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── icon_arrow_more.png │ │ ├── icon_category_selected.png │ │ ├── icon_category_unselected.png │ │ ├── icon_collected.png │ │ ├── icon_head_img.png │ │ ├── icon_home_selected.png │ │ ├── icon_home_unselected.png │ │ ├── icon_liked.png │ │ ├── icon_mine_selected.png │ │ ├── icon_mine_unselected.png │ │ ├── icon_more.png │ │ ├── icon_project_selected.png │ │ ├── icon_project_unselected.png │ │ ├── icon_splash.png │ │ └── icon_uncollect.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── allen │ └── wanandroid │ └── ExampleUnitTest.java ├── build.gradle ├── config.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library_net ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── allen │ │ └── library │ │ ├── RxHttpUtils.java │ │ ├── base │ │ ├── BaseDataObserver.java │ │ ├── BaseObserver.java │ │ └── BaseStringObserver.java │ │ ├── bean │ │ └── BaseData.java │ │ ├── config │ │ └── OkHttpConfig.java │ │ ├── constant │ │ └── SPKeys.java │ │ ├── cookie │ │ ├── CookieJarImpl.java │ │ ├── SerializableCookie.java │ │ └── store │ │ │ ├── CookieStore.java │ │ │ ├── MemoryCookieStore.java │ │ │ └── SPCookieStore.java │ │ ├── download │ │ ├── BaseDownloadObserver.java │ │ ├── DownloadApi.java │ │ ├── DownloadManager.java │ │ ├── DownloadObserver.java │ │ ├── DownloadRetrofit.java │ │ └── ProgressListener.java │ │ ├── exception │ │ └── ApiException.java │ │ ├── gson │ │ ├── DoubleDefault0Adapter.java │ │ ├── GsonAdapter.java │ │ ├── IntegerDefault0Adapter.java │ │ └── LongDefault0Adapter.java │ │ ├── http │ │ ├── GlobalRxHttp.java │ │ ├── HttpClient.java │ │ ├── RetrofitClient.java │ │ ├── SSLUtils.java │ │ └── SingleRxHttp.java │ │ ├── interceptor │ │ ├── AddCookiesInterceptor.java │ │ ├── HeaderInterceptor.java │ │ ├── NetCacheInterceptor.java │ │ ├── NoNetCacheInterceptor.java │ │ ├── ReceivedCookiesInterceptor.java │ │ ├── RxHttpLogger.java │ │ └── Transformer.java │ │ ├── interfaces │ │ ├── IDataSubscriber.java │ │ ├── IStringSubscriber.java │ │ └── ISubscriber.java │ │ ├── manage │ │ ├── IRxHttpManager.java │ │ └── RxHttpManager.java │ │ ├── observer │ │ ├── CommonObserver.java │ │ ├── DataObserver.java │ │ └── StringObserver.java │ │ ├── upload │ │ ├── UploadFileApi.java │ │ └── UploadRetrofit.java │ │ └── utils │ │ ├── AppUtils.java │ │ ├── GsonUtils.java │ │ ├── JsonUtil.java │ │ ├── MD5.java │ │ ├── NetUtils.java │ │ ├── ParamUtils.java │ │ ├── SPUtils.java │ │ └── ToastUtils.java │ └── res │ └── values │ └── strings.xml ├── module_base ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── library │ │ └── base │ │ ├── adapter │ │ └── CommonFragmentAdapter.java │ │ ├── base │ │ ├── BaseActivity.java │ │ ├── BaseFragment.java │ │ ├── BaseMainActivity.java │ │ ├── BaseToolBarTabViewPagerActivity.java │ │ └── ErrorFragment.java │ │ ├── bean │ │ └── Tab.java │ │ ├── mvp │ │ ├── BaseMvpActivity.java │ │ ├── BaseMvpFragment.java │ │ ├── BaseMvpPresenter.java │ │ ├── IBaseMvpPresenter.java │ │ └── IBaseMvpView.java │ │ ├── permission │ │ ├── BasePermissionActivity.java │ │ └── PermissionListener.java │ │ ├── utils │ │ ├── ActivityCollector.java │ │ ├── DateUtils.java │ │ ├── FormatUtils.java │ │ ├── GetImagePath.java │ │ ├── ImageUtils.java │ │ ├── InstallUtil.java │ │ ├── MathUtils.java │ │ ├── PhoneFormatUtils.java │ │ ├── SpannableStringUtils.java │ │ ├── StatusBarUtil.java │ │ ├── ToastUtils.java │ │ └── VerifyUtils.java │ │ ├── view │ │ └── RVView.java │ │ └── widget │ │ ├── BottomTabView.java │ │ ├── LoadingDialog.java │ │ ├── SuperDividerItemDecoration.java │ │ ├── TabView.java │ │ └── TopBar.java │ └── res │ ├── color │ └── selector_tab_text.xml │ ├── drawable-v21 │ ├── item_touch_bg.xml │ └── selector_topbar_back.xml │ ├── drawable │ ├── dialog_loading_animation_rotate.xml │ ├── dialog_loading_bg.xml │ ├── item_touch_bg.xml │ ├── main_bottom_tob_background.xml │ ├── selector_topbar_back.xml │ ├── shape_bottom_tab_msg_bg.xml │ ├── shape_search_bar_input_bg.xml │ └── shape_super_toast.xml │ ├── layout │ ├── activity_base.xml │ ├── activity_base_bottom_tab.xml │ ├── activity_base_toolbar_tab_viewpager.xml │ ├── base_custom_tab_item_layout.xml │ ├── dialog_loading_layout.xml │ ├── fragment_base.xml │ ├── fragment_error.xml │ ├── fragment_recyclerview.xml │ ├── tab_indicator.xml │ └── top_bar_layout.xml │ ├── mipmap-xxhdpi │ ├── app_back_icon_3x.png │ └── img_progress_bar.png │ └── values │ ├── app_colors.xml │ ├── attrs.xml │ ├── colors.xml │ ├── ids_topbar.xml │ ├── strings.xml │ └── styles.xml ├── settings.gradle └── wan_android_keystore.jks /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | .DS_Store 5 | /build 6 | /captures 7 | .externalNativeBuild 8 | ### Android template 9 | # Built application files 10 | *.apk 11 | *.ap_ 12 | 13 | # Files for the ART/Dalvik VM 14 | *.dex 15 | 16 | # Java class files 17 | *.class 18 | 19 | # Generated files 20 | bin/ 21 | gen/ 22 | out/ 23 | 24 | # Gradle files 25 | .gradle/ 26 | build/ 27 | 28 | # Local configuration file (sdk path, etc) 29 | local.properties 30 | 31 | # Proguard folder generated by Eclipse 32 | proguard/ 33 | 34 | # Log Files 35 | *.log 36 | 37 | # Android Studio Navigation editor temp files 38 | .navigation/ 39 | 40 | # Android Studio captures folder 41 | captures/ 42 | 43 | 44 | .idea/ 45 | # Keystore files 46 | # Uncomment the following line if you do not want to check your keystore files in. 47 | #*.jks 48 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WanAndroid 2 | # MVP+RxJava+Retrofit+Arouter的练手项目(为模块化开发做准备) 3 | > # 模块化代码请查看[module分支](https://github.com/lygttpod/WanAndroid/tree/module) 4 | 5 | * 1、为何写这个项目: 6 | > 写此项目的目的是为了加深对MVP架构的理解,并把自己封装的一套快速开发框架(base封装)应用于真实的项目中看看是否会出现未知问题, 7 | 同时尝试使用ARoute的方式对项目进行页面跳转管理,为以后模块化开发做准备。还可以把学到的新技术引入到此项目 8 | * 2、通过这个项目我们能学到什么: 9 | > a、用过这个练手项目我们能进一步熟悉MVP模式 10 | b、能够简单了解到ARouter的基本用法 11 | c、学习RxJava+Retrofit网路架构的封装 12 | d、学习基类的封装,如何满足大部分需求 13 | e、抛砖引玉,带你开发一套属于自己的快速开发架构 14 | f、反射的应用场景(简单通用的BaseMainActivity) 15 | g、待你自己去发现... 16 | 17 | * 3、接下来要怎么做 18 | > 有了以上基础,接下来就可以继续学习模块化开发了,项目后续会新建module分支用于练习模块化开发,带你一步一步去实现传说中的模块化/组件化demo 19 | 20 | 21 | ## 如有问题可以提issue或加群讨论 22 | STV&RxHttp交流群 23 | 24 | 或者手动加QQ群:688433795 25 | 26 | ## Demo示例下载 27 | ![demo下载](http://osnoex6vf.bkt.clouddn.com/wan_android_download.png) 28 | 29 | # 项目接口 30 | [玩Android接口](http://www.wanandroid.com/blog/show/2) 31 | 32 | # 依赖库 33 | ### RxJava + Retrofit2 + Glide + ARouter 34 | * [RxJava2](https://github.com/ReactiveX/RxJava) 35 | * [Retrofit2](https://github.com/square/retrofit) 36 | * [ARouter](https://github.com/alibaba/ARouter) 37 | * [Flowlayout](https://github.com/hongyangAndroid/FlowLayout) 38 | * [BRVAH](https://github.com/CymChad/BaseRecyclerViewAdapterHelper) 39 | * [Glide](https://github.com/bumptech/glide) 40 | * [RxHttpUtils](https://github.com/lygttpod/RxHttpUtils) 41 | * [SuperTextView](https://github.com/lygttpod/SuperTextView) 42 | 43 | 44 | 45 | # 运行效果 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/dev/release/output.json: -------------------------------------------------------------------------------- 1 | [{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":100,"versionName":"1.0.0","enabled":true,"outputFile":"WanAndroid_v1.0.0_2018-08-06_dev.apk","fullName":"devRelease","baseName":"dev-release"},"path":"WanAndroid_v1.0.0_2018-08-06_dev.apk","properties":{}}] -------------------------------------------------------------------------------- /app/pro/release/output.json: -------------------------------------------------------------------------------- 1 | [{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":100,"versionName":"1.0.0","enabled":true,"outputFile":"WanAndroid_v1.0.0_2018-08-06_pro.apk","fullName":"proRelease","baseName":"pro-release"},"path":"WanAndroid_v1.0.0_2018-08-06_pro.apk","properties":{}}] -------------------------------------------------------------------------------- /app/src/androidTest/java/com/allen/wanandroid/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid; 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.allen.quickbuildandroid", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/adapter/CategoryHomeAdapter.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.adapter; 2 | 3 | import android.content.Context; 4 | import android.support.annotation.Nullable; 5 | import android.util.SparseArray; 6 | import android.view.View; 7 | 8 | import com.allen.wanandroid.R; 9 | import com.allen.wanandroid.bean.CategoryBean; 10 | import com.chad.library.adapter.base.BaseQuickAdapter; 11 | import com.chad.library.adapter.base.BaseViewHolder; 12 | import com.zhy.view.flowlayout.FlowLayout; 13 | import com.zhy.view.flowlayout.TagFlowLayout; 14 | 15 | import java.util.List; 16 | 17 | /** 18 | *
19 |  *      @author : xiaoyao
20 |  *      e-mail  : xiaoyao@51vest.com
21 |  *      date    : 2018/07/24
22 |  *      desc    :
23 |  *      version : 1.0
24 |  * 
25 | */ 26 | public class CategoryHomeAdapter extends BaseQuickAdapter { 27 | 28 | private Context context; 29 | private SparseArray tagFlowLayoutSparseArray; 30 | 31 | private onTagItemClick onItemClick; 32 | 33 | public void setOnItemClick(onTagItemClick onItemClick) { 34 | this.onItemClick = onItemClick; 35 | } 36 | 37 | public CategoryHomeAdapter(Context context, @Nullable List data) { 38 | super(R.layout.adapter_item_category, data); 39 | this.context = context; 40 | tagFlowLayoutSparseArray = new SparseArray<>(); 41 | } 42 | 43 | @Override 44 | protected void convert(BaseViewHolder helper, final CategoryBean item) { 45 | helper.setText(R.id.title_tv, item.getName()); 46 | 47 | TagFlowLayout flowLayout = tagFlowLayoutSparseArray.get(helper.getView(R.id.tag_flow_layout).hashCode()); 48 | if (flowLayout == null) { 49 | flowLayout = helper.getView(R.id.tag_flow_layout); 50 | } 51 | 52 | CategoryTagFlowAdapter adapter = new CategoryTagFlowAdapter(context, item.getChildren()); 53 | flowLayout.setOnTagClickListener(new TagFlowLayout.OnTagClickListener() { 54 | @Override 55 | public boolean onTagClick(View view, int position, FlowLayout parent) { 56 | if (onItemClick != null) { 57 | onItemClick.OnTagClickListener(item, position); 58 | } 59 | return true; 60 | } 61 | }); 62 | flowLayout.setAdapter(adapter); 63 | 64 | tagFlowLayoutSparseArray.put(helper.getView(R.id.tag_flow_layout).hashCode(), flowLayout); 65 | } 66 | 67 | 68 | public interface onTagItemClick { 69 | void OnTagClickListener(CategoryBean categoryBean, int index); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/adapter/CategoryTagFlowAdapter.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.adapter; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.widget.TextView; 7 | 8 | import com.allen.wanandroid.R; 9 | import com.allen.wanandroid.bean.CategoryBean; 10 | import com.zhy.view.flowlayout.FlowLayout; 11 | import com.zhy.view.flowlayout.TagAdapter; 12 | 13 | import java.util.List; 14 | 15 | /** 16 | *
17 |  *      @author : xiaoyao
18 |  *      e-mail  : xiaoyao@51vest.com
19 |  *      date    : 2018/07/27
20 |  *      desc    :
21 |  *      version : 1.0
22 |  * 
23 | */ 24 | public class CategoryTagFlowAdapter extends TagAdapter { 25 | private Context context; 26 | 27 | public CategoryTagFlowAdapter(Context context,List datas) { 28 | super(datas); 29 | this.context = context; 30 | } 31 | 32 | 33 | @Override 34 | public View getView(FlowLayout parent, int position, CategoryBean childrenBean) { 35 | TextView view = (TextView) LayoutInflater.from(context).inflate(R.layout.adapter_item_category_tag, parent, false); 36 | view.setText(childrenBean.getName()); 37 | return view; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/adapter/CollectAdapter.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.adapter; 2 | 3 | import android.support.annotation.Nullable; 4 | 5 | import com.allen.wanandroid.R; 6 | import com.allen.wanandroid.bean.CollectBean; 7 | import com.allen.wanandroid.bean.HomeBean; 8 | import com.chad.library.adapter.base.BaseQuickAdapter; 9 | import com.chad.library.adapter.base.BaseViewHolder; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | *
15 |  *      @author : Allen
16 |  *      e-mail  : lygttpod@163.com
17 |  *      date    : 2018/07/21
18 |  *      desc    :
19 |  *      version : 1.0
20 |  * 
21 | */ 22 | public class CollectAdapter extends BaseQuickAdapter { 23 | 24 | public CollectAdapter(@Nullable List data) { 25 | super(R.layout.adapter_item_collect, data); 26 | } 27 | 28 | @Override 29 | protected void convert(BaseViewHolder helper, CollectBean.DatasBean item) { 30 | helper.setText(R.id.author_tv, "作者:" + item.getAuthor()); 31 | helper.setText(R.id.time_tv, item.getNiceDate()); 32 | helper.setText(R.id.title_tv, item.getTitle()); 33 | helper.setText(R.id.chapter_name_tv, "分类:" + item.getChapterName()); 34 | helper.addOnClickListener(R.id.collect_iv); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/adapter/CommonFragmentAdapter.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.adapter; 2 | 3 | import android.support.v4.app.Fragment; 4 | import android.support.v4.app.FragmentManager; 5 | import android.support.v4.app.FragmentPagerAdapter; 6 | import android.view.ViewGroup; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | *
12 |  *      @author : xiaoyao
13 |  *      e-mail  : xiaoyao@51vest.com
14 |  *      date    : 2018/07/27
15 |  *      desc    :
16 |  *      version : 1.0
17 |  * 
18 | */ 19 | public class CommonFragmentAdapter extends FragmentPagerAdapter { 20 | 21 | private List mFragments; 22 | 23 | public CommonFragmentAdapter(FragmentManager fm, List mFragments) { 24 | super(fm); 25 | this.mFragments = mFragments; 26 | } 27 | 28 | @Override 29 | public void destroyItem(ViewGroup container, int position, Object object) { 30 | super.destroyItem(container, position, object); 31 | } 32 | 33 | @Override 34 | public Fragment getItem(int position) { 35 | return mFragments.get(position); 36 | } 37 | 38 | @Override 39 | public int getCount() { 40 | return mFragments.size(); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/adapter/CommonFragmentWithTitleAdapter.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.adapter; 2 | 3 | import android.support.annotation.Nullable; 4 | import android.support.v4.app.Fragment; 5 | import android.support.v4.app.FragmentManager; 6 | import android.support.v4.app.FragmentPagerAdapter; 7 | import android.view.ViewGroup; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | *
13 |  *      @author : xiaoyao
14 |  *      e-mail  : xiaoyao@51vest.com
15 |  *      date    : 2018/07/27
16 |  *      desc    :
17 |  *      version : 1.0
18 |  * 
19 | */ 20 | public class CommonFragmentWithTitleAdapter extends FragmentPagerAdapter { 21 | 22 | private List mFragments; 23 | private List mTitles; 24 | 25 | public CommonFragmentWithTitleAdapter(FragmentManager fm, List mFragments, List mTitles) { 26 | super(fm); 27 | this.mFragments = mFragments; 28 | this.mTitles = mTitles; 29 | } 30 | 31 | @Override 32 | public void destroyItem(ViewGroup container, int position, Object object) { 33 | // super.destroyItem(container, position, object); 34 | // TODO: 2018/7/27 去掉这行就可以避免来回滑动出现空白页面 要找到问题根源 35 | } 36 | 37 | @Override 38 | public Fragment getItem(int position) { 39 | return mFragments.get(position); 40 | } 41 | 42 | @Override 43 | public int getCount() { 44 | return mFragments.size(); 45 | } 46 | 47 | @Nullable 48 | @Override 49 | public CharSequence getPageTitle(int position) { 50 | return mTitles.get(position); 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/adapter/HomeAdapter.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.adapter; 2 | 3 | import android.support.annotation.Nullable; 4 | import android.text.Html; 5 | import android.text.TextUtils; 6 | 7 | import com.allen.wanandroid.R; 8 | import com.allen.wanandroid.bean.HomeBean; 9 | import com.chad.library.adapter.base.BaseQuickAdapter; 10 | import com.chad.library.adapter.base.BaseViewHolder; 11 | 12 | import java.util.List; 13 | 14 | /** 15 | *
16 |  *      @author : Allen
17 |  *      e-mail  : lygttpod@163.com
18 |  *      date    : 2018/07/21
19 |  *      desc    :
20 |  *      version : 1.0
21 |  * 
22 | */ 23 | public class HomeAdapter extends BaseQuickAdapter { 24 | 25 | public HomeAdapter(@Nullable List data) { 26 | super(R.layout.adapter_item_home, data); 27 | } 28 | 29 | @Override 30 | protected void convert(BaseViewHolder helper, HomeBean.DatasEntity item) { 31 | helper.setText(R.id.author_tv, "作者:"+item.getAuthor()); 32 | helper.setText(R.id.time_tv, item.getNiceDate()); 33 | helper.setText(R.id.title_tv, Html.fromHtml(item.getTitle())); 34 | StringBuilder stringBuilder = new StringBuilder(); 35 | String superChapterName = item.getSuperChapterName(); 36 | String chapterName = item.getChapterName(); 37 | if (!TextUtils.isEmpty(superChapterName)){ 38 | stringBuilder.append(superChapterName); 39 | } 40 | if (!TextUtils.isEmpty(chapterName)){ 41 | if (!TextUtils.isEmpty(superChapterName)){ 42 | stringBuilder.append("/"); 43 | } 44 | stringBuilder.append(chapterName); 45 | } 46 | helper.setText(R.id.chapter_name_tv, stringBuilder.toString()); 47 | helper.setImageResource(R.id.collect_iv,item.isCollect()?R.mipmap.icon_collected:R.mipmap.icon_uncollect); 48 | helper.addOnClickListener(R.id.collect_iv); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/adapter/ProjectArticleAdapter.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.adapter; 2 | 3 | import android.content.Context; 4 | import android.support.annotation.Nullable; 5 | import android.widget.ImageView; 6 | 7 | import com.allen.wanandroid.R; 8 | import com.allen.wanandroid.bean.HomeBean; 9 | import com.allen.wanandroid.utils.GlideUtils; 10 | import com.chad.library.adapter.base.BaseQuickAdapter; 11 | import com.chad.library.adapter.base.BaseViewHolder; 12 | 13 | import java.util.List; 14 | 15 | /** 16 | *
17 |  *      @author : Allen
18 |  *      e-mail  : lygttpod@163.com
19 |  *      date    : 2018/07/21
20 |  *      desc    :
21 |  *      version : 1.0
22 |  * 
23 | */ 24 | public class ProjectArticleAdapter extends BaseQuickAdapter { 25 | 26 | private Context context; 27 | 28 | public ProjectArticleAdapter(Context context, @Nullable List data) { 29 | super(R.layout.adapter_item_project_article, data); 30 | this.context = context; 31 | } 32 | 33 | @Override 34 | protected void convert(BaseViewHolder helper, HomeBean.DatasEntity item) { 35 | helper.setText(R.id.author_tv, "作者:" + item.getAuthor()); 36 | helper.setText(R.id.time_tv, item.getNiceDate()); 37 | helper.setText(R.id.title_tv, item.getTitle()); 38 | helper.setImageResource(R.id.collect_iv,item.isCollect()?R.mipmap.icon_collected:R.mipmap.icon_uncollect); 39 | 40 | GlideUtils.loadImg(context, item.getEnvelopePic(), (ImageView) helper.getView(R.id.article_pic_iv)); 41 | helper.addOnClickListener(R.id.collect_iv); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/adapter/TagFlowAdapter.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.adapter; 2 | 3 | import android.content.Context; 4 | import android.graphics.Color; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.widget.TextView; 8 | 9 | import com.allen.wanandroid.R; 10 | import com.allen.wanandroid.bean.HotBean; 11 | import com.zhy.view.flowlayout.FlowLayout; 12 | import com.zhy.view.flowlayout.TagAdapter; 13 | 14 | import java.util.List; 15 | import java.util.Random; 16 | 17 | /** 18 | *
19 |  *      @author : xiaoyao
20 |  *      e-mail  : xiaoyao@51vest.com
21 |  *      date    : 2018/07/27
22 |  *      desc    :
23 |  *      version : 1.0
24 |  * 
25 | */ 26 | public class TagFlowAdapter extends TagAdapter { 27 | private Context context; 28 | 29 | public TagFlowAdapter(Context context, List datas) { 30 | super(datas); 31 | this.context = context; 32 | } 33 | 34 | @Override 35 | public View getView(FlowLayout parent, int position, HotBean hotBean) { 36 | TextView view = (TextView) LayoutInflater.from(context).inflate(R.layout.item_tag, parent, false); 37 | view.setText(hotBean.getName()); 38 | view.setTextColor(getRandomColor()); 39 | return view; 40 | } 41 | 42 | /** 43 | * 随机颜色 44 | * @return 随机颜色值 45 | */ 46 | private int getRandomColor() { 47 | Random random = new Random(); 48 | int r = random.nextInt(256); 49 | int g = random.nextInt(256); 50 | int b = random.nextInt(256); 51 | return Color.rgb(r, g, b); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/arouter/ARouterHelper.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.arouter; 2 | 3 | import com.alibaba.android.arouter.launcher.ARouter; 4 | import com.allen.wanandroid.bean.CategoryBean; 5 | import com.allen.wanandroid.constant.BundleKey; 6 | 7 | /** 8 | *
 9 |  *      @author : xiaoyao
10 |  *      e-mail  : xiaoyao@51vest.com
11 |  *      date    : 2018/08/01
12 |  *      desc    : 页面跳转
13 |  *      version : 1.0
14 |  * 
15 | */ 16 | public class ARouterHelper { 17 | public static void gotoSearchActivity() { 18 | ARouter 19 | .getInstance() 20 | .build(ARouterPath.searchActPath) 21 | .navigation(); 22 | } 23 | 24 | public static void gotoWebViewActivity(String title, String url) { 25 | ARouter 26 | .getInstance() 27 | .build(ARouterPath.webViewPath) 28 | .withString(BundleKey.TITLE, title) 29 | .withString(BundleKey.URL, url) 30 | .navigation(); 31 | } 32 | 33 | 34 | public static void gotoSearchResult(String title) { 35 | ARouter 36 | .getInstance() 37 | .build(ARouterPath.searchResultFrgPath) 38 | .withString(BundleKey.TITLE, title) 39 | .navigation(); 40 | } 41 | 42 | public static void gotoCollectList() { 43 | ARouter 44 | .getInstance() 45 | .build(ARouterPath.userCollectAcPath) 46 | .navigation(); 47 | } 48 | 49 | public static void startArticleTabViewPagerAct(CategoryBean bean, int index) { 50 | ARouter 51 | .getInstance() 52 | .build(ARouterPath.articleTabViewPagerAcPath) 53 | .withInt("index", index) 54 | .withParcelable("category", bean) 55 | .navigation(); 56 | } 57 | 58 | public static void login() { 59 | ARouter 60 | .getInstance() 61 | .build(ARouterPath.loginPath) 62 | .navigation(); 63 | 64 | } 65 | 66 | public static void gotoMain() { 67 | ARouter 68 | .getInstance() 69 | .build(ARouterPath.mainPath) 70 | .navigation(); 71 | 72 | } 73 | 74 | public static void about() { 75 | ARouter 76 | .getInstance() 77 | .build(ARouterPath.aboutActPath) 78 | .navigation(); 79 | 80 | } 81 | 82 | public static void setting() { 83 | ARouter 84 | .getInstance() 85 | .build(ARouterPath.settingActPath) 86 | .navigation(); 87 | 88 | } 89 | 90 | } 91 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/arouter/ARouterPath.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.arouter; 2 | 3 | /** 4 | *
 5 |  *      @author : xiaoyao
 6 |  *      e-mail  : xiaoyao@51vest.com
 7 |  *      date    : 2018/07/26
 8 |  *      desc    : 页面路径
 9 |  *      version : 1.0
10 |  * 
11 | */ 12 | public interface ARouterPath { 13 | String mainPath = "/app/main/activity"; 14 | String mainHomePath = "/app/home/fragment"; 15 | String mainMinePath = "/app/home/mine"; 16 | String loginPath = "/app/login/activity"; 17 | String webViewPath = "/article/details/webView/activity"; 18 | String categoryPath = "/article/category/fragment"; 19 | String articleTabViewPagerAcPath = "/article/tab_viewpager/activity"; 20 | String articleListFrPath = "/article/list/fragment"; 21 | String userCollectAcPath = "/user/collect/activity"; 22 | String searchActPath = "/search/activity"; 23 | String searchResultFrgPath = "/search/result/fragment"; 24 | String aboutActPath = "/mine/about/activity"; 25 | String settingActPath = "/mine/setting/activity"; 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/arouter/LoginInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.arouter; 2 | 3 | import android.content.Context; 4 | 5 | import com.alibaba.android.arouter.facade.Postcard; 6 | import com.alibaba.android.arouter.facade.annotation.Interceptor; 7 | import com.alibaba.android.arouter.facade.callback.InterceptorCallback; 8 | import com.alibaba.android.arouter.facade.template.IInterceptor; 9 | import com.alibaba.android.arouter.launcher.ARouter; 10 | import com.allen.library.RxHttpUtils; 11 | 12 | /** 13 | *
14 |  *      @author : xiaoyao
15 |  *      e-mail  : xiaoyao@51vest.com
16 |  *      date    : 2018/07/26
17 |  *      desc    : 登录拦截器
18 |  *      version : 1.0
19 |  * 
20 | */ 21 | @Interceptor(priority = 1) 22 | public class LoginInterceptor implements IInterceptor { 23 | @Override 24 | public void process(Postcard postcard, InterceptorCallback callback) { 25 | 26 | if (postcard.getPath().equals(ARouterPath.userCollectAcPath)) { 27 | if (RxHttpUtils.getAllCookie().size() > 0) { 28 | callback.onContinue(postcard); 29 | } else { 30 | callback.onInterrupt(null); 31 | ARouter.getInstance().build(ARouterPath.loginPath).navigation(); 32 | } 33 | } else { 34 | callback.onContinue(postcard); 35 | } 36 | 37 | } 38 | 39 | @Override 40 | public void init(Context context) { 41 | 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/bean/BannerBean.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.bean; 2 | 3 | /** 4 | *
 5 |  *      @author : Allen
 6 |  *      e-mail  : lygttpod@163.com
 7 |  *      date    : 2018/07/22
 8 |  *      desc    :
 9 |  *      version : 1.0
10 |  * 
11 | */ 12 | public class BannerBean { 13 | 14 | /** 15 | * desc : 16 | * id : 15 17 | * imagePath : http://www.wanandroid.com/blogimgs/ec492618-d03e-4380-81df-5a990228a37e.jpg 18 | * isVisible : 1 19 | * order : 0 20 | * title : 当当网图书满200立减120,满400-250,本站福利 21 | * type : 0 22 | * url : http://www.wanandroid.com/blog/show/2234 23 | */ 24 | 25 | private String desc; 26 | private int id; 27 | private String imagePath; 28 | private int isVisible; 29 | private int order; 30 | private String title; 31 | private int type; 32 | private String url; 33 | 34 | public String getDesc() { 35 | return desc; 36 | } 37 | 38 | public void setDesc(String desc) { 39 | this.desc = desc; 40 | } 41 | 42 | public int getId() { 43 | return id; 44 | } 45 | 46 | public void setId(int id) { 47 | this.id = id; 48 | } 49 | 50 | public String getImagePath() { 51 | return imagePath; 52 | } 53 | 54 | public void setImagePath(String imagePath) { 55 | this.imagePath = imagePath; 56 | } 57 | 58 | public int getIsVisible() { 59 | return isVisible; 60 | } 61 | 62 | public void setIsVisible(int isVisible) { 63 | this.isVisible = isVisible; 64 | } 65 | 66 | public int getOrder() { 67 | return order; 68 | } 69 | 70 | public void setOrder(int order) { 71 | this.order = order; 72 | } 73 | 74 | public String getTitle() { 75 | return title; 76 | } 77 | 78 | public void setTitle(String title) { 79 | this.title = title; 80 | } 81 | 82 | public int getType() { 83 | return type; 84 | } 85 | 86 | public void setType(int type) { 87 | this.type = type; 88 | } 89 | 90 | public String getUrl() { 91 | return url; 92 | } 93 | 94 | public void setUrl(String url) { 95 | this.url = url; 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/bean/HotBean.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.bean; 2 | 3 | /** 4 | *
 5 |  *      @author : xiaoyao
 6 |  *      e-mail  : xiaoyao@51vest.com
 7 |  *      date    : 2018/07/27
 8 |  *      desc    :
 9 |  *      version : 1.0
10 |  * 
11 | */ 12 | public class HotBean { 13 | 14 | /** 15 | * icon : 16 | * id : 17 17 | * link : http://www.wanandroid.com/article/list/0?cid=176 18 | * name : 国内大牛博客集合 19 | * order : 1 20 | * visible : 1 21 | */ 22 | 23 | private String icon; 24 | private int id; 25 | private String link; 26 | private String name; 27 | private int order; 28 | private int visible; 29 | 30 | public String getIcon() { 31 | return icon; 32 | } 33 | 34 | public void setIcon(String icon) { 35 | this.icon = icon; 36 | } 37 | 38 | public int getId() { 39 | return id; 40 | } 41 | 42 | public void setId(int id) { 43 | this.id = id; 44 | } 45 | 46 | public String getLink() { 47 | return link; 48 | } 49 | 50 | public void setLink(String link) { 51 | this.link = link; 52 | } 53 | 54 | public String getName() { 55 | return name; 56 | } 57 | 58 | public void setName(String name) { 59 | this.name = name; 60 | } 61 | 62 | public int getOrder() { 63 | return order; 64 | } 65 | 66 | public void setOrder(int order) { 67 | this.order = order; 68 | } 69 | 70 | public int getVisible() { 71 | return visible; 72 | } 73 | 74 | public void setVisible(int visible) { 75 | this.visible = visible; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/broadcast/LoginBroadcastReceiver.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.broadcast; 2 | 3 | import android.content.BroadcastReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | 7 | import com.allen.library.utils.SPUtils; 8 | import com.allen.wanandroid.ui.login.LoginActivity; 9 | 10 | import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; 11 | 12 | /** 13 | *
14 |  *      @author : xiaoyao
15 |  *      e-mail  : xiaoyao@51vest.com
16 |  *      date    : 2018/08/01
17 |  *      desc    :
18 |  *      version : 1.0
19 |  * 
20 | */ 21 | public class LoginBroadcastReceiver extends BroadcastReceiver { 22 | @Override 23 | public void onReceive(Context context, Intent intent) { 24 | if (intent != null && intent.getAction() != null) { 25 | String s = intent.getAction(); 26 | if (s.equals("com.allen.wan_android.need_login_action")) { 27 | SPUtils.clearAll(); 28 | Intent login = new Intent(); 29 | login.setClass(context, LoginActivity.class); 30 | login.setFlags(FLAG_ACTIVITY_NEW_TASK); 31 | context.startActivity(login); 32 | } 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/constant/BundleKey.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.constant; 2 | 3 | /** 4 | *
 5 |  *      @author : Allen
 6 |  *      e-mail  : lygttpod@163.com
 7 |  *      date    : 2018/07/22
 8 |  *      desc    :
 9 |  *      version : 1.0
10 |  * 
11 | */ 12 | public interface BundleKey { 13 | String TITLE = "title"; 14 | String URL = "url"; 15 | String ID = "id"; 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/db/DaoSession.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.db; 2 | 3 | import java.util.Map; 4 | 5 | import org.greenrobot.greendao.AbstractDao; 6 | import org.greenrobot.greendao.AbstractDaoSession; 7 | import org.greenrobot.greendao.database.Database; 8 | import org.greenrobot.greendao.identityscope.IdentityScopeType; 9 | import org.greenrobot.greendao.internal.DaoConfig; 10 | 11 | import com.allen.wanandroid.bean.UserBean; 12 | 13 | import com.allen.wanandroid.db.UserBeanDao; 14 | 15 | // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. 16 | 17 | /** 18 | * {@inheritDoc} 19 | * 20 | * @see org.greenrobot.greendao.AbstractDaoSession 21 | */ 22 | public class DaoSession extends AbstractDaoSession { 23 | 24 | private final DaoConfig userBeanDaoConfig; 25 | 26 | private final UserBeanDao userBeanDao; 27 | 28 | public DaoSession(Database db, IdentityScopeType type, Map>, DaoConfig> 29 | daoConfigMap) { 30 | super(db); 31 | 32 | userBeanDaoConfig = daoConfigMap.get(UserBeanDao.class).clone(); 33 | userBeanDaoConfig.initIdentityScope(type); 34 | 35 | userBeanDao = new UserBeanDao(userBeanDaoConfig, this); 36 | 37 | registerDao(UserBean.class, userBeanDao); 38 | } 39 | 40 | public void clear() { 41 | userBeanDaoConfig.clearIdentityScope(); 42 | } 43 | 44 | public UserBeanDao getUserBeanDao() { 45 | return userBeanDao; 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/db/StringConverter.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.db; 2 | 3 | import org.greenrobot.greendao.converter.PropertyConverter; 4 | 5 | import java.util.Arrays; 6 | import java.util.List; 7 | 8 | /** 9 | *
10 |  *      @author : xiaoyao
11 |  *      e-mail  : xiaoyao@51vest.com
12 |  *      date    : 2018/07/26
13 |  *      desc    :
14 |  *      version : 1.0
15 |  * 
16 | */ 17 | public class StringConverter implements PropertyConverter, String> { 18 | @Override 19 | public List convertToEntityProperty(String databaseValue) { 20 | if (databaseValue == null) { 21 | return null; 22 | } else { 23 | List list = Arrays.asList(databaseValue.split(",")); 24 | return list; 25 | } 26 | } 27 | 28 | @Override 29 | public String convertToDatabaseValue(List entityProperty) { 30 | if (entityProperty == null) { 31 | return null; 32 | } else { 33 | StringBuilder sb = new StringBuilder(); 34 | for (String link : entityProperty) { 35 | sb.append(link); 36 | sb.append(","); 37 | } 38 | return sb.toString(); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui; 2 | 3 | import android.content.Intent; 4 | import android.view.View; 5 | 6 | import com.alibaba.android.arouter.facade.annotation.Route; 7 | import com.allen.wanandroid.R; 8 | import com.allen.wanandroid.arouter.ARouterHelper; 9 | import com.allen.wanandroid.arouter.ARouterPath; 10 | import com.allen.wanandroid.ui.category.CategoryHomeFragment; 11 | import com.allen.wanandroid.ui.home.HomeFragment; 12 | import com.allen.wanandroid.ui.mine.MineHomeFragment; 13 | import com.allen.wanandroid.ui.project.ProjectHomeFragment; 14 | import com.allen.wanandroid.utils.DbUtils; 15 | import com.library.base.base.BaseMainActivity; 16 | import com.library.base.bean.Tab; 17 | 18 | import java.util.List; 19 | 20 | @Route(path = ARouterPath.mainPath) 21 | public class MainActivity extends BaseMainActivity { 22 | 23 | 24 | @Override 25 | public boolean isFullScreen() { 26 | return true; 27 | } 28 | 29 | @Override 30 | protected void onNewIntent(Intent intent) { 31 | super.onNewIntent(intent); 32 | bottomTabView.setCurrentItem(0); 33 | } 34 | 35 | @Override 36 | public List setBottomTabs(List tabs) { 37 | tabs.add(new Tab("首页", R.mipmap.icon_home_unselected, R.mipmap.icon_home_selected, R.color.colorTabNormal, R.color.colorTabSelected)); 38 | tabs.add(new Tab("项目", R.mipmap.icon_project_unselected, R.mipmap.icon_project_selected, R.color.colorTabNormal, R.color.colorTabSelected)); 39 | tabs.add(new Tab("体系", R.mipmap.icon_category_unselected, R.mipmap.icon_category_selected, R.color.colorTabNormal, R.color.colorTabSelected)); 40 | tabs.add(new Tab("我的", R.mipmap.icon_mine_unselected, R.mipmap.icon_mine_selected, R.color.colorTabNormal, R.color.colorTabSelected)); 41 | return tabs; 42 | } 43 | 44 | @Override 45 | public List setFragmentClassNames(List fragmentClassNames) { 46 | fragmentClassNames.add(HomeFragment.class.getName()); 47 | fragmentClassNames.add(ProjectHomeFragment.class.getName()); 48 | fragmentClassNames.add(CategoryHomeFragment.class.getName()); 49 | fragmentClassNames.add(MineHomeFragment.class.getName()); 50 | return fragmentClassNames; 51 | } 52 | 53 | @Override 54 | public boolean isInterceptBeforeSkip(int position) { 55 | // return false; 56 | return position == 3 && !DbUtils.isQueryUser(); 57 | } 58 | 59 | @Override 60 | public void setTabInterceptSkip(View v, final int position) { 61 | ARouterHelper.login(); 62 | } 63 | 64 | } 65 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/article/ArticleView.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.article; 2 | 3 | import com.allen.wanandroid.bean.BannerBean; 4 | import com.allen.wanandroid.bean.HomeBean; 5 | import com.library.base.mvp.IBaseMvpView; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | *
11 |  *      @author : Allen
12 |  *      e-mail  : lygttpod@163.com
13 |  *      date    : 2018/07/21
14 |  *      desc    :
15 |  *      version : 1.0
16 |  * 
17 | */ 18 | public interface ArticleView extends IBaseMvpView { 19 | 20 | void showBanner(List list); 21 | void showNewArticleList(List list); 22 | void showMoreArticleList(List list); 23 | 24 | void collectSuccess(int position, String msg); 25 | void cancelCollectSuccess(int position, String msg); 26 | 27 | void loadMoreComplete(); 28 | void loadMoreEnd(); 29 | void enableLoadMore(boolean enable); 30 | 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/category/CategoryHomePresenter.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.category; 2 | 3 | import com.allen.library.observer.DataObserver; 4 | import com.allen.wanandroid.api.ApiModel; 5 | import com.allen.wanandroid.bean.CategoryBean; 6 | import com.library.base.mvp.BaseMvpPresenter; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | *
12 |  *      @author : xiaoyao
13 |  *      e-mail  : xiaoyao@51vest.com
14 |  *      date    : 2018/07/23
15 |  *      desc    :
16 |  *      version : 1.0
17 |  * 
18 | */ 19 | public class CategoryHomePresenter extends BaseMvpPresenter { 20 | private ApiModel apiModel; 21 | 22 | public CategoryHomePresenter() { 23 | this.apiModel = new ApiModel(); 24 | } 25 | 26 | public void getCategoryData(){ 27 | apiModel.getCategoryList(new DataObserver>() { 28 | @Override 29 | protected void onError(String errorMsg) { 30 | mView.hideLoading(); 31 | } 32 | 33 | @Override 34 | protected void onSuccess(List data) { 35 | mView.showCategoryList(data); 36 | mView.hideLoading(); 37 | } 38 | }); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/category/CategoryHomeView.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.category; 2 | 3 | import com.allen.wanandroid.bean.CategoryBean; 4 | import com.library.base.mvp.IBaseMvpView; 5 | 6 | import java.util.List; 7 | 8 | 9 | /** 10 | *
11 |  *      @author : xiaoyao
12 |  *      e-mail  : xiaoyao@51vest.com
13 |  *      date    : 2018/07/23
14 |  *      desc    :
15 |  *      version : 1.0
16 |  * 
17 | */ 18 | public interface CategoryHomeView extends IBaseMvpView { 19 | void showCategoryList(List list); 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/collect/CollectPresenter.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.collect; 2 | 3 | import com.allen.library.observer.DataObserver; 4 | import com.allen.wanandroid.api.ApiModel; 5 | import com.allen.wanandroid.bean.CollectBean; 6 | import com.library.base.mvp.BaseMvpPresenter; 7 | 8 | 9 | /** 10 | *
11 |  *      @author : Allen
12 |  *      e-mail  : lygttpod@163.com
13 |  *      date    : 2018/07/21
14 |  *      desc    :
15 |  *      version : 1.0
16 |  * 
17 | */ 18 | public class CollectPresenter extends BaseMvpPresenter { 19 | 20 | private ApiModel apiModel; 21 | 22 | public CollectPresenter() { 23 | this.apiModel = new ApiModel(); 24 | } 25 | 26 | 27 | public void getUserCollectList(int page) { 28 | mView.showLoading(); 29 | apiModel.getUserCollectList(page, new DataObserver() { 30 | @Override 31 | protected void onError(String errorMsg) { 32 | mView.hideLoading(); 33 | } 34 | 35 | @Override 36 | protected void onSuccess(CollectBean data) { 37 | mView.hideLoading(); 38 | if (data.getCurPage() == 1) { 39 | mView.showNewArticleList(data.getDatas()); 40 | mView.enableLoadMore(!data.isOver()); 41 | } else { 42 | if (data.isOver()) { 43 | mView.loadMoreEnd(); 44 | } else { 45 | mView.loadMoreComplete(); 46 | } 47 | mView.showMoreArticleList(data.getDatas()); 48 | } 49 | } 50 | }); 51 | } 52 | 53 | 54 | public void cancelUserCollectArticleById(int id, int originId, final int position) { 55 | apiModel.cancelUserCollectArticleById(id, originId, mView.getLoadingDialog(), new DataObserver() { 56 | @Override 57 | protected void onError(String errorMsg) { 58 | } 59 | 60 | @Override 61 | protected void onSuccess(String data) { 62 | mView.cancelCollectSuccess(position, "收藏已取消"); 63 | } 64 | }); 65 | } 66 | 67 | } 68 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/collect/CollectView.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.collect; 2 | 3 | import com.allen.wanandroid.bean.CollectBean; 4 | import com.allen.wanandroid.bean.HomeBean; 5 | import com.library.base.mvp.IBaseMvpView; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | *
11 |  *      @author : Allen
12 |  *      e-mail  : lygttpod@163.com
13 |  *      date    : 2018/07/21
14 |  *      desc    :
15 |  *      version : 1.0
16 |  * 
17 | */ 18 | public interface CollectView extends IBaseMvpView { 19 | 20 | void showNewArticleList(List list); 21 | void showMoreArticleList(List list); 22 | void cancelCollectSuccess(int position, String msg); 23 | 24 | void loadMoreComplete(); 25 | void loadMoreEnd(); 26 | void enableLoadMore(boolean enable); 27 | 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/login/LoginPresenter.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.login; 2 | 3 | import com.allen.library.observer.DataObserver; 4 | import com.allen.wanandroid.api.ApiModel; 5 | import com.allen.wanandroid.bean.UserBean; 6 | import com.allen.wanandroid.utils.DbUtils; 7 | import com.library.base.mvp.BaseMvpPresenter; 8 | 9 | /** 10 | *
11 |  *      @author : xiaoyao
12 |  *      e-mail  : xiaoyao@51vest.com
13 |  *      date    : 2018/07/25
14 |  *      desc    :
15 |  *      version : 1.0
16 |  * 
17 | */ 18 | public class LoginPresenter extends BaseMvpPresenter { 19 | private ApiModel apiModel; 20 | 21 | public LoginPresenter() { 22 | this.apiModel = new ApiModel(); 23 | } 24 | 25 | public void login() { 26 | String userName = mView.getUserName(); 27 | String password = mView.getPassWord(); 28 | 29 | apiModel.login(userName, password, new DataObserver() { 30 | @Override 31 | protected void onError(String errorMsg) { 32 | mView.optionError(errorMsg); 33 | } 34 | 35 | @Override 36 | protected void onSuccess(UserBean data) { 37 | DbUtils.insertUserInfo(data); 38 | mView.optionSuccess(data); 39 | } 40 | }); 41 | } 42 | 43 | public void register() { 44 | String userName = mView.getUserName(); 45 | String password = mView.getPassWord(); 46 | String rePassword = mView.getRePassWord(); 47 | 48 | apiModel.register(userName, password, rePassword, new DataObserver() { 49 | @Override 50 | protected void onError(String errorMsg) { 51 | mView.optionError(errorMsg); 52 | } 53 | 54 | @Override 55 | protected void onSuccess(UserBean data) { 56 | DbUtils.insertUserInfo(data); 57 | mView.optionSuccess(data); 58 | } 59 | }); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/login/LoginView.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.login; 2 | 3 | import com.allen.wanandroid.bean.UserBean; 4 | import com.library.base.mvp.IBaseMvpView; 5 | 6 | /** 7 | *
 8 |  *      @author : xiaoyao
 9 |  *      e-mail  : xiaoyao@51vest.com
10 |  *      date    : 2018/07/25
11 |  *      desc    :
12 |  *      version : 1.0
13 |  * 
14 | */ 15 | public interface LoginView extends IBaseMvpView { 16 | 17 | String getUserName(); 18 | String getPassWord(); 19 | String getRePassWord(); 20 | 21 | void optionSuccess(UserBean userBean); 22 | void optionError(String error); 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/mine/AboutActivity.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.mine; 2 | 3 | import android.content.Context; 4 | import android.graphics.Color; 5 | import android.os.Bundle; 6 | import android.support.design.widget.CollapsingToolbarLayout; 7 | import android.support.v7.widget.Toolbar; 8 | import android.text.Html; 9 | import android.view.View; 10 | import android.widget.TextView; 11 | 12 | import com.alibaba.android.arouter.facade.annotation.Route; 13 | import com.allen.wanandroid.BuildConfig; 14 | import com.allen.wanandroid.R; 15 | import com.allen.wanandroid.arouter.ARouterPath; 16 | import com.library.base.base.BaseActivity; 17 | import com.library.base.widget.TopBar; 18 | 19 | import butterknife.BindView; 20 | 21 | /** 22 | *
23 |  *      @author : xiaoyao
24 |  *      e-mail  : xiaoyao@51vest.com
25 |  *      date    : 2018/08/03
26 |  *      desc    : 关于我们
27 |  *      version : 1.0
28 |  * 
29 | */ 30 | @Route(path = ARouterPath.aboutActPath) 31 | public class AboutActivity extends BaseActivity { 32 | @BindView(R.id.toolbar) 33 | Toolbar toolbar; 34 | @BindView(R.id.about_tv) 35 | TextView aboutTv; 36 | @BindView(R.id.toolbar_layout) 37 | CollapsingToolbarLayout toolbarLayout; 38 | @BindView(R.id.version_tv) 39 | TextView versionTv; 40 | 41 | @Override 42 | protected void getBundleData(Bundle params) { 43 | 44 | } 45 | 46 | @Override 47 | public int bindLayout() { 48 | return R.layout.activity_about; 49 | } 50 | 51 | @Override 52 | public void setTopBar(TopBar topBar) { 53 | hideTopBar(); 54 | } 55 | 56 | @Override 57 | public boolean isCanRefresh() { 58 | return false; 59 | } 60 | 61 | @Override 62 | public void doOnRefresh() { 63 | 64 | } 65 | 66 | @Override 67 | public void initUI(Context context) { 68 | 69 | } 70 | 71 | @Override 72 | public void doBusiness(Context context) { 73 | versionTv.setText(BuildConfig.VERSION_NAME); 74 | toolbarLayout.setExpandedTitleColor(Color.WHITE);//设置展开后标题的颜色 75 | toolbarLayout.setCollapsedTitleTextColor(Color.WHITE);//设置收缩后标题的颜色 76 | toolbar.setNavigationOnClickListener(new View.OnClickListener() { 77 | @Override 78 | public void onClick(View v) { 79 | finish(); 80 | } 81 | }); 82 | aboutTv.setText(Html.fromHtml(getResources().getString(R.string.about_content))); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/mine/MineHomeFragment.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.mine; 2 | 3 | import android.content.Context; 4 | import android.view.View; 5 | import android.widget.TextView; 6 | 7 | import com.alibaba.android.arouter.facade.annotation.Route; 8 | import com.allen.wanandroid.R; 9 | import com.allen.wanandroid.arouter.ARouterPath; 10 | import com.library.base.mvp.BaseMvpFragment; 11 | import com.library.base.widget.TopBar; 12 | 13 | import butterknife.BindView; 14 | import butterknife.OnClick; 15 | 16 | /** 17 | *
 18 |  *      @author : xiaoyao
 19 |  *      e-mail  : xiaoyao@51vest.com
 20 |  *      date    : 2018/07/26
 21 |  *      desc    : 我的页面
 22 |  *      version : 1.0
 23 |  * 
24 | */ 25 | @Route(path = ARouterPath.mainMinePath) 26 | public class MineHomeFragment extends BaseMvpFragment implements MineHomeView { 27 | @BindView(R.id.user_name_tv) 28 | TextView userNameTv; 29 | 30 | @Override 31 | protected int setStatusBarColor() { 32 | return R.color.colorPrimary; 33 | } 34 | 35 | @Override 36 | protected MineHomePresenter createPresenter() { 37 | return new MineHomePresenter(); 38 | } 39 | 40 | @Override 41 | protected void lazyLoad() { 42 | 43 | } 44 | 45 | @Override 46 | public int bindLayout() { 47 | return R.layout.fragment_mine; 48 | } 49 | 50 | @Override 51 | public void initParams() { 52 | 53 | } 54 | 55 | @Override 56 | public void initTopBar(TopBar topBar) { 57 | topBar.isShowLeftImg(false).setCenterText("我的"); 58 | } 59 | 60 | @Override 61 | public void initView(View view) { 62 | 63 | } 64 | 65 | @Override 66 | public boolean isCanRefresh() { 67 | return false; 68 | } 69 | 70 | @Override 71 | public void doOnRefresh() { 72 | 73 | } 74 | 75 | 76 | @Override 77 | public void doBusiness(Context context) { 78 | mPresenter.setUserName(); 79 | } 80 | 81 | @Override 82 | public void setUserName(String userName) { 83 | userNameTv.setText(userName); 84 | } 85 | 86 | @OnClick({R.id.collect_stv, R.id.setting_stv, R.id.about_stv}) 87 | public void onViewClicked(View view) { 88 | switch (view.getId()) { 89 | case R.id.collect_stv: 90 | mPresenter.gotoCollectList(); 91 | break; 92 | case R.id.setting_stv: 93 | mPresenter.gotoSetting(); 94 | break; 95 | case R.id.about_stv: 96 | mPresenter.aboutMe(); 97 | break; 98 | } 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/mine/MineHomePresenter.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.mine; 2 | 3 | import com.allen.wanandroid.arouter.ARouterHelper; 4 | import com.allen.wanandroid.bean.UserBean; 5 | import com.allen.wanandroid.utils.DbUtils; 6 | import com.library.base.mvp.BaseMvpPresenter; 7 | 8 | /** 9 | *
10 |  *      @author : xiaoyao
11 |  *      e-mail  : xiaoyao@51vest.com
12 |  *      date    : 2018/07/26
13 |  *      desc    :
14 |  *      version : 1.0
15 |  * 
16 | */ 17 | public class MineHomePresenter extends BaseMvpPresenter { 18 | 19 | public void setUserName() { 20 | UserBean userBean = DbUtils.queryUserInfo(); 21 | if (null == userBean) { 22 | return; 23 | } 24 | mView.setUserName(userBean.getUsername()); 25 | } 26 | 27 | public void gotoCollectList() { 28 | ARouterHelper.gotoCollectList(); 29 | } 30 | 31 | public void gotoSetting() { 32 | ARouterHelper.setting(); 33 | } 34 | 35 | public void aboutMe() { 36 | ARouterHelper.about(); 37 | } 38 | 39 | 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/mine/MineHomeView.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.mine; 2 | 3 | import com.library.base.mvp.IBaseMvpView; 4 | 5 | /** 6 | *
 7 |  *      @author : xiaoyao
 8 |  *      e-mail  : xiaoyao@51vest.com
 9 |  *      date    : 2018/07/26
10 |  *      desc    :
11 |  *      version : 1.0
12 |  * 
13 | */ 14 | public interface MineHomeView extends IBaseMvpView { 15 | void setUserName(String userName); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/project/ProjectArticlePresenter.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.project; 2 | 3 | import com.allen.library.observer.DataObserver; 4 | import com.allen.wanandroid.api.ApiModel; 5 | import com.allen.wanandroid.bean.HomeBean; 6 | import com.library.base.mvp.BaseMvpPresenter; 7 | 8 | 9 | /** 10 | *
11 |  *      @author : Allen
12 |  *      e-mail  : lygttpod@163.com
13 |  *      date    : 2018/07/21
14 |  *      desc    :
15 |  *      version : 1.0
16 |  * 
17 | */ 18 | public class ProjectArticlePresenter extends BaseMvpPresenter { 19 | 20 | private ApiModel apiModel; 21 | 22 | public ProjectArticlePresenter() { 23 | this.apiModel = new ApiModel(); 24 | } 25 | 26 | 27 | public void collectArticleById(int id, final int position) { 28 | apiModel.collectArticleById(id, mView.getLoadingDialog(), new DataObserver() { 29 | @Override 30 | protected void onError(String errorMsg) { 31 | } 32 | 33 | @Override 34 | protected void onSuccess(String data) { 35 | mView.collectSuccess(position, "收藏成功"); 36 | } 37 | }); 38 | } 39 | 40 | public void cancelCollectArticleById(int id, final int position) { 41 | apiModel.cancelCollectArticleById(id, mView.getLoadingDialog(), new DataObserver() { 42 | @Override 43 | protected void onError(String errorMsg) { 44 | } 45 | 46 | @Override 47 | protected void onSuccess(String data) { 48 | mView.cancelCollectSuccess(position, "收藏已取消"); 49 | } 50 | }); 51 | } 52 | 53 | public void getProjectArticleListWithId(int page, int id) { 54 | apiModel.getProjectArticleListWithId(page, id, new DataObserver() { 55 | @Override 56 | protected void onError(String errorMsg) { 57 | mView.hideLoading(); 58 | } 59 | 60 | @Override 61 | protected void onSuccess(HomeBean data) { 62 | mView.hideLoading(); 63 | if (data.getCurPage() == 1) { 64 | mView.showNewArticleList(data.getDatas()); 65 | mView.enableLoadMore(!data.isOver()); 66 | } else { 67 | if (data.isOver()) { 68 | mView.loadMoreEnd(); 69 | } else { 70 | mView.loadMoreComplete(); 71 | } 72 | mView.showMoreArticleList(data.getDatas()); 73 | } 74 | } 75 | }); 76 | } 77 | 78 | } 79 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/project/ProjectArticleView.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.project; 2 | 3 | import com.allen.wanandroid.bean.HomeBean; 4 | import com.library.base.mvp.IBaseMvpView; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | *
10 |  *      @author : Allen
11 |  *      e-mail  : lygttpod@163.com
12 |  *      date    : 2018/07/21
13 |  *      desc    :
14 |  *      version : 1.0
15 |  * 
16 | */ 17 | public interface ProjectArticleView extends IBaseMvpView { 18 | 19 | void showNewArticleList(List list); 20 | void showMoreArticleList(List list); 21 | void collectSuccess(int position, String msg); 22 | void cancelCollectSuccess(int position, String msg); 23 | 24 | void loadMoreComplete(); 25 | void loadMoreEnd(); 26 | void enableLoadMore(boolean enable); 27 | 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/project/ProjectHomePresenter.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.project; 2 | 3 | import com.allen.library.observer.DataObserver; 4 | import com.allen.wanandroid.api.ApiModel; 5 | import com.allen.wanandroid.bean.CategoryBean; 6 | import com.allen.wanandroid.ui.project.ProjectHomeView; 7 | import com.library.base.mvp.BaseMvpPresenter; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | *
13 |  *      @author : xiaoyao
14 |  *      e-mail  : xiaoyao@51vest.com
15 |  *      date    : 2018/07/27
16 |  *      desc    :
17 |  *      version : 1.0
18 |  * 
19 | */ 20 | public class ProjectHomePresenter extends BaseMvpPresenter { 21 | 22 | private ApiModel apiModel; 23 | 24 | public ProjectHomePresenter() { 25 | apiModel = new ApiModel(); 26 | } 27 | 28 | public void getProjectTabData(){ 29 | apiModel.getProjectTabData(new DataObserver>() { 30 | @Override 31 | protected void onError(String errorMsg) { 32 | 33 | } 34 | 35 | @Override 36 | protected void onSuccess(List data) { 37 | mView.setTabData(data); 38 | } 39 | }); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/project/ProjectHomeView.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.project; 2 | 3 | import com.allen.wanandroid.bean.CategoryBean; 4 | import com.library.base.mvp.IBaseMvpView; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | *
10 |  *      @author : xiaoyao
11 |  *      e-mail  : xiaoyao@51vest.com
12 |  *      date    : 2018/07/27
13 |  *      desc    :
14 |  *      version : 1.0
15 |  * 
16 | */ 17 | public interface ProjectHomeView extends IBaseMvpView { 18 | 19 | void setTabData(List tabs); 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/search/SearchPresenter.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.search; 2 | 3 | import com.allen.library.observer.DataObserver; 4 | import com.allen.wanandroid.api.ApiModel; 5 | import com.allen.wanandroid.arouter.ARouterHelper; 6 | import com.allen.wanandroid.bean.HotBean; 7 | import com.library.base.mvp.BaseMvpPresenter; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | *
13 |  *      @author : xiaoyao
14 |  *      e-mail  : xiaoyao@51vest.com
15 |  *      date    : 2018/07/27
16 |  *      desc    :
17 |  *      version : 1.0
18 |  * 
19 | */ 20 | public class SearchPresenter extends BaseMvpPresenter { 21 | 22 | private ApiModel apiModel; 23 | 24 | public SearchPresenter() { 25 | this.apiModel = new ApiModel(); 26 | } 27 | 28 | public void gotoWebSiteDetail(String title, String url) { 29 | ARouterHelper.gotoWebViewActivity(title, url); 30 | } 31 | 32 | 33 | public void getHotSearchData() { 34 | apiModel.getHotSearchData(new DataObserver>() { 35 | @Override 36 | protected void onError(String errorMsg) { 37 | mView.hideLoading(); 38 | } 39 | 40 | @Override 41 | protected void onSuccess(List data) { 42 | mView.hideLoading(); 43 | mView.setHotSearchData(data); 44 | } 45 | }); 46 | } 47 | 48 | public void getWebSiteData() { 49 | apiModel.getWebSiteData(new DataObserver>() { 50 | @Override 51 | protected void onError(String errorMsg) { 52 | mView.hideLoading(); 53 | } 54 | 55 | @Override 56 | protected void onSuccess(List data) { 57 | mView.hideLoading(); 58 | mView.setWebSiteData(data); 59 | } 60 | }); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/search/SearchViewView.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.search; 2 | 3 | import com.allen.wanandroid.bean.HotBean; 4 | import com.library.base.mvp.IBaseMvpView; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | *
10 |  *      @author : xiaoyao
11 |  *      e-mail  : xiaoyao@51vest.com
12 |  *      date    : 2018/07/27
13 |  *      desc    :
14 |  *      version : 1.0
15 |  * 
16 | */ 17 | public interface SearchViewView extends IBaseMvpView { 18 | 19 | void setHotSearchData(List hotSearchData); 20 | void setWebSiteData(List webSiteData); 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/ui/webview/WebViewView.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.ui.webview; 2 | 3 | import android.widget.ProgressBar; 4 | 5 | import com.library.base.mvp.IBaseMvpView; 6 | 7 | /** 8 | *
 9 |  *      @author : xiaoyao
10 |  *      e-mail  : xiaoyao@51vest.com
11 |  *      date    : 2018/07/25
12 |  *      desc    :
13 |  *      version : 1.0
14 |  * 
15 | */ 16 | public interface WebViewView extends IBaseMvpView{ 17 | 18 | ProgressBar getProgressBar(); 19 | 20 | void setTitle(String title); 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/utils/DbUtils.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.utils; 2 | 3 | import com.allen.wanandroid.app.App; 4 | import com.allen.wanandroid.bean.UserBean; 5 | import com.allen.wanandroid.db.UserBeanDao; 6 | 7 | /** 8 | *
 9 |  *      @author : xiaoyao
10 |  *      e-mail  : xiaoyao@51vest.com
11 |  *      date    : 2018/07/26
12 |  *      desc    :
13 |  *      version : 1.0
14 |  * 
15 | */ 16 | public class DbUtils { 17 | public static UserBeanDao getUserDao() { 18 | return App.getDaoSession().getUserBeanDao(); 19 | } 20 | 21 | /** 22 | * 插入数据库操作 23 | */ 24 | public static void insertUserInfo(UserBean userBean) { 25 | UserBean user = getUserDao() 26 | .queryBuilder() 27 | .where(UserBeanDao.Properties.Id.eq(userBean.getId())) 28 | .build() 29 | .unique(); 30 | if (null != user) { 31 | deleteUserInfo(userBean); 32 | } 33 | getUserDao().insert(userBean); 34 | } 35 | 36 | /** 37 | * 删除某行数据 38 | * 39 | * @param userBean 40 | */ 41 | public static void deleteUserInfo(UserBean userBean) { 42 | getUserDao().delete(userBean); 43 | } 44 | 45 | public static UserBean queryUserInfo(){ 46 | UserBean user = getUserDao() 47 | .queryBuilder() 48 | .build() 49 | .unique(); 50 | return user; 51 | } 52 | public static boolean isQueryUser(){ 53 | return null!=queryUserInfo(); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/utils/DisplayUtils.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.utils; 2 | 3 | import android.util.DisplayMetrics; 4 | 5 | import com.allen.wanandroid.app.App; 6 | 7 | 8 | /** 9 | *
 10 |  *      @author : xiaoyao
 11 |  *      e-mail  : xiaoyao@51vest.com
 12 |  *      date    : 2018/02/05
 13 |  *      desc    : 屏幕信息有关的类,包括屏幕的长宽、分辨率、长度换算
 14 |  *      version : 1.0
 15 |  * 
16 | */ 17 | public class DisplayUtils { 18 | 19 | private static DisplayMetrics metrics; 20 | 21 | static { 22 | metrics = App.getContext().getResources().getDisplayMetrics(); 23 | } 24 | 25 | public static DisplayMetrics getDisplayMetrics() { 26 | return metrics; 27 | } 28 | 29 | /** 30 | * 获取屏幕的像素密度(DPI) 31 | * 32 | * @return 33 | */ 34 | public static int getDpi() { 35 | return (int) (metrics.density * 160); 36 | } 37 | 38 | /** 39 | * 获取px与dp的比值,比如返回2,1dp=2px 40 | */ 41 | public static float getDensity() { 42 | return metrics.density; 43 | } 44 | 45 | /** 46 | * 获取屏幕宽度,以像素为单位 47 | * 48 | * @return 49 | */ 50 | public static int getScreenWidth() { 51 | return metrics.widthPixels; 52 | } 53 | 54 | /** 55 | * 获取屏幕高度,以像素为单位 56 | * 57 | * @return 58 | */ 59 | public static int getScreenHeight() { 60 | return metrics.heightPixels; 61 | } 62 | 63 | /** 64 | * 字体大小单位由sp转为px 65 | * 66 | * @param spValue 原sp单位 67 | * @return 新的px单位 68 | */ 69 | public static int sp2px(float spValue) { 70 | final float fontScale = metrics.scaledDensity; 71 | return (int) (spValue * fontScale + 0.5f); 72 | } 73 | 74 | /** 75 | * 字体大小由px转为sp 76 | * 77 | * @param pxValue 原px单位 78 | * @return 新的sp单位 79 | */ 80 | public static int px2sp(float pxValue) { 81 | final float fontScale = metrics.scaledDensity; 82 | return (int) (pxValue / fontScale + 0.5f); 83 | } 84 | 85 | /** 86 | * 长度单位由dp转为px 87 | * 88 | * @param dpValue 原dp单位 89 | * @return 转换后的px单位 90 | */ 91 | public static int dp2px(float dpValue) { 92 | final float density = getDensity(); 93 | return (int) (dpValue * density + 0.5f); 94 | } 95 | 96 | /** 97 | * 长度单位由px转为dp 98 | * 99 | * @param pxValue 原px单位 100 | * @return 转换后的dp单位 101 | */ 102 | public static int px2dp(float pxValue) { 103 | final float density = getDensity(); 104 | return (int) (pxValue / density + 0.5f); 105 | } 106 | 107 | } 108 | -------------------------------------------------------------------------------- /app/src/main/java/com/allen/wanandroid/widget/CustomViewPager.java: -------------------------------------------------------------------------------- 1 | package com.allen.wanandroid.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 | /** 11 | *
12 |  *      @author : Allen
13 |  *      e-mail  : lygttpod@163.com
14 |  *      date    : 2018/08/04
15 |  *      desc    : 禁止左右滑动和去除切换动画的viewPager
16 |  *      version : 1.0
17 |  * 
18 | */ 19 | public class CustomViewPager extends ViewPager{ 20 | public CustomViewPager(@NonNull Context context) { 21 | super(context); 22 | } 23 | 24 | public CustomViewPager(@NonNull Context context, @Nullable AttributeSet attrs) { 25 | super(context, attrs); 26 | } 27 | 28 | @Override 29 | public void setCurrentItem(int item) { 30 | super.setCurrentItem(item,false); 31 | } 32 | 33 | @Override 34 | public void setCurrentItem(int item, boolean smoothScroll) { 35 | super.setCurrentItem(item, smoothScroll); 36 | } 37 | 38 | @Override 39 | protected boolean dispatchGenericFocusedEvent(MotionEvent event) { 40 | return super.dispatchGenericFocusedEvent(event); 41 | } 42 | 43 | @Override 44 | public boolean onInterceptTouchEvent(MotionEvent ev) { 45 | return false; 46 | } 47 | 48 | @Override 49 | public boolean onTouchEvent(MotionEvent ev) { 50 | return false; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /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/ic_search_close_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/progress_web_view_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_category_tag_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_tag_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_article.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 10 | 11 | 20 | 21 | 30 | 31 | 32 | 33 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_login.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | 12 | 15 | 16 | 20 | 21 | 22 | 25 | 26 | 31 | 32 | 33 | 37 | 38 | 43 | 44 | 45 | 52 | 53 |