From 263a0bfbca46a2ae8c6560f0869aaff92769b80d Mon Sep 17 00:00:00 2001 From: wlj Date: Tue, 1 Nov 2016 11:19:03 +0800 Subject: [PATCH] Initial commit --- .gitignore | 9 + .idea/compiler.xml | 22 + .idea/copyright/profiles_settings.xml | 3 + .idea/gradle.xml | 22 + .idea/inspectionProfiles/Project_Default.xml | 10 + .../inspectionProfiles/profiles_settings.xml | 7 + .idea/misc.xml | 46 ++ .idea/modules.xml | 12 + .idea/runConfigurations.xml | 12 + app/.gitignore | 1 + app/build.gradle | 60 ++ app/proguard-rules.pro | 17 + .../duohaowan/ExampleInstrumentedTest.java | 26 + app/src/main/AndroidManifest.xml | 50 ++ app/src/main/assets/fonts/phone.ttf | Bin 0 -> 5060 bytes app/src/main/ic_launcher-web.png | Bin 0 -> 24863 bytes .../main/java/com/hd/wlj/duohaowan/App.java | 11 + .../duohaowan/Behavior/FooterBehavior.java | 103 +++ .../Behavior/FooterBehaviorDependAppBar.java | 31 + .../Behavior/ToolbarAlphaBehavior.java | 45 ++ .../java/com/hd/wlj/duohaowan/DataPass.java | 10 + .../com/hd/wlj/duohaowan/MainActivity.java | 315 +++++++++ .../main/java/com/hd/wlj/duohaowan/Urls.java | 19 + .../adapter/RecyclerViewAdapter.java | 58 ++ .../java/com/hd/wlj/duohaowan/been/News.java | 40 ++ .../java/com/hd/wlj/duohaowan/been/User.java | 153 +++++ .../wlj/duohaowan/ui/ForgetPSWActivity.java | 202 ++++++ .../hd/wlj/duohaowan/ui/LoginActivity.java | 172 +++++ .../hd/wlj/duohaowan/ui/RegesterActivity.java | 208 ++++++ .../ui/detailswork/WorkDetailsActivity.java | 30 + .../detailswork/contract/DetailsContract.java | 24 + .../detailswork/model/DetailsModelImpl.java | 10 + .../presenter/DetailsPresenterImpl.java | 10 + .../duohaowan/ui/follow/FollowFragment.java | 30 + .../wlj/duohaowan/ui/home/HomeFragment.java | 295 ++++++++ .../hd/wlj/duohaowan/ui/home/HotFragment.java | 90 +++ .../ui/home/contract/HomeContract.java | 37 + .../ui/home/model/HomeModelImpl.java | 164 +++++ .../ui/home/presenter/HomePresenterImpl.java | 148 ++++ .../view/HorizontalScrollViewAdapter.java | 78 +++ .../ui/home/view/KamHorizontalScrollView.java | 303 +++++++++ .../ui/home/view/KamLinearLayout.java | 34 + .../ui/home/view/MyHorizontalScrollView.java | 278 ++++++++ .../hd/wlj/duohaowan/ui/my/MyFragment.java | 30 + .../wlj/duohaowan/ui/seach/SeachFragment.java | 30 + .../com/hd/wlj/duohaowan/view/ImgInpImg.java | 131 ++++ .../wlj/duohaowan/wxapi/WXEntryActivity.java | 164 +++++ .../adapter/abslistview/CommonAdapter.java | 41 ++ .../abslistview/MultiItemTypeAdapter.java | 98 +++ .../zhy/adapter/abslistview/ViewHolder.java | 290 ++++++++ .../abslistview/base/ItemViewDelegate.java | 22 + .../base/ItemViewDelegateManager.java | 133 ++++ .../adapter/recyclerview/CommonAdapter.java | 55 ++ .../recyclerview/MultiItemTypeAdapter.java | 124 ++++ .../recyclerview/base/ItemViewDelegate.java | 18 + .../base/ItemViewDelegateManager.java | 116 ++++ .../adapter/recyclerview/base/ViewHolder.java | 271 ++++++++ .../recyclerview/utils/WrapperUtils.java | 53 ++ .../recyclerview/wrapper/EmptyWrapper.java | 125 ++++ .../wrapper/HeaderAndFooterWrapper.java | 152 +++++ .../recyclerview/wrapper/LoadMoreWrapper.java | 162 +++++ .../main/res/drawable-hdpi/icon_verify.png | Bin 0 -> 21941 bytes .../res/drawable-xhdpi/icon_artgallery.png | Bin 0 -> 30611 bytes .../main/res/drawable-xhdpi/icon_artist.png | Bin 0 -> 30582 bytes .../main/res/drawable-xhdpi/icon_artview.png | Bin 0 -> 30620 bytes app/src/main/res/drawable-xhdpi/icon_back.png | Bin 0 -> 19821 bytes .../res/drawable-xhdpi/icon_home_fat_in.png | Bin 0 -> 28397 bytes .../drawable-xhdpi/icon_home_fat_out.9.png | Bin 0 -> 1107 bytes app/src/main/res/drawable-xhdpi/icon_laba.png | Bin 0 -> 29639 bytes .../res/drawable-xhdpi/icon_workofart.png | Bin 0 -> 30606 bytes app/src/main/res/drawable-xhdpi/login_03.png | Bin 0 -> 19831 bytes app/src/main/res/drawable-xhdpi/logo_qq.png | Bin 0 -> 4350 bytes .../main/res/drawable-xhdpi/logo_wechat.png | Bin 0 -> 2285 bytes app/src/main/res/drawable-xhdpi/tab_fabu.png | Bin 0 -> 28763 bytes .../res/drawable-xhdpi/tab_follow_nor.png | Bin 0 -> 27628 bytes .../res/drawable-xhdpi/tab_follow_sel.png | Bin 0 -> 27543 bytes .../main/res/drawable-xhdpi/tab_home_nor.png | Bin 0 -> 27655 bytes .../main/res/drawable-xhdpi/tab_home_sel.png | Bin 0 -> 27530 bytes .../main/res/drawable-xhdpi/tab_my_nor.png | Bin 0 -> 27863 bytes .../main/res/drawable-xhdpi/tab_my_sel.png | Bin 0 -> 27523 bytes .../main/res/drawable-xhdpi/tab_seach_nor.png | Bin 0 -> 27904 bytes .../main/res/drawable-xhdpi/tab_seach_sel.png | Bin 0 -> 27658 bytes .../res/drawable/ic_backspace_black_24dp.xml | 10 + .../main/res/drawable/shape_hui1_white.xml | 9 + app/src/main/res/drawable/shape_hui_white.xml | 9 + .../main/res/drawable/tab_follow_select.xml | 6 + app/src/main/res/drawable/tab_home_select.xml | 6 + app/src/main/res/drawable/tab_my_select.xml | 6 + .../main/res/drawable/tab_seach_select.xml | 6 + app/src/main/res/layout/activity_login.xml | 160 +++++ app/src/main/res/layout/activity_main.xml | 152 +++++ app/src/main/res/layout/activity_regester.xml | 145 ++++ .../main/res/layout/activity_work_details.xml | 116 ++++ app/src/main/res/layout/fragment_follow.xml | 13 + app/src/main/res/layout/fragment_home.xml | 24 + app/src/main/res/layout/fragment_home_hot.xml | 43 ++ app/src/main/res/layout/fragment_my.xml | 13 + app/src/main/res/layout/fragment_seach.xml | 20 + .../res/layout/item_home_recyclerview.xml | 75 +++ app/src/main/res/layout/part_home_head.xml | 171 +++++ app/src/main/res/layout/popwindow_layout.xml | 176 +++++ app/src/main/res/layout/view_img_inp_img.xml | 32 + app/src/main/res/layout/ww.xml | 25 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1898 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1297 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2639 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 4130 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 6051 bytes app/src/main/res/values-v19/styles.xml | 9 + app/src/main/res/values-v22/styles.xml | 14 + app/src/main/res/values-w820dp/dimens.xml | 6 + app/src/main/res/values/attrs.xml | 18 + app/src/main/res/values/colors.xml | 11 + app/src/main/res/values/dimens.xml | 6 + app/src/main/res/values/strings.xml | 40 ++ app/src/main/res/values/styles.xml | 39 ++ .../com/hd/wlj/duohaowan/ExampleUnitTest.java | 17 + base/.gitignore | 1 + base/build.gradle | 32 + base/proguard-rules.pro | 17 + .../com/wlj/base/ExampleInstrumentedTest.java | 26 + base/src/main/AndroidManifest.xml | 16 + base/src/main/assets/fonts/iconfont.ttf | Bin 0 -> 18852 bytes .../orhanobut/logger/AndroidLogAdapter.java | 29 + .../java/com/orhanobut/logger/Helper.java | 105 +++ .../java/com/orhanobut/logger/LogAdapter.java | 15 + .../java/com/orhanobut/logger/LogLevel.java | 14 + .../java/com/orhanobut/logger/Logger.java | 112 ++++ .../com/orhanobut/logger/LoggerPrinter.java | 401 +++++++++++ .../java/com/orhanobut/logger/Printer.java | 35 + .../java/com/orhanobut/logger/Settings.java | 72 ++ .../main/java/com/wlj/base/RecycleBin.java | 152 +++++ .../com/wlj/base/RecyclingPagerAdapter.java | 108 +++ .../com/wlj/base/adapter/CommonAdapter.java | 86 +++ .../wlj/base/adapter/ImagePagerAdapter.java | 89 +++ .../java/com/wlj/base/adapter/ListItem.java | 1 + .../adapter/MyFragmentStatePagerAdapter.java | 77 +++ .../java/com/wlj/base/adapter/ViewHolder.java | 160 +++++ .../main/java/com/wlj/base/bean/Banner.java | 51 ++ .../src/main/java/com/wlj/base/bean/Base.java | 101 +++ .../main/java/com/wlj/base/bean/BaseList.java | 130 ++++ .../main/java/com/wlj/base/bean/Result.java | 124 ++++ .../main/java/com/wlj/base/bean/TabBar.java | 32 + .../main/java/com/wlj/base/ob/Observer.java | 11 + .../com/wlj/base/ob/ObserversImageView.java | 85 +++ .../com/wlj/base/ob/ObserversScrollView.java | 142 ++++ .../main/java/com/wlj/base/ob/Subject.java | 18 + .../java/com/wlj/base/ui/BaseFragment.java | 82 +++ .../com/wlj/base/ui/BaseFragmentActivity.java | 70 ++ .../com/wlj/base/update/DownLoadManager.java | 67 ++ .../main/java/com/wlj/base/update/Update.java | 293 ++++++++ .../java/com/wlj/base/update/UpdateInfo.java | 118 ++++ .../java/com/wlj/base/util/AppConfig.java | 177 +++++ .../java/com/wlj/base/util/AppContext.java | 634 ++++++++++++++++++ .../java/com/wlj/base/util/AppException.java | 250 +++++++ .../java/com/wlj/base/util/AppManager.java | 98 +++ .../java/com/wlj/base/util/CyptoUtils.java | 302 +++++++++ .../main/java/com/wlj/base/util/DpAndPx.java | 29 + .../com/wlj/base/util/ExecutorServices.java | 22 + .../com/wlj/base/util/GetResourceImage.java | 96 +++ .../main/java/com/wlj/base/util/GoToHelp.java | 20 + .../java/com/wlj/base/util/ListUtils.java | 202 ++++++ base/src/main/java/com/wlj/base/util/Log.java | 26 + .../main/java/com/wlj/base/util/MathUtil.java | 211 ++++++ .../com/wlj/base/util/RequestException.java | 27 + .../com/wlj/base/util/StatusBarHeight.java | 37 + .../java/com/wlj/base/util/StringUtils.java | 330 +++++++++ .../com/wlj/base/util/SyncImageLoader.java | 187 ++++++ .../java/com/wlj/base/util/TimeZoneUtil.java | 46 ++ .../main/java/com/wlj/base/util/UIHelper.java | 143 ++++ .../com/wlj/base/util/img/BitmapUtil.java | 180 +++++ .../com/wlj/base/util/img/ImageFileCache.java | 403 +++++++++++ .../wlj/base/util/img/ImageGetForHttp.java | 43 ++ .../com/wlj/base/util/img/ImageLrucache.java | 89 +++ .../com/wlj/base/util/img/LazyScrollView.java | 119 ++++ .../java/com/wlj/base/util/img/LoadImage.java | 265 ++++++++ .../base/util/statusbar/StatusBarUtil.java | 598 +++++++++++++++++ .../base/util/statusbar/StatusBarView.java | 21 + .../main/java/com/wlj/base/web/BaseURL.java | 8 + .../java/com/wlj/base/web/BaseWebMain.java | 131 ++++ .../com/wlj/base/web/CallWebserviceImp.java | 17 + .../src/main/java/com/wlj/base/web/EnAes.java | 145 ++++ .../main/java/com/wlj/base/web/Encrpt.java | 10 + .../main/java/com/wlj/base/web/HttpGet.java | 72 ++ .../main/java/com/wlj/base/web/HttpPost.java | 242 +++++++ .../main/java/com/wlj/base/web/Md5Util.java | 82 +++ .../java/com/wlj/base/web/MsgContext.java | 27 + .../com/wlj/base/web/RequestWebClient.java | 213 ++++++ .../java/com/wlj/base/web/asyn/AsyncCall.java | 169 +++++ .../wlj/base/web/asyn/AsyncRequestModle.java | 166 +++++ .../base/web/asyn/AsyncRequestWebClient.java | 132 ++++ .../com/wlj/base/web/asyn/BaseAsyncModle.java | 123 ++++ .../java/com/wlj/base/web/asyn/Encrpt.java | 31 + .../wlj/base/widget/AutoScrollViewPager.java | 391 +++++++++++ .../base/widget/CustomDurationScroller.java | 47 ++ .../com/wlj/base/widget/IconfontTextview.java | 68 ++ .../java/com/wlj/base/widget/MyGridView.java | 32 + .../java/com/wlj/base/widget/MyListView.java | 30 + .../com/wlj/base/widget/MyScrollLayout.java | 371 ++++++++++ .../com/wlj/base/widget/ScllorTabView.java | 74 ++ .../com/wlj/base/widget/StickListView.java | 341 ++++++++++ .../com/wlj/base/widget/StickScrollView.java | 254 +++++++ .../base/widget/SwitchViewDemoActivity.java | 196 ++++++ .../com/wlj/base/widget/SwitchViewPager.java | 270 ++++++++ .../src/main/res/drawable-hdpi/project_bg.jpg | Bin 0 -> 19063 bytes .../res/drawable-xxhdpi/progress_bg_small.png | Bin 0 -> 1180 bytes .../res/drawable-xxhdpi/progress_go_small.png | Bin 0 -> 1244 bytes .../res/drawable/loading_point_selector.xml | 6 + base/src/main/res/layout/progressbar.xml | 17 + base/src/main/res/values/attrs.xml | 6 + base/src/main/res/values/colors.xml | 10 + base/src/main/res/values/ids.xml | 4 + base/src/main/res/values/strings.xml | 7 + .../java/com/wlj/base/ExampleUnitTest.java | 17 + build.gradle | 26 + gesturelock/.gitignore | 1 + gesturelock/build.gradle | 32 + gesturelock/proguard-rules.pro | 17 + .../gesturelock/ExampleInstrumentedTest.java | 26 + gesturelock/src/main/AndroidManifest.xml | 15 + .../wlj/gesturelock/GestureEditActivity.java | 141 ++++ .../wlj/gesturelock/GestureMainActivity.java | 54 ++ .../gesturelock/GestureVerifyActivity.java | 134 ++++ .../com/wlj/gesturelock/common/AppUtil.java | 29 + .../com/wlj/gesturelock/common/Constants.java | 11 + .../wlj/gesturelock/entity/GesturePoint.java | 192 ++++++ .../widget/GestureContentView.java | 119 ++++ .../gesturelock/widget/GestureDrawline.java | 336 ++++++++++ .../wlj/gesturelock/widget/LockIndicator.java | 102 +++ gesturelock/src/main/res/anim/shake.xml | 8 + .../res/color/gesture_cancel_text_color.xml | 6 + .../res/drawable-hdpi/gesture_node_normal.png | Bin 0 -> 8896 bytes .../drawable-hdpi/gesture_node_pressed.png | Bin 0 -> 13426 bytes .../res/drawable-hdpi/gesture_node_wrong.png | Bin 0 -> 13187 bytes .../lock_pattern_node_normal.png | Bin 0 -> 1072 bytes .../lock_pattern_node_pressed.png | Bin 0 -> 1072 bytes .../src/main/res/drawable-hdpi/user_logo.png | Bin 0 -> 26244 bytes .../main/res/layout/activity_gesture_edit.xml | 80 +++ .../res/layout/activity_gesture_verify.xml | 108 +++ .../main/res/layout/activity_main_gesture.xml | 35 + gesturelock/src/main/res/values/strings.xml | 12 + .../com/wlj/gesturelock/ExampleUnitTest.java | 17 + gradle.properties | 17 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 160 +++++ gradlew.bat | 90 +++ settings.gradle | 1 + third/.gitignore | 1 + third/build.gradle | 37 + third/libs/libammsdk.jar | Bin 0 -> 203129 bytes third/libs/mta-sdk-1.6.2.jar | Bin 0 -> 76732 bytes third/libs/open_sdk_r5756.jar | Bin 0 -> 521717 bytes third/libs/weiboSDKCore_3.1.4.jar | Bin 0 -> 439483 bytes third/proguard-rules.pro | 17 + .../hd/wlj/third/ExampleInstrumentedTest.java | 26 + third/src/main/AndroidManifest.xml | 8 + .../main/java/com/hd/wlj/third/quicklogin/d | 0 .../hd/wlj/third/quicklogin/wx/WXLogin.java | 31 + .../com/hd/wlj/third/share/Constants.java | 27 + .../com/hd/wlj/third/share/ShareModle.java | 75 +++ .../java/com/hd/wlj/third/share/ShareUI.java | 220 ++++++ .../hd/wlj/third/share/qq/BaseUIListener.java | 84 +++ .../com/hd/wlj/third/share/qq/QQshare.java | 250 +++++++ .../third/share/sina/AccessTokenKeeper.java | 96 +++ .../hd/wlj/third/share/sina/SinaShare.java | 116 ++++ .../hd/wlj/third/share/sina/myResponse.java | 37 + .../wlj/third/share/weixin/WeiXinShare.java | 180 +++++ .../main/jniLibs/arm64-v8a/libweibosdkcore.so | Bin 0 -> 30232 bytes .../jniLibs/armeabi-v7a/libweibosdkcore.so | Bin 0 -> 25848 bytes .../main/jniLibs/armeabi/libweibosdkcore.so | Bin 0 -> 25840 bytes .../src/main/jniLibs/mips/libweibosdkcore.so | Bin 0 -> 72056 bytes .../main/jniLibs/mips64/libweibosdkcore.so | Bin 0 -> 35848 bytes third/src/main/jniLibs/x86/libweibosdkcore.so | Bin 0 -> 25916 bytes .../main/jniLibs/x86_64/libweibosdkcore.so | Bin 0 -> 26384 bytes third/src/main/res/anim/slide_in_bottom.xml | 9 + .../main/res/anim/slide_in_from_bottom.xml | 7 + third/src/main/res/anim/slide_out_bottom.xml | 9 + .../main/res/anim/slide_out_from_bottom.xml | 7 + .../main/res/drawable-xhdpi/fuzhilianjie.png | Bin 0 -> 1039 bytes third/src/main/res/drawable-xhdpi/logo_qq.png | Bin 0 -> 4350 bytes .../main/res/drawable-xhdpi/logo_qzone.png | Bin 0 -> 2712 bytes .../res/drawable-xhdpi/logo_sinaweibo.png | Bin 0 -> 3661 bytes .../res/drawable-xhdpi/logo_tencentweibo.png | Bin 0 -> 3628 bytes .../main/res/drawable-xhdpi/logo_wechat.png | Bin 0 -> 2285 bytes .../res/drawable-xhdpi/logo_wechatmoments.png | Bin 0 -> 3616 bytes .../res/drawable-xhdpi/shoucang_xx_red.png | Bin 0 -> 1132 bytes .../main/res/drawable-xhdpi/shouchang_xx.png | Bin 0 -> 1181 bytes .../main/res/layout/item_share_gridview.xml | 23 + third/src/main/res/layout/share.xml | 89 +++ third/src/main/res/values/colors.xml | 6 + third/src/main/res/values/strings.xml | 6 + third/src/main/res/values/styles.xml | 21 + .../com/hd/wlj/third/ExampleUnitTest.java | 17 + 294 files changed, 20897 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/hd/wlj/duohaowan/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/assets/fonts/phone.ttf create mode 100644 app/src/main/ic_launcher-web.png create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/App.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/Behavior/FooterBehavior.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/Behavior/FooterBehaviorDependAppBar.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/Behavior/ToolbarAlphaBehavior.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/DataPass.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/MainActivity.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/Urls.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/adapter/RecyclerViewAdapter.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/been/News.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/been/User.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/ForgetPSWActivity.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/LoginActivity.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/RegesterActivity.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/WorkDetailsActivity.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/contract/DetailsContract.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/model/DetailsModelImpl.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/presenter/DetailsPresenterImpl.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/follow/FollowFragment.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/home/HomeFragment.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/home/HotFragment.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/home/contract/HomeContract.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/home/model/HomeModelImpl.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/home/presenter/HomePresenterImpl.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/HorizontalScrollViewAdapter.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/KamHorizontalScrollView.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/KamLinearLayout.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/MyHorizontalScrollView.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/my/MyFragment.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/ui/seach/SeachFragment.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/view/ImgInpImg.java create mode 100644 app/src/main/java/com/hd/wlj/duohaowan/wxapi/WXEntryActivity.java create mode 100755 app/src/main/java/com/zhy/adapter/abslistview/CommonAdapter.java create mode 100755 app/src/main/java/com/zhy/adapter/abslistview/MultiItemTypeAdapter.java create mode 100755 app/src/main/java/com/zhy/adapter/abslistview/ViewHolder.java create mode 100755 app/src/main/java/com/zhy/adapter/abslistview/base/ItemViewDelegate.java create mode 100755 app/src/main/java/com/zhy/adapter/abslistview/base/ItemViewDelegateManager.java create mode 100755 app/src/main/java/com/zhy/adapter/recyclerview/CommonAdapter.java create mode 100755 app/src/main/java/com/zhy/adapter/recyclerview/MultiItemTypeAdapter.java create mode 100755 app/src/main/java/com/zhy/adapter/recyclerview/base/ItemViewDelegate.java create mode 100755 app/src/main/java/com/zhy/adapter/recyclerview/base/ItemViewDelegateManager.java create mode 100755 app/src/main/java/com/zhy/adapter/recyclerview/base/ViewHolder.java create mode 100755 app/src/main/java/com/zhy/adapter/recyclerview/utils/WrapperUtils.java create mode 100755 app/src/main/java/com/zhy/adapter/recyclerview/wrapper/EmptyWrapper.java create mode 100755 app/src/main/java/com/zhy/adapter/recyclerview/wrapper/HeaderAndFooterWrapper.java create mode 100755 app/src/main/java/com/zhy/adapter/recyclerview/wrapper/LoadMoreWrapper.java create mode 100755 app/src/main/res/drawable-hdpi/icon_verify.png create mode 100755 app/src/main/res/drawable-xhdpi/icon_artgallery.png create mode 100755 app/src/main/res/drawable-xhdpi/icon_artist.png create mode 100755 app/src/main/res/drawable-xhdpi/icon_artview.png create mode 100755 app/src/main/res/drawable-xhdpi/icon_back.png create mode 100644 app/src/main/res/drawable-xhdpi/icon_home_fat_in.png create mode 100644 app/src/main/res/drawable-xhdpi/icon_home_fat_out.9.png create mode 100755 app/src/main/res/drawable-xhdpi/icon_laba.png create mode 100755 app/src/main/res/drawable-xhdpi/icon_workofart.png create mode 100755 app/src/main/res/drawable-xhdpi/login_03.png create mode 100755 app/src/main/res/drawable-xhdpi/logo_qq.png create mode 100755 app/src/main/res/drawable-xhdpi/logo_wechat.png create mode 100755 app/src/main/res/drawable-xhdpi/tab_fabu.png create mode 100755 app/src/main/res/drawable-xhdpi/tab_follow_nor.png create mode 100755 app/src/main/res/drawable-xhdpi/tab_follow_sel.png create mode 100755 app/src/main/res/drawable-xhdpi/tab_home_nor.png create mode 100755 app/src/main/res/drawable-xhdpi/tab_home_sel.png create mode 100755 app/src/main/res/drawable-xhdpi/tab_my_nor.png create mode 100755 app/src/main/res/drawable-xhdpi/tab_my_sel.png create mode 100755 app/src/main/res/drawable-xhdpi/tab_seach_nor.png create mode 100755 app/src/main/res/drawable-xhdpi/tab_seach_sel.png create mode 100644 app/src/main/res/drawable/ic_backspace_black_24dp.xml create mode 100755 app/src/main/res/drawable/shape_hui1_white.xml create mode 100755 app/src/main/res/drawable/shape_hui_white.xml create mode 100755 app/src/main/res/drawable/tab_follow_select.xml create mode 100755 app/src/main/res/drawable/tab_home_select.xml create mode 100755 app/src/main/res/drawable/tab_my_select.xml create mode 100755 app/src/main/res/drawable/tab_seach_select.xml create mode 100644 app/src/main/res/layout/activity_login.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_regester.xml create mode 100644 app/src/main/res/layout/activity_work_details.xml create mode 100644 app/src/main/res/layout/fragment_follow.xml create mode 100644 app/src/main/res/layout/fragment_home.xml create mode 100644 app/src/main/res/layout/fragment_home_hot.xml create mode 100644 app/src/main/res/layout/fragment_my.xml create mode 100644 app/src/main/res/layout/fragment_seach.xml create mode 100644 app/src/main/res/layout/item_home_recyclerview.xml create mode 100644 app/src/main/res/layout/part_home_head.xml create mode 100755 app/src/main/res/layout/popwindow_layout.xml create mode 100644 app/src/main/res/layout/view_img_inp_img.xml create mode 100644 app/src/main/res/layout/ww.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/values-v19/styles.xml create mode 100644 app/src/main/res/values-v22/styles.xml create mode 100644 app/src/main/res/values-w820dp/dimens.xml create mode 100644 app/src/main/res/values/attrs.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/test/java/com/hd/wlj/duohaowan/ExampleUnitTest.java create mode 100644 base/.gitignore create mode 100644 base/build.gradle create mode 100644 base/proguard-rules.pro create mode 100644 base/src/androidTest/java/com/wlj/base/ExampleInstrumentedTest.java create mode 100644 base/src/main/AndroidManifest.xml create mode 100644 base/src/main/assets/fonts/iconfont.ttf create mode 100755 base/src/main/java/com/orhanobut/logger/AndroidLogAdapter.java create mode 100755 base/src/main/java/com/orhanobut/logger/Helper.java create mode 100755 base/src/main/java/com/orhanobut/logger/LogAdapter.java create mode 100755 base/src/main/java/com/orhanobut/logger/LogLevel.java create mode 100755 base/src/main/java/com/orhanobut/logger/Logger.java create mode 100755 base/src/main/java/com/orhanobut/logger/LoggerPrinter.java create mode 100755 base/src/main/java/com/orhanobut/logger/Printer.java create mode 100755 base/src/main/java/com/orhanobut/logger/Settings.java create mode 100755 base/src/main/java/com/wlj/base/RecycleBin.java create mode 100755 base/src/main/java/com/wlj/base/RecyclingPagerAdapter.java create mode 100755 base/src/main/java/com/wlj/base/adapter/CommonAdapter.java create mode 100755 base/src/main/java/com/wlj/base/adapter/ImagePagerAdapter.java create mode 100755 base/src/main/java/com/wlj/base/adapter/ListItem.java create mode 100755 base/src/main/java/com/wlj/base/adapter/MyFragmentStatePagerAdapter.java create mode 100755 base/src/main/java/com/wlj/base/adapter/ViewHolder.java create mode 100644 base/src/main/java/com/wlj/base/bean/Banner.java create mode 100755 base/src/main/java/com/wlj/base/bean/Base.java create mode 100755 base/src/main/java/com/wlj/base/bean/BaseList.java create mode 100755 base/src/main/java/com/wlj/base/bean/Result.java create mode 100644 base/src/main/java/com/wlj/base/bean/TabBar.java create mode 100755 base/src/main/java/com/wlj/base/ob/Observer.java create mode 100755 base/src/main/java/com/wlj/base/ob/ObserversImageView.java create mode 100755 base/src/main/java/com/wlj/base/ob/ObserversScrollView.java create mode 100755 base/src/main/java/com/wlj/base/ob/Subject.java create mode 100755 base/src/main/java/com/wlj/base/ui/BaseFragment.java create mode 100755 base/src/main/java/com/wlj/base/ui/BaseFragmentActivity.java create mode 100755 base/src/main/java/com/wlj/base/update/DownLoadManager.java create mode 100755 base/src/main/java/com/wlj/base/update/Update.java create mode 100755 base/src/main/java/com/wlj/base/update/UpdateInfo.java create mode 100755 base/src/main/java/com/wlj/base/util/AppConfig.java create mode 100755 base/src/main/java/com/wlj/base/util/AppContext.java create mode 100755 base/src/main/java/com/wlj/base/util/AppException.java create mode 100755 base/src/main/java/com/wlj/base/util/AppManager.java create mode 100755 base/src/main/java/com/wlj/base/util/CyptoUtils.java create mode 100755 base/src/main/java/com/wlj/base/util/DpAndPx.java create mode 100755 base/src/main/java/com/wlj/base/util/ExecutorServices.java create mode 100755 base/src/main/java/com/wlj/base/util/GetResourceImage.java create mode 100644 base/src/main/java/com/wlj/base/util/GoToHelp.java create mode 100755 base/src/main/java/com/wlj/base/util/ListUtils.java create mode 100755 base/src/main/java/com/wlj/base/util/Log.java create mode 100755 base/src/main/java/com/wlj/base/util/MathUtil.java create mode 100755 base/src/main/java/com/wlj/base/util/RequestException.java create mode 100755 base/src/main/java/com/wlj/base/util/StatusBarHeight.java create mode 100755 base/src/main/java/com/wlj/base/util/StringUtils.java create mode 100755 base/src/main/java/com/wlj/base/util/SyncImageLoader.java create mode 100755 base/src/main/java/com/wlj/base/util/TimeZoneUtil.java create mode 100755 base/src/main/java/com/wlj/base/util/UIHelper.java create mode 100755 base/src/main/java/com/wlj/base/util/img/BitmapUtil.java create mode 100755 base/src/main/java/com/wlj/base/util/img/ImageFileCache.java create mode 100755 base/src/main/java/com/wlj/base/util/img/ImageGetForHttp.java create mode 100755 base/src/main/java/com/wlj/base/util/img/ImageLrucache.java create mode 100755 base/src/main/java/com/wlj/base/util/img/LazyScrollView.java create mode 100755 base/src/main/java/com/wlj/base/util/img/LoadImage.java create mode 100644 base/src/main/java/com/wlj/base/util/statusbar/StatusBarUtil.java create mode 100644 base/src/main/java/com/wlj/base/util/statusbar/StatusBarView.java create mode 100644 base/src/main/java/com/wlj/base/web/BaseURL.java create mode 100755 base/src/main/java/com/wlj/base/web/BaseWebMain.java create mode 100755 base/src/main/java/com/wlj/base/web/CallWebserviceImp.java create mode 100755 base/src/main/java/com/wlj/base/web/EnAes.java create mode 100755 base/src/main/java/com/wlj/base/web/Encrpt.java create mode 100755 base/src/main/java/com/wlj/base/web/HttpGet.java create mode 100755 base/src/main/java/com/wlj/base/web/HttpPost.java create mode 100755 base/src/main/java/com/wlj/base/web/Md5Util.java create mode 100755 base/src/main/java/com/wlj/base/web/MsgContext.java create mode 100755 base/src/main/java/com/wlj/base/web/RequestWebClient.java create mode 100644 base/src/main/java/com/wlj/base/web/asyn/AsyncCall.java create mode 100644 base/src/main/java/com/wlj/base/web/asyn/AsyncRequestModle.java create mode 100644 base/src/main/java/com/wlj/base/web/asyn/AsyncRequestWebClient.java create mode 100644 base/src/main/java/com/wlj/base/web/asyn/BaseAsyncModle.java create mode 100644 base/src/main/java/com/wlj/base/web/asyn/Encrpt.java create mode 100755 base/src/main/java/com/wlj/base/widget/AutoScrollViewPager.java create mode 100755 base/src/main/java/com/wlj/base/widget/CustomDurationScroller.java create mode 100644 base/src/main/java/com/wlj/base/widget/IconfontTextview.java create mode 100755 base/src/main/java/com/wlj/base/widget/MyGridView.java create mode 100755 base/src/main/java/com/wlj/base/widget/MyListView.java create mode 100755 base/src/main/java/com/wlj/base/widget/MyScrollLayout.java create mode 100755 base/src/main/java/com/wlj/base/widget/ScllorTabView.java create mode 100644 base/src/main/java/com/wlj/base/widget/StickListView.java create mode 100755 base/src/main/java/com/wlj/base/widget/StickScrollView.java create mode 100755 base/src/main/java/com/wlj/base/widget/SwitchViewDemoActivity.java create mode 100755 base/src/main/java/com/wlj/base/widget/SwitchViewPager.java create mode 100755 base/src/main/res/drawable-hdpi/project_bg.jpg create mode 100755 base/src/main/res/drawable-xxhdpi/progress_bg_small.png create mode 100755 base/src/main/res/drawable-xxhdpi/progress_go_small.png create mode 100755 base/src/main/res/drawable/loading_point_selector.xml create mode 100755 base/src/main/res/layout/progressbar.xml create mode 100644 base/src/main/res/values/attrs.xml create mode 100644 base/src/main/res/values/colors.xml create mode 100644 base/src/main/res/values/ids.xml create mode 100644 base/src/main/res/values/strings.xml create mode 100644 base/src/test/java/com/wlj/base/ExampleUnitTest.java create mode 100644 build.gradle create mode 100644 gesturelock/.gitignore create mode 100644 gesturelock/build.gradle create mode 100644 gesturelock/proguard-rules.pro create mode 100644 gesturelock/src/androidTest/java/com/wlj/gesturelock/ExampleInstrumentedTest.java create mode 100644 gesturelock/src/main/AndroidManifest.xml create mode 100755 gesturelock/src/main/java/com/wlj/gesturelock/GestureEditActivity.java create mode 100755 gesturelock/src/main/java/com/wlj/gesturelock/GestureMainActivity.java create mode 100755 gesturelock/src/main/java/com/wlj/gesturelock/GestureVerifyActivity.java create mode 100755 gesturelock/src/main/java/com/wlj/gesturelock/common/AppUtil.java create mode 100755 gesturelock/src/main/java/com/wlj/gesturelock/common/Constants.java create mode 100755 gesturelock/src/main/java/com/wlj/gesturelock/entity/GesturePoint.java create mode 100755 gesturelock/src/main/java/com/wlj/gesturelock/widget/GestureContentView.java create mode 100755 gesturelock/src/main/java/com/wlj/gesturelock/widget/GestureDrawline.java create mode 100755 gesturelock/src/main/java/com/wlj/gesturelock/widget/LockIndicator.java create mode 100755 gesturelock/src/main/res/anim/shake.xml create mode 100755 gesturelock/src/main/res/color/gesture_cancel_text_color.xml create mode 100755 gesturelock/src/main/res/drawable-hdpi/gesture_node_normal.png create mode 100755 gesturelock/src/main/res/drawable-hdpi/gesture_node_pressed.png create mode 100755 gesturelock/src/main/res/drawable-hdpi/gesture_node_wrong.png create mode 100755 gesturelock/src/main/res/drawable-hdpi/lock_pattern_node_normal.png create mode 100755 gesturelock/src/main/res/drawable-hdpi/lock_pattern_node_pressed.png create mode 100755 gesturelock/src/main/res/drawable-hdpi/user_logo.png create mode 100755 gesturelock/src/main/res/layout/activity_gesture_edit.xml create mode 100755 gesturelock/src/main/res/layout/activity_gesture_verify.xml create mode 100755 gesturelock/src/main/res/layout/activity_main_gesture.xml create mode 100644 gesturelock/src/main/res/values/strings.xml create mode 100644 gesturelock/src/test/java/com/wlj/gesturelock/ExampleUnitTest.java create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 third/.gitignore create mode 100644 third/build.gradle create mode 100755 third/libs/libammsdk.jar create mode 100755 third/libs/mta-sdk-1.6.2.jar create mode 100755 third/libs/open_sdk_r5756.jar create mode 100755 third/libs/weiboSDKCore_3.1.4.jar create mode 100644 third/proguard-rules.pro create mode 100644 third/src/androidTest/java/com/hd/wlj/third/ExampleInstrumentedTest.java create mode 100644 third/src/main/AndroidManifest.xml create mode 100644 third/src/main/java/com/hd/wlj/third/quicklogin/d create mode 100644 third/src/main/java/com/hd/wlj/third/quicklogin/wx/WXLogin.java create mode 100755 third/src/main/java/com/hd/wlj/third/share/Constants.java create mode 100755 third/src/main/java/com/hd/wlj/third/share/ShareModle.java create mode 100755 third/src/main/java/com/hd/wlj/third/share/ShareUI.java create mode 100755 third/src/main/java/com/hd/wlj/third/share/qq/BaseUIListener.java create mode 100755 third/src/main/java/com/hd/wlj/third/share/qq/QQshare.java create mode 100644 third/src/main/java/com/hd/wlj/third/share/sina/AccessTokenKeeper.java create mode 100755 third/src/main/java/com/hd/wlj/third/share/sina/SinaShare.java create mode 100755 third/src/main/java/com/hd/wlj/third/share/sina/myResponse.java create mode 100755 third/src/main/java/com/hd/wlj/third/share/weixin/WeiXinShare.java create mode 100755 third/src/main/jniLibs/arm64-v8a/libweibosdkcore.so create mode 100755 third/src/main/jniLibs/armeabi-v7a/libweibosdkcore.so create mode 100755 third/src/main/jniLibs/armeabi/libweibosdkcore.so create mode 100755 third/src/main/jniLibs/mips/libweibosdkcore.so create mode 100755 third/src/main/jniLibs/mips64/libweibosdkcore.so create mode 100755 third/src/main/jniLibs/x86/libweibosdkcore.so create mode 100755 third/src/main/jniLibs/x86_64/libweibosdkcore.so create mode 100755 third/src/main/res/anim/slide_in_bottom.xml create mode 100755 third/src/main/res/anim/slide_in_from_bottom.xml create mode 100755 third/src/main/res/anim/slide_out_bottom.xml create mode 100755 third/src/main/res/anim/slide_out_from_bottom.xml create mode 100644 third/src/main/res/drawable-xhdpi/fuzhilianjie.png create mode 100644 third/src/main/res/drawable-xhdpi/logo_qq.png create mode 100644 third/src/main/res/drawable-xhdpi/logo_qzone.png create mode 100644 third/src/main/res/drawable-xhdpi/logo_sinaweibo.png create mode 100644 third/src/main/res/drawable-xhdpi/logo_tencentweibo.png create mode 100644 third/src/main/res/drawable-xhdpi/logo_wechat.png create mode 100644 third/src/main/res/drawable-xhdpi/logo_wechatmoments.png create mode 100644 third/src/main/res/drawable-xhdpi/shoucang_xx_red.png create mode 100644 third/src/main/res/drawable-xhdpi/shouchang_xx.png create mode 100755 third/src/main/res/layout/item_share_gridview.xml create mode 100755 third/src/main/res/layout/share.xml create mode 100644 third/src/main/res/values/colors.xml create mode 100644 third/src/main/res/values/strings.xml create mode 100644 third/src/main/res/values/styles.xml create mode 100644 third/src/test/java/com/hd/wlj/third/ExampleUnitTest.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..39fb081 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..96cc43e --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..032774f --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..a8f9e56 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..3b31283 --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..fbb6828 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..2621256 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..ec5f252 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,60 @@ +apply plugin: 'com.android.application' +apply plugin: 'com.neenbedankt.android-apt' + +android { + compileSdkVersion 23 + buildToolsVersion '23.0.3' + defaultConfig { + vectorDrawables.useSupportLibrary = true + applicationId "com.hd.wlj.duohaowan" + minSdkVersion 15 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + + signingConfigs { + signConfig { + storeFile file('keystory.jks')//签名文件路径, + //keystore的路径通常使用项目根目录的相对路径,但也可以是使用绝对路径,尽管这不推荐 + storePassword 'duohaowan' //密码 + keyAlias 'duohaowan' + keyPassword 'duohaowan' //密码 + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + + signingConfig signingConfigs.signConfig // 配置debug包的签名 + } + + debug { + signingConfig signingConfigs.signConfig // 配置debug包的签名 + } + } +} + +dependencies { + compile fileTree(include: ['*.jar'], dir: 'libs') + androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) + compile project(':base') + compile project(':gesturelock') + compile project(':third') + //添加这一句 + compile 'com.android.support:appcompat-v7:23.4.0' + compile 'com.android.support:design:23.4.0' + compile 'com.android.support:recyclerview-v7:23.4.0' + compile 'com.android.support:cardview-v7:23.4.0' + compile 'com.jakewharton:butterknife:8.4.0' + compile 'com.android.support:support-v4:23.4.0' + compile 'com.github.bumptech.glide:glide:3.7.0' + testCompile 'junit:junit:4.12' + apt 'com.jakewharton:butterknife-compiler:8.4.0' + compile 'jp.wasabeef:glide-transformations:2.0.1' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..7de1e98 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/wlj/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/app/src/androidTest/java/com/hd/wlj/duohaowan/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/hd/wlj/duohaowan/ExampleInstrumentedTest.java new file mode 100644 index 0000000..a36e027 --- /dev/null +++ b/app/src/androidTest/java/com/hd/wlj/duohaowan/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.hd.wlj.duohaowan; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumentation test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.hd.wlj.duohaowan", appContext.getPackageName()); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..6bd7474 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/fonts/phone.ttf b/app/src/main/assets/fonts/phone.ttf new file mode 100644 index 0000000000000000000000000000000000000000..73cbd24e0b61ea19a1f8fe0622bdd84876c2cc98 GIT binary patch literal 5060 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 { + + private static final Interpolator INTERPOLATOR = new FastOutSlowInInterpolator(); + + + private int sinceDirectionChange; + + + public FooterBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + } + +//1.判断滑动的方向 我们需要垂直滑动 + @Override + public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) { + return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0; + } + +//2.根据滑动的距离显示和隐藏footer view + @Override + public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) { + if (dy > 0 && sinceDirectionChange < 0 || dy < 0 && sinceDirectionChange > 0) { + child.animate().cancel(); + sinceDirectionChange = 0; + } + sinceDirectionChange += dy; + if (sinceDirectionChange > child.getHeight() && child.getVisibility() == View.VISIBLE) { + hide(child); + } else if (sinceDirectionChange < 0 && child.getVisibility() == View.GONE) { + show(child); + } + } + + + private void hide(final View view) { + ViewPropertyAnimator animator = view.animate().translationY(view.getHeight()).setInterpolator(INTERPOLATOR).setDuration(200); + animator.setListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animator) { + + } + + @Override + public void onAnimationEnd(Animator animator) { + view.setVisibility(View.GONE); + } + + @Override + public void onAnimationCancel(Animator animator) { + show(view); + } + + @Override + public void onAnimationRepeat(Animator animator) { + + } + }); + animator.start(); + } + + + private void show(final View view) { + ViewPropertyAnimator animator = view.animate().translationY(0).setInterpolator(INTERPOLATOR).setDuration(200); + animator.setListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animator) { + + } + + @Override + public void onAnimationEnd(Animator animator) { + view.setVisibility(View.VISIBLE); + } + + @Override + public void onAnimationCancel(Animator animator) { + hide(view); + } + + @Override + public void onAnimationRepeat(Animator animator) { + + } + }); + animator.start(); + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/Behavior/FooterBehaviorDependAppBar.java b/app/src/main/java/com/hd/wlj/duohaowan/Behavior/FooterBehaviorDependAppBar.java new file mode 100644 index 0000000..89e0a9a --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/Behavior/FooterBehaviorDependAppBar.java @@ -0,0 +1,31 @@ +package com.hd.wlj.duohaowan.Behavior; + +import android.content.Context; +import android.support.design.widget.AppBarLayout; +import android.support.design.widget.CoordinatorLayout; +import android.util.AttributeSet; +import android.view.View; + +/** + * 滑动的时候 底部的都消失 + */ +public class FooterBehaviorDependAppBar extends CoordinatorLayout.Behavior { + + + public FooterBehaviorDependAppBar(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { + return dependency instanceof AppBarLayout; + } + + + @Override + public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { + float translationY = Math.abs(dependency.getTranslationY()); + child.setTranslationY(translationY); + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/Behavior/ToolbarAlphaBehavior.java b/app/src/main/java/com/hd/wlj/duohaowan/Behavior/ToolbarAlphaBehavior.java new file mode 100644 index 0000000..a48d02a --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/Behavior/ToolbarAlphaBehavior.java @@ -0,0 +1,45 @@ +package com.hd.wlj.duohaowan.Behavior; + +import android.content.Context; +import android.support.design.widget.CoordinatorLayout; +import android.support.v7.widget.Toolbar; +import android.util.AttributeSet; +import android.view.View; + +import com.hd.wlj.duohaowan.R; + +public class ToolbarAlphaBehavior extends CoordinatorLayout.Behavior { + private static final String TAG = "ToolbarAlphaBehavior"; + private int offset = 0; + private int startOffset = 0; + private int endOffset = 0; + private Context context; + + public ToolbarAlphaBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + this.context = context; + } + + @Override + public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, Toolbar child, View directTargetChild, View target, int nestedScrollAxes) { + return true; + } + + + @Override + public void onNestedScroll(CoordinatorLayout coordinatorLayout, Toolbar toolbar, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { + startOffset = 0; + endOffset = context.getResources().getDimensionPixelOffset(R.dimen.header_height) - toolbar.getHeight(); + offset += dyConsumed; + if (offset <= startOffset) { //alpha为0 + toolbar.getBackground().setAlpha(0); + } else if (offset > startOffset && offset < endOffset) { //alpha为0到255 + float precent = (float) (offset - startOffset) / endOffset; + int alpha = Math.round(precent * 255); + toolbar.getBackground().setAlpha(alpha); + } else if (offset >= endOffset) { //alpha为255 + toolbar.getBackground().setAlpha(255); + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/DataPass.java b/app/src/main/java/com/hd/wlj/duohaowan/DataPass.java new file mode 100644 index 0000000..e90e2ba --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/DataPass.java @@ -0,0 +1,10 @@ +package com.hd.wlj.duohaowan; + +/** + * + */ + +public class DataPass { + + +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/MainActivity.java b/app/src/main/java/com/hd/wlj/duohaowan/MainActivity.java new file mode 100644 index 0000000..232ebd2 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/MainActivity.java @@ -0,0 +1,315 @@ +package com.hd.wlj.duohaowan; + +import android.content.Context; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.app.FragmentTransaction; +import android.util.DisplayMetrics; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.View.OnTouchListener; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.PopupWindow.OnDismissListener; + +import com.hd.wlj.duohaowan.ui.LoginActivity; +import com.hd.wlj.duohaowan.ui.follow.FollowFragment; +import com.hd.wlj.duohaowan.ui.home.HomeFragment; +import com.hd.wlj.duohaowan.ui.my.MyFragment; +import com.hd.wlj.duohaowan.ui.seach.SeachFragment; +import com.wlj.base.ui.BaseFragmentActivity; +import com.wlj.base.util.GoToHelp; +import com.wlj.base.util.statusbar.StatusBarUtil; + +public class MainActivity extends BaseFragmentActivity implements OnClickListener,HomeFragment.OnFragmentInteractionListener +{ + // 定义Fragment页面 + private HomeFragment fragmentHome; + private SeachFragment fragmentSearch; + private FollowFragment fragmentSpace; + private MyFragment fragmentMy; + // 定义布局对象 + private FrameLayout homeFl, authFl, spaceFl, moreFl; + + // 定义图片组件对象 + private ImageView atIv, authIv, spaceIv, moreIv; + + // 定义按钮图片组件 + private ImageView toggleImageView, plusImageView; + + // 定义PopupWindow + private PopupWindow popWindow; + // 获取手机屏幕分辨率的类 + private DisplayMetrics dm; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + initView(); + + initData(); + + //初始化默认为选中点击了“动态”按钮 + clickAtBtn(); + } + + @Override + protected void setStatusBar() { + super.setStatusBar(); +// StatusBarUtil.setTransparentForImageViewInFragment(this,null); + } + + /** + * 初始化组件 + */ + private void initView() { + // 实例化布局对象 + homeFl = (FrameLayout) findViewById(R.id.layout_home); + authFl = (FrameLayout) findViewById(R.id.layout_seach); + spaceFl = (FrameLayout) findViewById(R.id.layout_follow); + moreFl = (FrameLayout) findViewById(R.id.layout_my); + + // 实例化图片组件对象 + atIv = (ImageView) findViewById(R.id.image_home); + authIv = (ImageView) findViewById(R.id.image_seach); + spaceIv = (ImageView) findViewById(R.id.image_follow); + moreIv = (ImageView) findViewById(R.id.image_my); + + // 实例化按钮图片组件 + toggleImageView = (ImageView) findViewById(R.id.toggle_btn); + plusImageView = (ImageView) findViewById(R.id.plus_btn); + + } + + /** + * 初始化数据 + */ + private void initData() { + // 给布局对象设置监听 + homeFl.setOnClickListener(this); + authFl.setOnClickListener(this); + spaceFl.setOnClickListener(this); + moreFl.setOnClickListener(this); + + // 给按钮图片设置监听 + toggleImageView.setOnClickListener(this); + } + + /** + * 点击事件 + */ + @Override + public void onClick(View v) { + switch (v.getId()) { + // 点击s首页按钮 + case R.id.layout_home: + clickAtBtn(); + break; + // 点击seach关按钮 + case R.id.layout_seach: + clickAuthBtn(); + break; + // 点击follow按钮 + case R.id.layout_follow: + clickFollowBtn(); + break; + // 点击my按钮 + case R.id.layout_my: + clickMoreBtn(); + break; + // 点击中间按钮 + case R.id.toggle_btn: +// clickToggleBtn(); + break; + } + } + + /** + * 点击了“动态”按钮 + */ + private void clickAtBtn() { + // 实例化Fragment页面 + if(fragmentHome == null) { + fragmentHome = new HomeFragment(); + } + // 得到Fragment事务管理器 + FragmentTransaction fragmentTransaction = this + .getSupportFragmentManager().beginTransaction(); + // 替换当前的页面 + fragmentTransaction.replace(R.id.frame_content, fragmentHome); + // 事务管理提交 + fragmentTransaction.commit(); + // 改变选中状态 + homeFl.setSelected(true); + atIv.setSelected(true); + + authFl.setSelected(false); + authIv.setSelected(false); + + spaceFl.setSelected(false); + spaceIv.setSelected(false); + + moreFl.setSelected(false); + moreIv.setSelected(false); + } + + /** + * 点击了“与我相关”按钮 + */ + private void clickAuthBtn() { + // 实例化Fragment页面 + if(fragmentSearch == null) { + fragmentSearch = new SeachFragment(); + } + // 得到Fragment事务管理器 + FragmentTransaction fragmentTransaction = this + .getSupportFragmentManager().beginTransaction(); + // 替换当前的页面 + fragmentTransaction.replace(R.id.frame_content, fragmentSearch); + // 事务管理提交 + fragmentTransaction.commit(); + + homeFl.setSelected(false); + atIv.setSelected(false); + + authFl.setSelected(true); + authIv.setSelected(true); + + spaceFl.setSelected(false); + spaceIv.setSelected(false); + + moreFl.setSelected(false); + moreIv.setSelected(false); + } + + /** + * 点击了“我的空间”按钮 + */ + private void clickFollowBtn() { + // 实例化Fragment页面 + if(fragmentSpace == null) { + fragmentSpace = new FollowFragment(); + } + // 得到Fragment事务管理器 + FragmentTransaction fragmentTransaction = this + .getSupportFragmentManager().beginTransaction(); + // 替换当前的页面 + fragmentTransaction.replace(R.id.frame_content, fragmentSpace); + // 事务管理提交 + fragmentTransaction.commit(); + + homeFl.setSelected(false); + atIv.setSelected(false); + + authFl.setSelected(false); + authIv.setSelected(false); + + spaceFl.setSelected(true); + spaceIv.setSelected(true); + + moreFl.setSelected(false); + moreIv.setSelected(false); + } + + /** + * 点击了“更多”按钮 + */ + private void clickMoreBtn() { + GoToHelp.go(this, LoginActivity.class); + + +// // 实例化Fragment页面 +// if(fragmentMy == null) { +// fragmentMy = new MyFragment(); +// } +// // 得到Fragment事务管理器 +// FragmentTransaction fragmentTransaction = this +// .getSupportFragmentManager().beginTransaction(); +// // 替换当前的页面 +// fragmentTransaction.replace(R.id.frame_content, fragmentMy); +// // 事务管理提交 +// fragmentTransaction.commit(); +// +// homeFl.setSelected(false); +// atIv.setSelected(false); +// +// authFl.setSelected(false); +// authIv.setSelected(false); +// +// spaceFl.setSelected(false); +// spaceIv.setSelected(false); +// +// moreFl.setSelected(true); +// moreIv.setSelected(true); + } + + /** + * 点击了中间按钮 + */ + private void clickToggleBtn() { + showPopupWindow(toggleImageView); + // 改变按钮显示的图片为按下时的状态 + plusImageView.setSelected(true); + } + + /** + * 改变显示的按钮图片为正常状态 + */ + private void changeButtonImage() { + plusImageView.setSelected(false); + } + + /** + * 显示PopupWindow弹出菜单 + */ + private void showPopupWindow(View parent) { + if (popWindow == null) { + LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + View view = layoutInflater.inflate(R.layout.popwindow_layout, null); + dm = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(dm); + // 创建一个PopuWidow对象 + popWindow = new PopupWindow(view, dm.widthPixels, LinearLayout.LayoutParams.WRAP_CONTENT); + } + // 使其聚集 ,要想监听菜单里控件的事件就必须要调用此方法 + popWindow.setFocusable(true); + // 设置允许在外点击消失 + popWindow.setOutsideTouchable(true); + // 设置背景,这个是为了点击“返回Back”也能使其消失,并且并不会影响你的背景 + popWindow.setBackgroundDrawable(new BitmapDrawable()); + // PopupWindow的显示及位置设置 + // popWindow.showAtLocation(parent, Gravity.FILL, 0, 0); + popWindow.showAsDropDown(parent, 0,0); + + popWindow.setOnDismissListener(new OnDismissListener() { + @Override + public void onDismiss() { + // 改变显示的按钮图片为正常状态 + changeButtonImage(); + } + }); + + // 监听触屏事件 + popWindow.setTouchInterceptor(new OnTouchListener() { + public boolean onTouch(View view, MotionEvent event) { + // 改变显示的按钮图片为正常状态 + changeButtonImage(); + popWindow.dismiss(); + return false; + } + }); + } + + @Override + public void onFragmentInteraction(Uri uri) { + + } +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/Urls.java b/app/src/main/java/com/hd/wlj/duohaowan/Urls.java new file mode 100644 index 0000000..518f120 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/Urls.java @@ -0,0 +1,19 @@ +package com.hd.wlj.duohaowan; + +import com.wlj.base.web.BaseURL; + +/** + * + */ +public class Urls extends BaseURL { + + public static final String getImageRand = HOST+ "rand/getImageRand.do"; + public static final String getPhoneRand = HOST+ "rand/getPhoneRand.do"; + public static final String getUserPhoneRand = HOST+ "rand/getUserPhoneRand.do"; + public static final String register = HOST+ "front/register.do"; + public static final String login = HOST+ "front/login_simple.do"; + public static final String resetPassword = HOST+ "front/resetPassword.do"; + + public static final String list_pub = HOST+ "front/list_pub.do";//首页banner图片 + +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/adapter/RecyclerViewAdapter.java b/app/src/main/java/com/hd/wlj/duohaowan/adapter/RecyclerViewAdapter.java new file mode 100644 index 0000000..f1bd8d5 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/adapter/RecyclerViewAdapter.java @@ -0,0 +1,58 @@ +package com.hd.wlj.duohaowan.adapter; + +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import java.util.List; + +/** + * Created by wlj on 2016/10/28. + */ + +public class RecyclerViewAdapter extends RecyclerView.Adapter { + + private int reslayout; + private List mData; + + public RecyclerViewAdapter(int reslayout){ + + reslayout = reslayout; + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + T t = mData.get(position); + + + } + + @Override + public int getItemCount() { + return mData.size(); + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View inflate = LayoutInflater.from(parent.getContext()).inflate(reslayout, null); + + return new ViewHolder(inflate); + } + + @Override + public int getItemViewType(int position) { + + + return super.getItemViewType(position); + } + + public static class ViewHolder extends RecyclerView.ViewHolder{ + + + public ViewHolder(View itemView) { + super(itemView); + } + } + +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/been/News.java b/app/src/main/java/com/hd/wlj/duohaowan/been/News.java new file mode 100644 index 0000000..2a9719a --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/been/News.java @@ -0,0 +1,40 @@ +package com.hd.wlj.duohaowan.been; + +import android.app.Activity; + +import com.wlj.base.bean.Base; +import com.wlj.base.web.asyn.AsyncRequestModle; +import com.wlj.base.web.asyn.BaseAsyncModle; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; + +/** + * Created by wlj on 2016/10/29. + */ + +public class News extends BaseAsyncModle { + + + public News() { + } + + public News(Activity paramActivity) { + super(paramActivity); + } + + public News(JSONObject jo) { + super(jo); + } + + @Override + public void addRequestParemeter(AsyncRequestModle asRequestModle) throws IOException { + } + + @Override + public Base parse(JSONObject jsonObject) throws JSONException { + return new News(jsonObject); + } +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/been/User.java b/app/src/main/java/com/hd/wlj/duohaowan/been/User.java new file mode 100644 index 0000000..acebd1b --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/been/User.java @@ -0,0 +1,153 @@ +package com.hd.wlj.duohaowan.been; + +import android.app.Activity; + +import com.hd.wlj.duohaowan.Urls; +import com.wlj.base.bean.Base; +import com.wlj.base.web.HttpPost; +import com.wlj.base.web.Md5Util; +import com.wlj.base.web.asyn.AsyncRequestModle; +import com.wlj.base.web.asyn.BaseAsyncModle; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.security.NoSuchAlgorithmException; + +/** + * + */ +public class User extends BaseAsyncModle { + + + /** + * 获取验证码 + */ + public static final int getRand = -1; + + /** + * 注册 + */ + public static final int REGESTER = 1; + /** + * 登陆 + */ + public static final int LOGIN = 2; + /** + * 重置密码 + */ + public static final int RESSTPASSWORD = 3; + + /** + * 获取用户验证码 + */ + public static final int getUserPhoneRand = 4; + + private String phone; + private String verify; + private String psw; + + public User() { + super(); + } + + public User(Activity paramActivity) { + super(paramActivity); + } + + public User(JSONObject paramJSONObject) { + super(paramJSONObject); + } + + + @Override + public void addRequestParemeter(AsyncRequestModle paramAsyncRequestModle) throws IOException { + HttpPost httpPost = new HttpPost(Urls.getPhoneRand); + httpPost.addParemeter("phone", phone); + + paramAsyncRequestModle.setHttpPost(httpPost); + paramAsyncRequestModle.setJiami(false); + paramAsyncRequestModle.setShowLoading(true); + + } + + @Override + public void addRequestParemeter(AsyncRequestModle paramAsyncRequestModle, int type) throws IOException { + if (type == REGESTER) { + + HttpPost httpPost = new HttpPost(Urls.register); + httpPost.addParemeter("username", phone); + httpPost.addParemeter("randCode", verify); + httpPost.addParemeter("userpwd", psw); + httpPost.addParemeter("userpwd_ok", psw); + + paramAsyncRequestModle.setHttpPost(httpPost); + paramAsyncRequestModle.setJiami(false); + paramAsyncRequestModle.setShowLoading(true); + } else if (type == LOGIN) { + + String md5Final = Md5Util.MD5Normal(psw); + String randCode = System.currentTimeMillis() + ""; + String userpwd = Md5Util.MD5Normal(md5Final + randCode.toLowerCase()); + + HttpPost httpPost = new HttpPost(Urls.login); + httpPost.addParemeter("username", phone); + httpPost.addParemeter("randCode", randCode); + httpPost.addParemeter("userpwd", userpwd); + + paramAsyncRequestModle.setHttpPost(httpPost); + paramAsyncRequestModle.setJiami(false); + paramAsyncRequestModle.setShowLoading(true); + + } else if (type == RESSTPASSWORD) { + HttpPost httpPost = new HttpPost(Urls.resetPassword); + httpPost.addParemeter("username", phone); + httpPost.addParemeter("randCode", verify); + httpPost.addParemeter("userpwd", psw); + + paramAsyncRequestModle.setHttpPost(httpPost); + paramAsyncRequestModle.setJiami(false); + paramAsyncRequestModle.setShowLoading(true); + + } else if (type == getUserPhoneRand) { + HttpPost httpPost = new HttpPost(Urls.getUserPhoneRand); + httpPost.addParemeter("username", phone); + + paramAsyncRequestModle.setHttpPost(httpPost); + paramAsyncRequestModle.setJiami(false); + paramAsyncRequestModle.setShowLoading(true); + } + + + } + + @Override + public Base parse(JSONObject jsonObject) throws JSONException { + return new User(jsonObject); + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getVerify() { + return verify; + } + + public void setVerify(String verify) { + this.verify = verify; + } + + public String getPsw() { + return psw; + } + + public void setPsw(String psw) { + this.psw = psw; + } +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/ForgetPSWActivity.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/ForgetPSWActivity.java new file mode 100644 index 0000000..615a1f4 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/ForgetPSWActivity.java @@ -0,0 +1,202 @@ +package com.hd.wlj.duohaowan.ui; + +import android.os.Bundle; +import android.support.v7.widget.Toolbar; +import android.text.InputFilter; +import android.text.InputType; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.hd.wlj.duohaowan.MainActivity; +import com.hd.wlj.duohaowan.R; +import com.hd.wlj.duohaowan.been.User; +import com.hd.wlj.duohaowan.view.ImgInpImg; +import com.wlj.base.bean.Base; +import com.wlj.base.ui.BaseFragmentActivity; +import com.wlj.base.util.AppConfig; +import com.wlj.base.util.GoToHelp; +import com.wlj.base.util.StringUtils; +import com.wlj.base.util.UIHelper; +import com.wlj.base.web.asyn.AsyncCall; + +import org.json.JSONObject; + +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; + +public class ForgetPSWActivity extends BaseFragmentActivity { + + @BindView(R.id.regester_phone) + ImgInpImg regesterPhone; + @BindView(R.id.regester_verifyCode) + EditText regesterVerifyCode; + @BindView(R.id.regester_psw) + ImgInpImg regesterPsw; + @BindView(R.id.regester_repsw) + ImgInpImg regesterRepsw; + @BindView(R.id.regester_submit) + Button regesterSubmit; + @BindView(R.id.toolbar_title) + TextView toolbarTitle; + @BindView(R.id.toolbar) + Toolbar toolbar; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_regester); + ButterKnife.bind(this); + + init(); + } + + private void init() { + regesterSubmit.setText("修改密码"); + setSupportActionBar(toolbar); + toolbar.setTitle(""); + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + toolbarTitle.setText("忘记密码"); + + + regesterPhone.getIconFontView1().setIconPath(getString(R.string.phonePath)); + regesterPhone.getIconFontView1().setTextSize(30f); + regesterPhone.setInputType(InputType.TYPE_CLASS_NUMBER); + regesterPhone.getEditTextView().setFilters(new InputFilter[]{new InputFilter.LengthFilter(11)}); + regesterPhone.getIconFontView2().setTextSize(18f); + + regesterVerifyCode.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); + + regesterPsw.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD); + regesterPsw.getIconFontView1().setTextSize(30f); + + regesterRepsw.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD); + regesterRepsw.getIconFontView1().setTextSize(30f); + regesterPhone.getIconFontView2().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + getPhoneRand(); + } + }); + } + + /** + * 获取手机验证码 + */ + private void getPhoneRand() { + + String phone = regesterPhone.getText()+""; + + if (StringUtils.isEmpty(phone)) { + UIHelper.toastMessage(getApplicationContext(),"电话号码为空"); + return; + } + if (phone.length() != 11) { + UIHelper.toastMessage(getApplicationContext(),"电话号码格式错误"); + return; + } + + User user = new User(this); + user.setPhone(phone); + AsyncCall request = user.Request(User.getUserPhoneRand); + request.setOnAsyncBackListener(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base base, int paramInt) { + JSONObject jsonObject = base.getResultJsonObject(); + UIHelper.toastMessage(getApplicationContext(),jsonObject.optString("message")); + + } + + @Override + public void fail(Exception paramException) { + + } + }); + + } + + @OnClick(R.id.regester_submit) + public void onClick() { + String phone = regesterPhone.getText(); + String verify = regesterVerifyCode.getText() + ""; + String psw = regesterPsw.getText(); + String repsw = regesterRepsw.getText(); + + if (verify(phone, verify, psw,repsw)) return; + + modify(phone,verify,psw); + + } + + + private boolean verify(String phone, String verify, String psw,String repsw) { + //phone 验证 + if (StringUtils.isEmpty(phone)) { + UIHelper.toastMessage(getApplicationContext(),"电话号码为空"); + return true; + } + if (phone.length() != 11) { + UIHelper.toastMessage(getApplicationContext(),"电话号码格式错误"); + return true; + } + // 验证码 验证 + if (StringUtils.isEmpty(verify)) { + UIHelper.toastMessage(getApplicationContext(),"短信验证码为空"); + return true; + } + //密码格式验证 + if (StringUtils.isEmpty(psw)) { + UIHelper.toastMessage(getApplicationContext(),"密码为空"); + return true; + } + if (6 > psw.length() || psw.length() > 16) { + UIHelper.toastMessage(getApplicationContext(),"密码长度6-16"); + return true; + } + //确认密码 + if ( !psw.equals(repsw)) { + UIHelper.toastMessage(getApplicationContext(),"确认密码和密码不相同"); + return true; + } + + return false; + } + private void modify(String phone, String verify, String psw) { + + User user = new User(this); + user.setPhone(phone); + user.setVerify(verify); + user.setPsw(psw); + + AsyncCall request = user.Request(User.RESSTPASSWORD); + request.setOnAsyncBackListener(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base paramBase, int paramInt) { + //重置密码 -》登陆成功 + JSONObject jsonObject = paramBase.getResultJsonObject(); + + AppConfig appConfig = AppConfig.getAppConfig(); + appConfig.set(AppConfig.CONF_KEY,jsonObject.optString("key")); + GoToHelp.go(ForgetPSWActivity.this, MainActivity.class); + finish(); + UIHelper.toastMessage(getApplicationContext(), "登陆成功"); + } + + @Override + public void fail(Exception paramException) { + UIHelper.toastMessage(getApplicationContext(),paramException.getMessage()); + } + }); + } +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/LoginActivity.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/LoginActivity.java new file mode 100644 index 0000000..2b18b45 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/LoginActivity.java @@ -0,0 +1,172 @@ +package com.hd.wlj.duohaowan.ui; + +import android.content.Intent; +import android.os.Bundle; +import android.text.InputFilter; +import android.text.InputType; +import android.text.method.DigitsKeyListener; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +import com.hd.wlj.duohaowan.MainActivity; +import com.hd.wlj.duohaowan.been.User; +import com.hd.wlj.duohaowan.view.ImgInpImg; +import com.hd.wlj.duohaowan.R; +import com.hd.wlj.third.quicklogin.wx.WXLogin; +import com.wlj.base.bean.Base; +import com.wlj.base.ui.BaseFragmentActivity; +import com.wlj.base.util.AppConfig; +import com.wlj.base.util.AppContext; +import com.wlj.base.util.GoToHelp; +import com.wlj.base.util.StringUtils; +import com.wlj.base.util.UIHelper; +import com.wlj.base.util.statusbar.StatusBarUtil; +import com.wlj.base.web.asyn.AsyncCall; +import com.wlj.base.widget.IconfontTextview; + +import org.json.JSONObject; + +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; + +/** + * 登陆 + * + * @author wlj + */ + +public class LoginActivity extends BaseFragmentActivity { + + @BindView(R.id.login_back) + IconfontTextview loginBack; + @BindView(R.id.login_account) + ImgInpImg loginAccount; + @BindView(R.id.login_psw) + ImgInpImg loginPsw; + @BindView(R.id.login_login_button) + Button loginLoginButton; + @BindView(R.id.login_forgetPswTV) + TextView loginForgetPswTV; + @BindView(R.id.login_qq_imageView) + ImageView loginQqImageView; + @BindView(R.id.login_wx_imageView) + ImageView loginWxImageView; + @BindView(R.id.login_rg_tv) + TextView loginRgTv; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login); + ButterKnife.bind(this); + + AppContext.getAppContext().loginOut(); + + loginAccount.getIconFontView1().setTextSize(20f); + String digists = "abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + loginAccount.getEditTextView().setKeyListener(DigitsKeyListener.getInstance(digists)); +// loginAccount.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); + loginAccount.getEditTextView().setFilters(new InputFilter[]{new InputFilter.LengthFilter(11)}); + + loginPsw.getIconFontView1().setTextSize(30f); + loginPsw.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD|InputType.TYPE_CLASS_TEXT); + } + + @Override + protected void setStatusBar() { + super.setStatusBar(); + } + + @OnClick({R.id.login_back, R.id.login_login_button, R.id.login_forgetPswTV, R.id.login_qq_imageView, R.id.login_wx_imageView, R.id.login_rg_tv}) + public void onClick(View view) { + switch (view.getId()) { + case R.id.login_back: + finish(); + break; + case R.id.login_login_button: + login(); + +// startActivity(new Intent(getApplicationContext(), MainActivity.class)); + break; + case R.id.login_forgetPswTV: + //忘记密码 + startActivity(new Intent(getApplicationContext(), ForgetPSWActivity.class)); + break; + case R.id.login_qq_imageView: + + break; + + case R.id.login_wx_imageView: + WXLogin wxLogin = new WXLogin(getApplicationContext()); + wxLogin.login(); + break; + case R.id.login_rg_tv: + //注册 + startActivity(new Intent(getApplicationContext(), RegesterActivity.class)); + + break; + } + } + + private void login() { + + String phone = loginAccount.getText(); + String psw = loginPsw.getText(); + +// phone = "15310315193"; +// psw = "123456"; + + if(verify(phone,psw))return; + + User user = new User(this); + user.setPhone(phone); + user.setPsw(psw); + AsyncCall request = user.Request(User.LOGIN); + request.setOnAsyncBackListener(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base paramBase, int paramInt) { + + JSONObject jsonObject = paramBase.getResultJsonObject(); + + AppConfig appConfig = AppConfig.getAppConfig(); + appConfig.set(AppConfig.CONF_KEY,jsonObject.optString("key")); + GoToHelp.go(LoginActivity.this, MainActivity.class); + finish(); + } + + @Override + public void fail(Exception paramException) { + + } + }); + + } + + private boolean verify(String phone, String psw) { + //phone 验证 + if (StringUtils.isEmpty(phone)) { + UIHelper.toastMessage(getApplicationContext(),"电话号码为空"); + return true; + } + if (phone.length() != 11) { + UIHelper.toastMessage(getApplicationContext(),"电话号码格式错误"); + return true; + } + + //密码格式验证 + if (StringUtils.isEmpty(psw)) { + UIHelper.toastMessage(getApplicationContext(),"密码为空"); + return true; + } + if (6 > psw.length() || psw.length() > 16) { + UIHelper.toastMessage(getApplicationContext(),"密码长度6-16"); + return true; + } + return false; + } +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/RegesterActivity.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/RegesterActivity.java new file mode 100644 index 0000000..8f766f0 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/RegesterActivity.java @@ -0,0 +1,208 @@ +package com.hd.wlj.duohaowan.ui; + +import android.graphics.Typeface; +import android.os.Bundle; +import android.support.v7.widget.Toolbar; +import android.text.InputFilter; +import android.text.InputType; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; + +import com.hd.wlj.duohaowan.MainActivity; +import com.hd.wlj.duohaowan.R; +import com.hd.wlj.duohaowan.been.User; +import com.hd.wlj.duohaowan.view.ImgInpImg; +import com.wlj.base.bean.Base; +import com.wlj.base.ui.BaseFragmentActivity; +import com.wlj.base.util.AppConfig; +import com.wlj.base.util.GoToHelp; +import com.wlj.base.util.StringUtils; +import com.wlj.base.util.UIHelper; +import com.wlj.base.web.asyn.AsyncCall; + +import org.json.JSONObject; + +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; + +/** + * 注册 + */ +public class RegesterActivity extends BaseFragmentActivity { + + @BindView(R.id.regester_phone) + ImgInpImg regesterPhone; + @BindView(R.id.regester_verifyCode) + EditText regesterVerifyCode; + @BindView(R.id.regester_psw) + ImgInpImg regesterPsw; + @BindView(R.id.regester_repsw) + ImgInpImg regesterRepsw; + @BindView(R.id.regester_submit) + Button regesterSubmit; + @BindView(R.id.regester_repsw_ll) + LinearLayout regesterRepswLl; + @BindView(R.id.toolbar) + Toolbar toolbar; + + private String rand; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_regester); + ButterKnife.bind(this); + + init(); + + + } + + private void init() { + regesterRepswLl.setVisibility(View.GONE); + setSupportActionBar(toolbar); + toolbar.setTitle(""); + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + regesterPhone.getIconFontView1().setIconPath(getString(R.string.phonePath)); + regesterPhone.getIconFontView1().setTextSize(30f); + regesterPhone.setInputType(InputType.TYPE_CLASS_NUMBER); + regesterPhone.getEditTextView().setFilters(new InputFilter[]{new InputFilter.LengthFilter(11)}); + regesterPhone.getIconFontView2().setTextSize(18f); + + regesterVerifyCode.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); + + regesterPsw.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD); + regesterPsw.getIconFontView1().setTextSize(30f); + +// regesterPhone.getIconFontView2().setTextSize(16f); + regesterPhone.getIconFontView2().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + getPhoneRand(); + } + }); + } + + /** + * 获取手机验证码 + */ + private void getPhoneRand() { + + String phone = regesterPhone.getText()+""; + + if (StringUtils.isEmpty(phone)) { + UIHelper.toastMessage(getApplicationContext(),"电话号码为空"); + return; + } + if (phone.length() != 11) { + UIHelper.toastMessage(getApplicationContext(),"电话号码格式错误"); + return; + } + + User user = new User(this); + user.setPhone(phone); + AsyncCall request = user.Request(); + request.setOnAsyncBackListener(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base base, int paramInt) { + JSONObject jsonObject = base.getResultJsonObject(); + UIHelper.toastMessage(getApplicationContext(),jsonObject.optString("message")); + if(jsonObject != null){ + + rand = jsonObject.optString("rand"); + regesterVerifyCode.setText(rand); + + } + + } + + @Override + public void fail(Exception paramException) { + + } + }); + + } + + @OnClick(R.id.regester_submit) + public void onClick() { + + String phone = regesterPhone.getText(); + String verify = regesterVerifyCode.getText() + ""; + String psw = regesterPsw.getText(); + + if (verify(phone, verify, psw)) return; + + regester(phone,verify,psw); + } + + private boolean verify(String phone, String verify, String psw) { + //phone 验证 + if (StringUtils.isEmpty(phone)) { + UIHelper.toastMessage(getApplicationContext(),"电话号码为空"); + return true; + } + if (phone.length() != 11) { + UIHelper.toastMessage(getApplicationContext(),"电话号码格式错误"); + return true; + } + // 验证码 验证 + if (StringUtils.isEmpty(verify)) { + UIHelper.toastMessage(getApplicationContext(),"短信验证码为空"); + return true; + } + //密码格式验证 + if (StringUtils.isEmpty(psw)) { + UIHelper.toastMessage(getApplicationContext(),"密码为空"); + return true; + } + if (6 > psw.length() || psw.length() > 16) { + UIHelper.toastMessage(getApplicationContext(),"密码长度6-16"); + return true; + } + return false; + } + + private void regester(String phone, String verify, String psw) { + + User user = new User(this); + user.setPhone(phone); + user.setVerify(verify); + user.setPsw(psw); + + AsyncCall request = user.Request(User.REGESTER); + request.setOnAsyncBackListener(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base paramBase, int paramInt) { + //注册成功 ->登陆成功 + JSONObject jsonObject = paramBase.getResultJsonObject(); + + AppConfig appConfig = AppConfig.getAppConfig(); + appConfig.set(AppConfig.CONF_KEY,jsonObject.optString("key")); + GoToHelp.go(RegesterActivity.this, MainActivity.class); + finish(); + + UIHelper.toastMessage(getApplicationContext(), "登陆成功"); + } + + @Override + public void fail(Exception paramException) { + UIHelper.toastMessage(getApplicationContext(),paramException.getMessage()); + } + }); + } + + +} + diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/WorkDetailsActivity.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/WorkDetailsActivity.java new file mode 100644 index 0000000..5a5240f --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/WorkDetailsActivity.java @@ -0,0 +1,30 @@ +package com.hd.wlj.duohaowan.ui.detailswork; + +import android.os.Bundle; +import android.widget.ImageView; + +import com.bumptech.glide.Glide; +import com.hd.wlj.duohaowan.R; +import com.wlj.base.ui.BaseFragmentActivity; + +import butterknife.BindView; +import butterknife.ButterKnife; +import jp.wasabeef.glide.transformations.RoundedCornersTransformation; + +public class WorkDetailsActivity extends BaseFragmentActivity { + + @BindView(R.id.work_detail_head) + ImageView workDetailHead; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_work_details); + ButterKnife.bind(this); + + Glide.with(this).load(R.mipmap.ic_launcher).bitmapTransform + (new RoundedCornersTransformation(this, 90, 0)) + .into(workDetailHead); + + } +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/contract/DetailsContract.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/contract/DetailsContract.java new file mode 100644 index 0000000..8070d5b --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/contract/DetailsContract.java @@ -0,0 +1,24 @@ +package com.hd.wlj.duohaowan.ui.detailswork.contract; + +import com.wlj.base.bean.Base; + +import java.util.List; + +/** + * Created by wlj on 2016/10/26. + */ + +public class DetailsContract { + + +public interface View{ +} + +public interface Presenter{ +} + +public interface Model{ +} + + +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/model/DetailsModelImpl.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/model/DetailsModelImpl.java new file mode 100644 index 0000000..c04c936 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/model/DetailsModelImpl.java @@ -0,0 +1,10 @@ +package com.hd.wlj.duohaowan.ui.detailswork.model; +import com.hd.wlj.duohaowan.ui.detailswork.contract.DetailsContract; + +/** +* Created by wlj on 2016/10/30 +*/ + +public class DetailsModelImpl implements DetailsContract.Model{ + +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/presenter/DetailsPresenterImpl.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/presenter/DetailsPresenterImpl.java new file mode 100644 index 0000000..79c0946 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/detailswork/presenter/DetailsPresenterImpl.java @@ -0,0 +1,10 @@ +package com.hd.wlj.duohaowan.ui.detailswork.presenter; +import com.hd.wlj.duohaowan.ui.detailswork.contract.DetailsContract; + +/** +* Created by wlj on 2016/10/30 +*/ + +public class DetailsPresenterImpl implements DetailsContract.Presenter{ + +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/follow/FollowFragment.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/follow/FollowFragment.java new file mode 100644 index 0000000..32477ff --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/follow/FollowFragment.java @@ -0,0 +1,30 @@ +package com.hd.wlj.duohaowan.ui.follow; + + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.hd.wlj.duohaowan.R; + +/** + * A simple {@link Fragment} subclass. + */ +public class FollowFragment extends Fragment { + + + public FollowFragment() { + // Required empty public constructor + } + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_follow, container, false); + } + +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/HomeFragment.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/HomeFragment.java new file mode 100644 index 0000000..6c79d8d --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/HomeFragment.java @@ -0,0 +1,295 @@ +package com.hd.wlj.duohaowan.ui.home; + +import android.content.Context; +import android.net.Uri; +import android.os.Bundle; +import android.support.design.widget.FloatingActionButton; +import android.support.v4.app.Fragment; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.FrameLayout; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.hd.wlj.duohaowan.R; +import com.hd.wlj.duohaowan.Urls; +import com.hd.wlj.duohaowan.ui.home.contract.HomeContract; +import com.hd.wlj.duohaowan.ui.home.presenter.HomePresenterImpl; +import com.hd.wlj.duohaowan.ui.home.view.KamHorizontalScrollView; +import com.wlj.base.bean.Base; +import com.wlj.base.util.UIHelper; +import com.wlj.base.util.img.LoadImage; +import com.wlj.base.util.statusbar.StatusBarUtil; +import com.wlj.base.widget.SwitchViewPager; +import com.zhy.adapter.recyclerview.CommonAdapter; +import com.zhy.adapter.recyclerview.base.ViewHolder; +import com.zhy.adapter.recyclerview.wrapper.HeaderAndFooterWrapper; + +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; + +/** + * A simple {@link Fragment} subclass. + * Activities that contain this fragment must implement the + * {@link OnFragmentInteractionListener} interface + * to handle interaction events. + * Use the {@link HomeFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class HomeFragment extends Fragment implements HomeContract.View { + + @BindView(R.id.home_recyclerView) + RecyclerView homeRecyclerView; +// @BindView(R.id.fab) +// FloatingActionButton fab; + + private OnFragmentInteractionListener mListener; + private HomePresenterImpl homePresenter; + // private ViewPager honmeClassifyViewPager; + private FrameLayout bannerViewGroup; + private List mData; + private View part_home_head; + private TextView header_new; + private HeaderAndFooterWrapper mHeaderAndFooterWrapper; +// private HorizontalScrollView mHorizontalScrollView; +// private HorizontalScrollViewAdapter mAdapter; + private LinearLayout mGallery; + private List hostList; + private KamHorizontalScrollView mHorizontalScrollView; + + public HomeFragment() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @return A new instance of fragment HomeFragment. + */ + public static HomeFragment newInstance() { + HomeFragment fragment = new HomeFragment(); + Bundle args = new Bundle(); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_home, container, false); + ButterKnife.bind(this, view); + init(); + return view; + } + + private void init() { + //沉浸式状态栏 + StatusBarUtil.transparentFlags(getActivity()); + + initHead(); + + initRecyclerView(); + + //Presenter + homePresenter = new HomePresenterImpl(getActivity()); + homePresenter.attachView(this); + + //初始化 网络请求 + homePresenter.loadBannerData(); + homePresenter.loadNews(); + homePresenter.loadHot(); + homePresenter.loadNewest(); + } + + + private void initHead() { + + part_home_head = LayoutInflater.from(getContext()).inflate(R.layout.part_home_head, null); + + bannerViewGroup = (FrameLayout) part_home_head.findViewById(R.id.home_autoScrollViewPager); + header_new = (TextView) part_home_head.findViewById(R.id.home_header_new); + + initHot(); + +// honmeClassifyViewPager = (ViewPager) part_home_head.findViewById(R.id.honme_classify_viewPager); +// //设置Page间间距 +// honmeClassifyViewPager.setPageMargin(20); +// //设置缓存的页面数量 +// honmeClassifyViewPager.setOffscreenPageLimit(4); + + } + + private void initHot() { + +// mHorizontalScrollView = (HorizontalScrollView) part_home_head.findViewById(R.id.id_horizontalScrollView); + mGallery = (LinearLayout)part_home_head.findViewById(R.id.id_gallery); + mHorizontalScrollView = (KamHorizontalScrollView) part_home_head.findViewById(R.id.id_horizontalScrollView); + + mHorizontalScrollView.setCreatItem(new KamHorizontalScrollView.CreatItem() { + @Override + public View getView(int index) { + + return createHotItem(index); + } + }); + } + + + private void initRecyclerView() { + // RecyclerView + homeRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + mData = new ArrayList(); + + CommonAdapter commonAdapter = new CommonAdapter(getContext(), R.layout.item_home_recyclerview, mData) { + @Override + protected void convert(ViewHolder holder, Base o, int position) { + + JSONObject resultJsonObject = o.getResultJsonObject(); + ImageView view = holder.getView(R.id.item_home_recyclerView_image); + holder.setImageResource(R.id.item_home_recyclerView_image,R.drawable.project_bg); + // Glide.with(HomeFragment.this).load(Urls.HOST + resultJsonObject.optString("pic")).crossFade().placeholder(R.drawable.project_bg).into(view); + LoadImage.getinstall().addTask(Urls.HOST + resultJsonObject.optString("pic"), view); + LoadImage.getinstall().doTask(); + + final ImageButton fat_in = holder.getView(R.id.home_fat_in); + final LinearLayout fat_out = holder.getView(R.id.home_fat_out); + holder.setText(R.id.item_home_rv_name,resultJsonObject.optString("") + " " + resultJsonObject.optString("")); + holder.setText(R.id.item_home_rv_year,resultJsonObject.optString("") + " " + resultJsonObject.optString("")); + + fat_in.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + v.setVisibility(View.GONE); + fat_out.setVisibility(View.VISIBLE); + } + }); + + fat_out. setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + v.setVisibility(View.GONE); + fat_in.setVisibility(View.VISIBLE); + } + }); + + + } + }; + + homeRecyclerView.setAdapter(commonAdapter); + + //添加header + mHeaderAndFooterWrapper = new HeaderAndFooterWrapper(commonAdapter); + mHeaderAndFooterWrapper.addHeaderView(part_home_head); + homeRecyclerView.setAdapter(mHeaderAndFooterWrapper); + mHeaderAndFooterWrapper.notifyDataSetChanged(); + } + + + public void onButtonPressed(Uri uri) { + if (mListener != null) { + mListener.onFragmentInteraction(uri); + } + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof OnFragmentInteractionListener) { + mListener = (OnFragmentInteractionListener) context; + } else { + throw new RuntimeException(context.toString() + + " must implement OnFragmentInteractionListener"); + } + } + + @Override + public void onDetach() { + mListener = null; + homePresenter.detachView(); + super.onDetach(); + } + + @Override + public void showBanner(List list) { + + SwitchViewPager switchViewPager = new SwitchViewPager(getContext(), list); + View createview = switchViewPager.createview(); + if (createview != null) { + bannerViewGroup.addView(createview); + } else { + UIHelper.toastMessage(getContext(), "banner图片为空"); + } + } + + @Override + public void showNews(Base base) { + JSONObject jsonObject = base.getResultJsonObject(); +// Html.fromHtml("s"); + header_new.setText( jsonObject.optString("name") ); + } + + @Override + public void showHot(List list ) { + hostList = list; + for (int i = 0; i < list.size(); i++) { + mGallery.addView(createHotItem(i)); + } + for (int i = list.size()-1; i >= 0; i--) { + + mHorizontalScrollView.addLeft(createHotItem(i)); + } + } + + private View createHotItem(int index) { + + View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_home_hot, null); + ImageView mImg = (ImageView) view.findViewById(R.id.home_hot_img); + int width = ((WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth(); + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(width / 2 - width/10, LinearLayout.LayoutParams.MATCH_PARENT); + // + JSONObject resultJsonObject = hostList.get(index).getResultJsonObject(); + + String pics = resultJsonObject.optString("pic"); + if (pics != null && pics.length() > 0) { +// Glide.with(HomeFragment.this).load(Urls.HOST +pics).crossFade().placeholder(R.drawable.project_bg).into(mImg); + LoadImage.getinstall().addTask(Urls.HOST + pics, mImg); + LoadImage.getinstall().doTask(); + } + view.setLayoutParams(layoutParams); + return view; + + } + + @Override + public void showNewest(List paramList) { + + mData.addAll(paramList); + mHeaderAndFooterWrapper.notifyDataSetChanged(); + } + + +public interface OnFragmentInteractionListener { + void onFragmentInteraction(Uri uri); +} +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/HotFragment.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/HotFragment.java new file mode 100644 index 0000000..dce616f --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/HotFragment.java @@ -0,0 +1,90 @@ +package com.hd.wlj.duohaowan.ui.home; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import com.hd.wlj.duohaowan.R; +import com.hd.wlj.duohaowan.Urls; +import com.orhanobut.logger.Logger; +import com.wlj.base.bean.Base; +import com.wlj.base.util.img.LoadImage; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import butterknife.BindView; +import butterknife.ButterKnife; + +/** + * 分类item fragment + */ + + +public class HotFragment extends Fragment { + + + @BindView(R.id.home_hot_img) + ImageView homeClassifyImg; + private Base base; + + + public HotFragment() { + } + + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + + View view = inflater.inflate(R.layout.fragment_home_hot, container, false); + + ButterKnife.bind(this, view); + + showData(); + return view; + } + + public static HotFragment newInstance(Base homeModel) { + + HotFragment classiryFragment = new HotFragment(); + classiryFragment.setHot(homeModel); + + return classiryFragment; + } + + private void showData() { + + if(base != null){ + JSONObject resultJsonObject = base.getResultJsonObject(); + + String pics = resultJsonObject.optString("pic"); + if(pics != null && pics.length() > 0 ){ + LoadImage.getinstall().addTask(Urls.HOST + pics,homeClassifyImg); + LoadImage.getinstall().doTask(); + } + }else{ + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + showData(); + } + + } + + public void setHot(Base base) { + this.base = base; + } +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/contract/HomeContract.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/contract/HomeContract.java new file mode 100644 index 0000000..a29e9f8 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/contract/HomeContract.java @@ -0,0 +1,37 @@ +package com.hd.wlj.duohaowan.ui.home.contract; + +import com.wlj.base.bean.Base; + +import java.util.List; + +/** + * Created by wlj on 2016/10/26. + */ + +public class HomeContract { + + public interface View { + + void showBanner(List list); + + void showNews(Base news); + + void showHot(List hot); + + void showNewest(List newest); + } + + public interface Presenter { + + void attachView(V view); + + void detachView(); + + } + + public interface Model { + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/model/HomeModelImpl.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/model/HomeModelImpl.java new file mode 100644 index 0000000..0b5b809 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/model/HomeModelImpl.java @@ -0,0 +1,164 @@ +package com.hd.wlj.duohaowan.ui.home.model; +import android.app.Activity; + +import com.hd.wlj.duohaowan.Urls; +import com.hd.wlj.duohaowan.ui.home.contract.HomeContract; +import com.wlj.base.bean.Banner; +import com.wlj.base.bean.Base; +import com.wlj.base.web.HttpPost; +import com.wlj.base.web.MsgContext; +import com.wlj.base.web.asyn.AsyncCall; +import com.wlj.base.web.asyn.AsyncRequestModle; +import com.wlj.base.web.asyn.BaseAsyncModle; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; + +/** +* Created by wlj on 2016/10/26 +*/ + + public class HomeModelImpl extends BaseAsyncModle implements HomeContract.Model{ + + /** + * 新闻消息 + */ + public final static int news = 2; + /** + * hot + */ + public final static int hot = 3; + /** + * 最新 + */ + public final static int newest = 4; + + // tag_type 标签 1/推荐 2/热门 3(热门+推荐) + + public HomeModelImpl() { + } + + public HomeModelImpl(Activity activity) { + super(activity); + } + + public HomeModelImpl(JSONObject jo) { + super(jo); + } + + @Override + public void addRequestParemeter(AsyncRequestModle paramAsyncRequestModle) throws IOException { + //首页banner图片 + HttpPost httpPost = new HttpPost(Urls.list_pub); + httpPost.addParemeter("pubConlumnId", MsgContext.home_banner); + + paramAsyncRequestModle.setHttpPost(httpPost); + paramAsyncRequestModle.setParserCla(Banner.class); + } + + @Override + public void addRequestParemeter(AsyncRequestModle asRequestModle, int type) throws IOException { + + if(type == news){ + HttpPost httpPost = new HttpPost(Urls.list_pub); + httpPost.addParemeter("pubConlumnId", MsgContext.home_news); + + asRequestModle.setHttpPost(httpPost); + + }else if(type == hot){ + // tag_type 标签 1/推荐 2/热门 3(热门+推荐) + HttpPost httpPost = new HttpPost(Urls.list_pub); + httpPost.addParemeter("rootPubConlumnId", MsgContext.home_hot); + httpPost.addParemeter("tag_type", "2"); + + asRequestModle.setHttpPost(httpPost); + + }else if(type == newest){ + HttpPost httpPost = new HttpPost(Urls.list_pub); + httpPost.addParemeter("secondPubConlumnId", MsgContext.home_newest); + + asRequestModle.setHttpPost(httpPost); + + } + + } + + @Override + public Base parse(JSONObject jsonObject) throws JSONException { + return new HomeModelImpl(jsonObject); + } + + public void loadBannerData(AsyncCall.OnAsyncBackListener lister) { + + AsyncCall request = Request(); + request.setOnAsyncBackListener(lister); + } + + /** + * 首页 顶部文字新闻 + * @param onAsyncBackListener + */ + public void loadNews(AsyncCall.OnAsyncBackListener onAsyncBackListener) { + Request(news).setOnAsyncBackListener(onAsyncBackListener); + } + + + + +} + +/** + * news + * { + "id" : "5812cc1f78e0802052dd7a14", + "name" : "“云南味道”咖啡拉花艺术大赛亮相中国国际食品博览会", + "intro" : "MTDmnIgyN+aXpe+8jOS4gOWcuuWIq+W8gOeUn+mdoueahOKAnOS6keWNl+WRs+mBk+KAneWSluWVoeaLieiKseiJuuacr+Wkp+i1m+WwhuWcqOS4reWbveWbvemZhemjn+WTgeWNmuiniOS8mueOsOWcuijkuIrmtbflsZXop4jkuK3lv4Mp5ouJ5byA5bqP5bmV44CC5q2k5qyh5aSn6LWb5piv5Zyo6L+Z5bqn57uP5Y6G5LqGNjHlubTpo47pm6jljoblj7LnmoTogIHlu7rnrZHkuK3kuL7lip7nmoTnrKzkuIDlnLrlhbPkuo7lkpbllaHnmoTmr5TotZvvvIzkuZ/mmK/po5/ljZrkvJrlr7nlkpbllaHotZvkuovlkozlkpbllaHmlofljJblsZXnpLrnmoTnrKzkuIDmrKHlsJ3or5XvvIzorqnmiJHku6zmnaXkuIDotbfnnIvnnIvvvIzov5nlnLrmtLvliqjmnInlk6rkupvnnIvngrnjgIIg", + "content" : "MTDmnIgyN+aXpe+8jOS4gOWcuuWIq+W8gOeUn+mdoueahOKAnOS6keWNl+WRs+mBk+KAneWSluWVoeaLieiKseiJuuacr+Wkp+i1m+WwhuWcqOS4reWbveWbvemZhemjn+WTgeWNmuiniOS8mueOsOWcuijkuIrmtbflsZXop4jkuK3lv4Mp5ouJ5byA5bqP5bmV44CC5q2k5qyh5aSn6LWb5piv5Zyo6L+Z5bqn57uP5Y6G5LqGNjHlubTpo47pm6jljoblj7LnmoTogIHlu7rnrZHkuK3kuL7lip7nmoTnrKzkuIDlnLrlhbPkuo7lkpbllaHnmoTmr5TotZvvvIzkuZ/mmK/po5/ljZrkvJrlr7nlkpbllaHotZvkuovlkozlkpbllaHmlofljJblsZXnpLrnmoTnrKzkuIDmrKHlsJ3or5XvvIzorqnmiJHku6zmnaXkuIDotbfnnIvnnIvvvIzov5nlnLrmtLvliqjmnInlk6rkupvnnIvngrnjgII=", + "state" : "1", + "rootPubConlumnId" : "56ef9534d812a83901549457", + "rootPubConlumnName" : "资讯管理", + "secondPubConlumnId" : "57fca5d9ef722c216b767c97", + "secondPubConlumnName" : "首页内容", + "thirdPubConlumnId" : "57fca5ffef722c216b767c99", + "thirdPubConlumnName" : "首页文字滚动资讯" + } + */ + +/** + * hot + * + * { + "id" : "5812cc1f78e0802052dd7a14", + "name" : "“云南味道”咖啡拉花艺术大赛亮相中国国际食品博览会", + "intro" : "MTDmnIgyN+aXpe+8jOS4gOWcuuWIq+W8gOeUn+mdoueahOKAnOS6keWNl+WRs+mBk+KAneWSluWVoeaLieiKseiJuuacr+Wkp+i1m+WwhuWcqOS4reWbveWbvemZhemjn+WTgeWNmuiniOS8mueOsOWcuijkuIrmtbflsZXop4jkuK3lv4Mp5ouJ5byA5bqP5bmV44CC5q2k5qyh5aSn6LWb5piv5Zyo6L+Z5bqn57uP5Y6G5LqGNjHlubTpo47pm6jljoblj7LnmoTogIHlu7rnrZHkuK3kuL7lip7nmoTnrKzkuIDlnLrlhbPkuo7lkpbllaHnmoTmr5TotZvvvIzkuZ/mmK/po5/ljZrkvJrlr7nlkpbllaHotZvkuovlkozlkpbllaHmlofljJblsZXnpLrnmoTnrKzkuIDmrKHlsJ3or5XvvIzorqnmiJHku6zmnaXkuIDotbfnnIvnnIvvvIzov5nlnLrmtLvliqjmnInlk6rkupvnnIvngrnjgIIg", + "content" : "MTDmnIgyN+aXpe+8jOS4gOWcuuWIq+W8gOeUn+mdoueahOKAnOS6keWNl+WRs+mBk+KAneWSluWVoeaLieiKseiJuuacr+Wkp+i1m+WwhuWcqOS4reWbveWbvemZhemjn+WTgeWNmuiniOS8mueOsOWcuijkuIrmtbflsZXop4jkuK3lv4Mp5ouJ5byA5bqP5bmV44CC5q2k5qyh5aSn6LWb5piv5Zyo6L+Z5bqn57uP5Y6G5LqGNjHlubTpo47pm6jljoblj7LnmoTogIHlu7rnrZHkuK3kuL7lip7nmoTnrKzkuIDlnLrlhbPkuo7lkpbllaHnmoTmr5TotZvvvIzkuZ/mmK/po5/ljZrkvJrlr7nlkpbllaHotZvkuovlkozlkpbllaHmlofljJblsZXnpLrnmoTnrKzkuIDmrKHlsJ3or5XvvIzorqnmiJHku6zmnaXkuIDotbfnnIvnnIvvvIzov5nlnLrmtLvliqjmnInlk6rkupvnnIvngrnjgII=", + "state" : "1", + "rootPubConlumnId" : "56ef9534d812a83901549457", + "rootPubConlumnName" : "资讯管理", + "secondPubConlumnId" : "57fca5d9ef722c216b767c97", + "secondPubConlumnName" : "首页内容", + "thirdPubConlumnId" : "57fca5ffef722c216b767c99", + "thirdPubConlumnName" : "首页文字滚动资讯" + } + */ + +/** + * newest + * + * { + "id" : "5812cc1f78e0802052dd7a14", + "name" : "“云南味道”咖啡拉花艺术大赛亮相中国国际食品博览会", + "intro" : "MTDmnIgyN+aXpe+8jOS4gOWcuuWIq+W8gOeUn+mdoueahOKAnOS6keWNl+WRs+mBk+KAneWSluWVoeaLieiKseiJuuacr+Wkp+i1m+WwhuWcqOS4reWbveWbvemZhemjn+WTgeWNmuiniOS8mueOsOWcuijkuIrmtbflsZXop4jkuK3lv4Mp5ouJ5byA5bqP5bmV44CC5q2k5qyh5aSn6LWb5piv5Zyo6L+Z5bqn57uP5Y6G5LqGNjHlubTpo47pm6jljoblj7LnmoTogIHlu7rnrZHkuK3kuL7lip7nmoTnrKzkuIDlnLrlhbPkuo7lkpbllaHnmoTmr5TotZvvvIzkuZ/mmK/po5/ljZrkvJrlr7nlkpbllaHotZvkuovlkozlkpbllaHmlofljJblsZXnpLrnmoTnrKzkuIDmrKHlsJ3or5XvvIzorqnmiJHku6zmnaXkuIDotbfnnIvnnIvvvIzov5nlnLrmtLvliqjmnInlk6rkupvnnIvngrnjgIIg", + "content" : "MTDmnIgyN+aXpe+8jOS4gOWcuuWIq+W8gOeUn+mdoueahOKAnOS6keWNl+WRs+mBk+KAneWSluWVoeaLieiKseiJuuacr+Wkp+i1m+WwhuWcqOS4reWbveWbvemZhemjn+WTgeWNmuiniOS8mueOsOWcuijkuIrmtbflsZXop4jkuK3lv4Mp5ouJ5byA5bqP5bmV44CC5q2k5qyh5aSn6LWb5piv5Zyo6L+Z5bqn57uP5Y6G5LqGNjHlubTpo47pm6jljoblj7LnmoTogIHlu7rnrZHkuK3kuL7lip7nmoTnrKzkuIDlnLrlhbPkuo7lkpbllaHnmoTmr5TotZvvvIzkuZ/mmK/po5/ljZrkvJrlr7nlkpbllaHotZvkuovlkozlkpbllaHmlofljJblsZXnpLrnmoTnrKzkuIDmrKHlsJ3or5XvvIzorqnmiJHku6zmnaXkuIDotbfnnIvnnIvvvIzov5nlnLrmtLvliqjmnInlk6rkupvnnIvngrnjgII=", + "state" : "1", + "rootPubConlumnId" : "56ef9534d812a83901549457", + "rootPubConlumnName" : "资讯管理", + "secondPubConlumnId" : "57fca5d9ef722c216b767c97", + "secondPubConlumnName" : "首页内容", + "thirdPubConlumnId" : "57fca5ffef722c216b767c99", + "thirdPubConlumnName" : "首页文字滚动资讯" + } + + */ diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/presenter/HomePresenterImpl.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/presenter/HomePresenterImpl.java new file mode 100644 index 0000000..0ce75f3 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/presenter/HomePresenterImpl.java @@ -0,0 +1,148 @@ +package com.hd.wlj.duohaowan.ui.home.presenter; +import android.app.Activity; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; + +import com.hd.wlj.duohaowan.ui.home.contract.HomeContract; +import com.hd.wlj.duohaowan.ui.home.model.HomeModelImpl; +import com.wlj.base.bean.Base; +import com.wlj.base.web.asyn.AsyncCall; + +import java.util.List; + +/** +* Created by wlj on 2016/10/26 +*/ + +public class HomePresenterImpl implements HomeContract.Presenter { + + + private final HomeModelImpl homeModel; + private HomeContract.View view; + + public HomePresenterImpl(Activity activity){ + homeModel = new HomeModelImpl(activity); + } + + @Override + public void attachView(HomeContract.View view) { + + this.view = view; + } + + @Override + public void detachView() { + + handler.removeCallbacks(null); + view = null; + } + + public void loadBannerData() { + + homeModel.loadBannerData(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base paramBase, int paramInt) { + view.showBanner(paramList); + } + + @Override + public void fail(Exception paramException) { + + } + }); + + } + + public void loadNews() { + + homeModel.loadNews(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base paramBase, int paramInt) { + + tinner(paramList); + } + + @Override + public void fail(Exception paramException) { + + } + }); + } + + public void loadHot(){ + + homeModel.Request(HomeModelImpl.hot).setOnAsyncBackListener(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base paramBase, int paramInt) { + if(view != null) { + view.showHot(paramList); + } + } + + @Override + public void fail(Exception paramException) { + + } + }); + } + + public void loadNewest(){ + + homeModel.Request(HomeModelImpl.newest ).setOnAsyncBackListener(new AsyncCall.OnAsyncBackListener() { + @Override + public void OnAsyncBack(List paramList, Base paramBase, int paramInt) { + if(view != null) { + view.showNewest(paramList); + } + } + + @Override + public void fail(Exception paramException) { + + } + }); + } + + private void tinner(final List paramList) { + new Thread(new Runnable() { + @Override + public void run() { + while(true) { + + for (int i = 0; i < paramList.size(); i++) { + + Message message = handler.obtainMessage(); + message.obj = paramList.get(i); + message.sendToTarget(); + + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + } + }).start(); + } + + private Handler handler = new Handler(Looper.getMainLooper()){ + @Override + public void handleMessage(Message msg) { + + if(view != null) {//有可能要销毁 + view.showNews((Base) msg.obj); + } + + } + }; + +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/HorizontalScrollViewAdapter.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/HorizontalScrollViewAdapter.java new file mode 100644 index 0000000..71261e3 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/HorizontalScrollViewAdapter.java @@ -0,0 +1,78 @@ +package com.hd.wlj.duohaowan.ui.home.view; + +import java.util.List; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.hd.wlj.duohaowan.R; +import com.hd.wlj.duohaowan.Urls; +import com.wlj.base.bean.Base; +import com.wlj.base.util.img.LoadImage; + +import org.json.JSONObject; + +public class HorizontalScrollViewAdapter { + private Context mContext; + private LayoutInflater mInflater; + private List mDatas; + + public HorizontalScrollViewAdapter(Context context, List mDatas) { + this.mContext = context; + mInflater = LayoutInflater.from(context); + this.mDatas = mDatas; + } + + public int getCount() { + return mDatas.size(); + } + + public Object getItem(int position) { + return mDatas.get(position); + } + + public long getItemId(int position) { + return position; + } + + public View getView(int position, View convertView, ViewGroup parent) { + ViewHolder viewHolder = null; + if (convertView == null) { + + viewHolder = new ViewHolder(); + convertView = mInflater.inflate(R.layout.fragment_home_hot, parent, false); + viewHolder.mImg = (ImageView) convertView.findViewById(R.id.home_hot_img); + int width = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth(); + viewHolder.mImg.setLayoutParams(new LinearLayout.LayoutParams(width/2-150, LinearLayout.LayoutParams.MATCH_PARENT)); + + convertView.setTag(viewHolder); + } else { + viewHolder = (ViewHolder) convertView.getTag(); + } + + // + Base base = mDatas.get(position); + + JSONObject resultJsonObject = base.getResultJsonObject(); + + String pics = resultJsonObject.optString("pic"); + if (pics != null && pics.length() > 0) { + LoadImage.getinstall().addTask(Urls.HOST + pics, viewHolder.mImg); + LoadImage.getinstall().doTask(); + } + + return convertView; + } + + private class ViewHolder { + ImageView mImg; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/KamHorizontalScrollView.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/KamHorizontalScrollView.java new file mode 100644 index 0000000..9d409e9 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/KamHorizontalScrollView.java @@ -0,0 +1,303 @@ +package com.hd.wlj.duohaowan.ui.home.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.widget.HorizontalScrollView; + +import com.orhanobut.logger.Logger; +import com.wlj.base.util.MathUtil; + +import java.math.BigDecimal; + + +/*如果不需要支持Android2.3,可以将代码中所有KamLinearLayout替换为ViewGroup*/ +public class KamHorizontalScrollView extends HorizontalScrollView { + + private CreatItem mCreatItem; + private Context context; + /*记录当前的页数标识(做日视图的时候可以和该值今日的日期作差)*/ + private int PageNo = 0; + /*保存ScrollView中的ViewGroup,如果不需要支持Android2.3,可以将KamLinearLayout替换为ViewGroup*/ + private KamLinearLayout childGroup = null; + /*这是判断左右滑动用的(个人喜好,其实不需要这么麻烦)*/ + private int poscache[] = new int[4]; + + private float startpos; + private KamLinearLayout.kamLayoutChangeListener listener; + private int childWidth = 1; + private float yushu = 0; + + + public KamHorizontalScrollView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + this.context = context; + } + + public KamHorizontalScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + this.context = context; + } + + public KamHorizontalScrollView(Context context) { + super(context); + this.context = context; + } + + /*重写触摸事件,判断左右滑动*/ + @Override + public boolean onTouchEvent(MotionEvent ev) { + switch (ev.getAction()) { + case MotionEvent.ACTION_DOWN: + startpos = ev.getX(); + /*用于判断触摸滑动的速度*/ +// initSpeedChange((int) ev.getX()); + break; + case MotionEvent.ACTION_MOVE: + /*更新触摸速度信息*/ +// movingSpeedChange((int) ev.getX()); + + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: { + /*先根据速度来判断向左或向右*/ +// int speed = releaseSpeedChange((int) ev.getX()); + + float movex = ev.getX() - startpos; + + if(childWidth == 1) { + if (childGroup.getChildCount() > 0) { + + View childAt = childGroup.getChildAt(0); + childWidth = childAt.getWidth(); + } + } +// Logger.e("movex:" + movex + " yushu:" + yushu); + movex += yushu; + yushu = movex % childWidth; + BigDecimal bigDecimal = MathUtil.divideDwon(movex,childWidth); + int i = Math.abs(bigDecimal.intValue()); +// Logger.e("movex:" + movex + " yushu:" + yushu+ " 个数: "+i +" "+ bigDecimal); + if (ev.getX() - startpos < 0) { + + for (int j = 0; j < i; j++) { + + nextPage(); + } + return true; + }else if (ev.getX() - startpos > 0) { + for (int j = 0; j < i; j++) { + + prevPage(); + } + return true; + } + } + } + return super.onTouchEvent(ev); + } + + /*下面的方法仅仅是个人喜好加上的,用于判断用户手指左右滑动的速度。*/ + private void initSpeedChange(int x) { + if (poscache.length <= 1) return; + poscache[0] = 1; + for (int i = 1; i < poscache.length; i++) { + + } + } + + /*完成实例化*/ + @Override + protected void onFinishInflate() { + super.onFinishInflate(); +// Logger.i( "onFinishInflate Called!"); + init(); + } + + /*初始化,加入三个子View*/ + private void init() { + if (this.childGroup == null) { + View childAt = getChildAt(0); + if (childAt instanceof KamLinearLayout) { + childGroup = (KamLinearLayout) childAt; + } else { + throw new RuntimeException("childGroup为空"); + } + } + + /*添加LayoutChange监听器*/ + childGroup.addKamLayoutChangeListener(listener); + + /*调用其自身的LayoutChange监听器(不支持Android2.3)*/ + /*childGroup.addOnLayoutChangeListener(listener);*/ + + /*添加监听器*/ + listener = new KamLinearLayout.kamLayoutChangeListener() { + @Override + public void onLayoutChange() { + Logger.i( "onLayoutChanged Called!"); + scrollToPage(1); + } + + }; + } + + + /* + //注意,如果不需要支持Android2.3,可以将上面的listener替换成下方listener + OnLayoutChangeListener listener = new OnLayoutChangeListener() { + @Override + public void onLayoutChange(View arg0, int arg1, int arg2, int arg3, + int arg4, int arg5, int arg6, int arg7, int arg8) { + Logger.i(tag, "onLayoutChanged Called!"); + scrollToPage(1); + } + } + */ + + /*左翻页*/ + public void prevPage() { + Logger.d("prevPage"); + PageNo--; + addLeft(getView(PageNo )); + removeRight(); + } + + /*右翻页*/ + public void nextPage() { + Logger.d("nextPage"); + PageNo++; + addRight(getView(PageNo )); + removeLeft(); + } + + private View getView(int index) { + + int childCount = childGroup.getChildCount()/2; + int i = (index % childCount + childCount) % childCount; + return mCreatItem.getView(i); + } + + /*获取某个孩子的X坐标*/ + private int getChildLeft(int index) { + if (index >= 0 && childGroup != null) { + if (index < childGroup.getChildCount()) + return childGroup.getChildAt(index).getLeft(); + } + return 0; + } + + /** + * 向右边添加View + * + * @param view 需要添加的View + * @return true添加成功|false添加失败 + */ + + public boolean addRight(View view) { + + if (view == null || childGroup == null) return false; + childGroup.addView(view); + return true; + } + + /** + * 删除右边的View + * + * @return true成功|false失败 + */ + public boolean removeRight() { + if (childGroup == null || childGroup.getChildCount() <= 0) return false; + childGroup.removeViewAt(childGroup.getChildCount() - 1); + return true; + } + + /** + * 向左边添加View + * @param view 需要添加的View1 + * @return true添加成功|false添加失败 + */ + public boolean addLeft(View view) { + if (view == null || childGroup == null) return false; + childGroup.addView(view, 0); + /*因为在左边增加了View,因此所有View的x坐标都会增加,因此需要让ScrollView也跟着移动,才能从屏幕看来保持平滑。*/ + int tmpwidth = view.getLayoutParams().width; + if (tmpwidth == 0) tmpwidth = getWinWidth(); + Logger.i( "the new view's width = " + view.getLayoutParams().width); + this.scrollTo(this.getScrollX() + tmpwidth, 0); + return true; + } + + /** + * 删除左边的View + * @return true成功|false失败 + */ + public boolean removeLeft() { + if (childGroup == null || childGroup.getChildCount() <= 0) return false; + /*因为在左边删除了View,因此所有View的x坐标都会减少,因此需要让ScrollView也跟着移动。*/ + int tmpwidth = childGroup.getChildAt(0).getWidth(); + childGroup.removeViewAt(0); + this.scrollTo((int) (this.getScrollX() - tmpwidth), 0); + return true; + } + + /** + * 跳转到指定的页面 + * + * @param index 跳转的页码 + * @return + */ + public boolean scrollToPage(int index) { + if (childGroup == null) return false; + if (index < 0 || index >= childGroup.getChildCount()) return false; + smoothScrollTo(getChildLeft(index), 0); + return true; + } + + private int getWinWidth() { + // 获取屏幕信息 + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + return dm.widthPixels; + } + + private int getWinHeight() { + // 获取屏幕信息 + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + return dm.heightPixels; + } + +// private void movingSpeedChange(int x) { +// poscache[0] %= poscache.length - 1; +// poscache[0]++; +// //Logger.i(tag, "touch speed:"+(x-poscache[poscache[0]])); +// poscache[poscache[0]] = x; +// } +// +// private int releaseSpeedChange(int x) { +// return releaseSpeedChange(x, 30); +// } +// +// private int releaseSpeedChange(int x, int limit) { +// poscache[0] %= poscache.length - 1; +// poscache[0]++; +// /*检测到向左的速度很大*/ +// if (poscache[poscache[0]] - x > limit) return 1; +// /*检测到向右的速度很大*/ +// if (x - poscache[poscache[0]] > limit) return -1; +// +// return 0; +// } + + public void setCreatItem(CreatItem mCreatItem) { + this.mCreatItem = mCreatItem; + } + + public interface CreatItem { + + View getView(int index); + } + +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/KamLinearLayout.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/KamLinearLayout.java new file mode 100644 index 0000000..910ed25 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/KamLinearLayout.java @@ -0,0 +1,34 @@ +package com.hd.wlj.duohaowan.ui.home.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.LinearLayout; + +public class KamLinearLayout extends LinearLayout { + kamLayoutChangeListener listener = null; + + public void addKamLayoutChangeListener(kamLayoutChangeListener listener) { + this.listener = listener; + } + + + public KamLinearLayout(Context context) { + super(context); + } + + public KamLinearLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + if (this.listener != null) this.listener.onLayoutChange(); + } + + + /*自定义监听器*/ + public interface kamLayoutChangeListener { + abstract void onLayoutChange(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/MyHorizontalScrollView.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/MyHorizontalScrollView.java new file mode 100644 index 0000000..0f80dfe --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/home/view/MyHorizontalScrollView.java @@ -0,0 +1,278 @@ +package com.hd.wlj.duohaowan.ui.home.view; + +import java.util.HashMap; +import java.util.Map; + +import android.content.Context; +import android.graphics.Color; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.WindowManager; +import android.widget.HorizontalScrollView; +import android.widget.LinearLayout; + +public class MyHorizontalScrollView extends HorizontalScrollView implements + OnClickListener { + + /** + * 图片滚动时的回调接口 + * + * @author zhy + */ + public interface CurrentImageChangeListener { + void onCurrentImgChanged(int position, View viewIndicator); + } + + /** + * 条目点击时的回调 + * + * @author zhy + */ + public interface OnItemClickListener { + void onClick(View view, int pos); + } + + private CurrentImageChangeListener mListener; + + private OnItemClickListener mOnClickListener; + + private static final String TAG = "MyHorizontalScrollView"; + + /** + * HorizontalListView中的LinearLayout + */ + private LinearLayout mContainer; + + /** + * 子元素的宽度 + */ + private int mChildWidth; + /** + * 子元素的高度 + */ + private int mChildHeight; + /** + * 当前最后一张图片的index + */ + private int mCurrentIndex; + /** + * 当前第一张图片的下标 + */ + private int mFristIndex; + /** + * 当前第一个View + */ + private View mFirstView; + /** + * 数据适配器 + */ + private HorizontalScrollViewAdapter mAdapter; + /** + * 每屏幕最多显示的个数 + */ + private int mCountOneScreen; + /** + * 屏幕的宽度 + */ + private int mScreenWitdh; + + + /** + * 保存View与位置的键值对 + */ + private Map mViewPos = new HashMap(); + + public MyHorizontalScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + // 获得屏幕宽度 + WindowManager wm = (WindowManager) context + .getSystemService(Context.WINDOW_SERVICE); + DisplayMetrics outMetrics = new DisplayMetrics(); + wm.getDefaultDisplay().getMetrics(outMetrics); + mScreenWitdh = outMetrics.widthPixels; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + mContainer = (LinearLayout) getChildAt(0); + } + + /** + * 加载下一张图片 + */ + protected void loadNextImg() { + // 数组边界值计算 + if (mCurrentIndex == mAdapter.getCount() - 1) { + return; + } + //移除第一张图片,且将水平滚动位置置0 + scrollTo(0, 0); + mViewPos.remove(mContainer.getChildAt(0)); + mContainer.removeViewAt(0); + + //获取下一张图片,并且设置onclick事件,且加入容器中 + View view = mAdapter.getView(++mCurrentIndex, null, mContainer); + view.setOnClickListener(this); + mContainer.addView(view); + mViewPos.put(view, mCurrentIndex); + + //当前第一张图片小标 + mFristIndex++; + //如果设置了滚动监听则触发 + if (mListener != null) { + notifyCurrentImgChanged(); + } + + } + + /** + * 加载前一张图片 + */ + protected void loadPreImg() { + //如果当前已经是第一张,则返回 + if (mFristIndex == 0) + return; + //获得当前应该显示为第一张图片的下标 + int index = mCurrentIndex - mCountOneScreen; + if (index >= 0) { +// mContainer = (LinearLayout) getChildAt(0); + //移除最后一张 + int oldViewPos = mContainer.getChildCount() - 1; + mViewPos.remove(mContainer.getChildAt(oldViewPos)); + mContainer.removeViewAt(oldViewPos); + + //将此View放入第一个位置 + View view = mAdapter.getView(index, null, mContainer); + mViewPos.put(view, index); + mContainer.addView(view, 0); + view.setOnClickListener(this); + //水平滚动位置向左移动view的宽度个像素 + scrollTo(mChildWidth, 0); + //当前位置--,当前第一个显示的下标-- + mCurrentIndex--; + mFristIndex--; + //回调 + if (mListener != null) { + notifyCurrentImgChanged(); + + } + } + } + + /** + * 滑动时的回调 + */ + public void notifyCurrentImgChanged() { + //先清除所有的背景色,点击时会设置为蓝色 + for (int i = 0; i < mContainer.getChildCount(); i++) { + mContainer.getChildAt(i).setBackgroundColor(Color.WHITE); + } + + mListener.onCurrentImgChanged(mFristIndex, mContainer.getChildAt(0)); + + } + + /** + * 初始化数据,设置数据适配器 + * + * @param mAdapter + */ + public void initDatas(HorizontalScrollViewAdapter mAdapter) { + this.mAdapter = mAdapter; + mContainer = (LinearLayout) getChildAt(0); + // 获得适配器中第一个View + final View view = mAdapter.getView(0, null, mContainer); + mContainer.addView(view); + + // 强制计算当前View的宽和高 + if (mChildWidth == 0 && mChildHeight == 0) { + int w = View.MeasureSpec.makeMeasureSpec(0, + View.MeasureSpec.UNSPECIFIED); + int h = View.MeasureSpec.makeMeasureSpec(0, + View.MeasureSpec.UNSPECIFIED); + view.measure(w, h); + mChildHeight = view.getMeasuredHeight(); + mChildWidth = view.getMeasuredWidth(); + Log.e(TAG, view.getMeasuredWidth() + "," + view.getMeasuredHeight()); + mChildHeight = view.getMeasuredHeight(); + // 计算每次加载多少个View + mCountOneScreen = mScreenWitdh / mChildWidth + 2; + + Log.e(TAG, "mCountOneScreen = " + mCountOneScreen + + " ,mChildWidth = " + mChildWidth); + + + } + //初始化第一屏幕的元素 + initFirstScreenChildren(mCountOneScreen); + } + + /** + * 加载第一屏的View + * + * @param mCountOneScreen + */ + public void initFirstScreenChildren(int mCountOneScreen) { + mContainer = (LinearLayout) getChildAt(0); + mContainer.removeAllViews(); + mViewPos.clear(); + + for (int i = 0; i < mCountOneScreen; i++) { + View view = mAdapter.getView(i, null, mContainer); + view.setOnClickListener(this); + mContainer.addView(view); + mViewPos.put(view, i); + mCurrentIndex = i; + } + + if (mListener != null) { + notifyCurrentImgChanged(); + } + + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + switch (ev.getAction()) { + case MotionEvent.ACTION_MOVE: +// Log.e(TAG, getScrollX() + ""); + + int scrollX = getScrollX(); + // 如果当前scrollX为view的宽度,加载下一张,移除第一张 + if (scrollX >= mChildWidth) { + loadNextImg(); + } + // 如果当前scrollX = 0, 往前设置一张,移除最后一张 + if (scrollX == 0) { + loadPreImg(); + } + break; + } + return super.onTouchEvent(ev); + } + + @Override + public void onClick(View v) { + if (mOnClickListener != null) { + for (int i = 0; i < mContainer.getChildCount(); i++) { + mContainer.getChildAt(i).setBackgroundColor(Color.WHITE); + } + mOnClickListener.onClick(v, mViewPos.get(v)); + } + } + + public void setOnItemClickListener(OnItemClickListener mOnClickListener) { + this.mOnClickListener = mOnClickListener; + } + + public void setCurrentImageChangeListener( + CurrentImageChangeListener mListener) { + this.mListener = mListener; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/my/MyFragment.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/my/MyFragment.java new file mode 100644 index 0000000..5890d56 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/my/MyFragment.java @@ -0,0 +1,30 @@ +package com.hd.wlj.duohaowan.ui.my; + + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.hd.wlj.duohaowan.R; + +/** + * A simple {@link Fragment} subclass. + */ +public class MyFragment extends Fragment { + + + public MyFragment() { + // Required empty public constructor + } + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_my, container, false); + } + +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/ui/seach/SeachFragment.java b/app/src/main/java/com/hd/wlj/duohaowan/ui/seach/SeachFragment.java new file mode 100644 index 0000000..39ec4d8 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/ui/seach/SeachFragment.java @@ -0,0 +1,30 @@ +package com.hd.wlj.duohaowan.ui.seach; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.hd.wlj.duohaowan.R; +import com.wlj.base.ui.BaseFragment; +import com.wlj.base.util.statusbar.StatusBarUtil; + +/** + * Created by wlj on 2016/10/27. + */ + +public class SeachFragment extends Fragment { + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_seach, container, false); + +// StatusBarUtil.setTransparentForImageViewInFragment(getActivity(),null); + return view; + } + + +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/view/ImgInpImg.java b/app/src/main/java/com/hd/wlj/duohaowan/view/ImgInpImg.java new file mode 100644 index 0000000..df496ee --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/view/ImgInpImg.java @@ -0,0 +1,131 @@ +package com.hd.wlj.duohaowan.view; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.annotation.RequiresApi; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.TextView; + +import com.hd.wlj.duohaowan.R; +import com.orhanobut.logger.Logger; +import com.wlj.base.widget.IconfontTextview; + +/** + * iconfont EditText iconfont组合 + * + */ +public class ImgInpImg extends FrameLayout { + private float deftextsize = 16f; + private int deftextcolor = Color.BLACK; + private TextView iconFontView1; + private EditText editTextView; + private TextView iconFontView2; + + public ImgInpImg(Context context) { + this(context,null); + } + + public ImgInpImg(Context context, AttributeSet attrs) { + this(context, attrs,0); + } + + public ImgInpImg(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + init(context, attrs); + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + public ImgInpImg(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + + init(context, attrs); + } + + private void init(Context context, AttributeSet attrs) { + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ImgInpImg); + //-------- 获取值 + //iconFontView1 + String iconfont1Text = a.getString(R.styleable.ImgInpImg_iconfont1_text); + int iconfont1TextColor = a.getColor(R.styleable.ImgInpImg_iconfont1_color, deftextcolor); + + //iconFontView2 + String iconfont2Text = a.getString(R.styleable.ImgInpImg_iconfont2_text); + int iconfont2TextColor = a.getColor(R.styleable.ImgInpImg_iconfont2_color, deftextcolor); + // EditText + String editTextHit = a.getString(R.styleable.ImgInpImg_edittext_hit); + String editTextText = a.getString( R.styleable.ImgInpImg_edittext_text); + int editTextTextColor = a.getColor(R.styleable.ImgInpImg_edittext_textcolor,deftextcolor); + + boolean backgroundisNull = a.getBoolean(R.styleable.ImgInpImg_edittext_background_isnull, false); + Drawable background_drawable = a.getDrawable(R.styleable.ImgInpImg_edittext_background); +// int resourceId = a.getResourceId(R.styleable.ImgInpImg_edittext_background, 0); +// Bitmap background_bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId); + + //---------布局 + View inflate = LayoutInflater.from(context).inflate(R.layout.view_img_inp_img, this); + + iconFontView1 = (TextView)inflate.findViewById(R.id.img_inp_img__imgs); + + editTextView = (EditText)inflate.findViewById(R.id.img_inp_img__input); + iconFontView2 = (TextView)inflate.findViewById(R.id.img_inp_img__imge); + + //---------- 设置值 + //iconFontView1 + iconFontView1.setText(iconfont1Text); + iconFontView1.setTextColor(iconfont1TextColor); + iconFontView1.setTextSize(deftextsize); + //editTextView + editTextView.setText(editTextText); + editTextView.setHint(editTextHit); + editTextView.setTextColor(editTextTextColor); + editTextView.setTextSize(deftextsize); + + if(background_drawable != null ) { + + editTextView.setBackgroundDrawable(background_drawable); + }else if(backgroundisNull){ + editTextView.setBackgroundDrawable(null); + } + // iconFontView2 + iconFontView2.setText(iconfont2Text); + iconFontView2.setTextColor(iconfont2TextColor); + iconFontView2.setTextSize(deftextsize); + } + + public void setInputType(int type){ + editTextView.setInputType(type); + } + + /** + * iconFontView2 的点击事件 + * @param onClickListener + */ + public void setOnClickListener(OnClickListener onClickListener){ + iconFontView2.setOnClickListener(onClickListener); + } + + public String getText(){ + + return editTextView.getText()+""; + } + + public IconfontTextview getIconFontView2() { + return (IconfontTextview)iconFontView2; + } + + public IconfontTextview getIconFontView1() { + return (IconfontTextview)iconFontView1; + } + + public EditText getEditTextView() { + return editTextView; + } +} diff --git a/app/src/main/java/com/hd/wlj/duohaowan/wxapi/WXEntryActivity.java b/app/src/main/java/com/hd/wlj/duohaowan/wxapi/WXEntryActivity.java new file mode 100644 index 0000000..dc67ce5 --- /dev/null +++ b/app/src/main/java/com/hd/wlj/duohaowan/wxapi/WXEntryActivity.java @@ -0,0 +1,164 @@ +package com.hd.wlj.duohaowan.wxapi; + + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.widget.Button; +import android.widget.Toast; + +import com.hd.wlj.duohaowan.R; +import com.hd.wlj.third.share.Constants; +import com.tencent.mm.sdk.constants.ConstantsAPI; +import com.tencent.mm.sdk.modelbase.BaseReq; +import com.tencent.mm.sdk.modelbase.BaseResp; +import com.tencent.mm.sdk.modelmsg.ShowMessageFromWX; +import com.tencent.mm.sdk.modelmsg.WXAppExtendObject; +import com.tencent.mm.sdk.modelmsg.WXMediaMessage; +import com.tencent.mm.sdk.openapi.IWXAPI; +import com.tencent.mm.sdk.openapi.IWXAPIEventHandler; +import com.tencent.mm.sdk.openapi.WXAPIFactory; +import com.wlj.base.util.UIHelper; + + +public class WXEntryActivity extends Activity implements IWXAPIEventHandler { + + private static final int TIMELINE_SUPPORTED_VERSION = 0x21020001; + + private Button gotoBtn, regBtn, launchBtn, checkBtn; + + // IWXAPI 是第三方app和微信通信的openapi接口 + private IWXAPI api; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); +// setContentView(R.layout.entry); + + // 通过WXAPIFactory工厂,获取IWXAPI的实例 + api = WXAPIFactory.createWXAPI(this, Constants.WX_APP_ID, false); + api.registerApp(Constants.WX_APP_ID); +// regBtn = (Button) findViewById(R.id.reg_btn); +// regBtn.setOnClickListener(new View.OnClickListener() { +// +// @Override +// public void onClick(View v) { +// // 将该app注册到微信 +// api.registerApp(Constants.APP_ID); +// } +// }); +// +// gotoBtn = (Button) findViewById(R.id.goto_send_btn); +// gotoBtn.setOnClickListener(new View.OnClickListener() { +// +// @Override +// public void onClick(View v) { +// startActivity(new Intent(WXEntryActivity.this, SendToWXActivity.class)); +// finish(); +// } +// }); +// +// launchBtn = (Button) findViewById(R.id.launch_wx_btn); +// launchBtn.setOnClickListener(new View.OnClickListener() { +// +// @Override +// public void onClick(View v) { +// Toast.makeText(WXEntryActivity.this, "launch result = " + api.openWXApp(), Toast.LENGTH_LONG).show(); +// } +// }); +// +// checkBtn = (Button) findViewById(R.id.check_timeline_supported_btn); +// checkBtn.setOnClickListener(new View.OnClickListener() { +// +// @Override +// public void onClick(View v) { +// int wxSdkVersion = api.getWXAppSupportAPI(); +// if (wxSdkVersion >= TIMELINE_SUPPORTED_VERSION) { +// Toast.makeText(WXEntryActivity.this, "wxSdkVersion = " + Integer.toHexString(wxSdkVersion) + "\ntimeline supported", Toast.LENGTH_LONG).show(); +// } else { +// Toast.makeText(WXEntryActivity.this, "wxSdkVersion = " + Integer.toHexString(wxSdkVersion) + "\ntimeline not supported", Toast.LENGTH_LONG).show(); +// } +// } +// }); + + api.handleIntent(getIntent(), this); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + + setIntent(intent); + api.handleIntent(intent, this); + } + + // 微信发送请求到第三方应用时,会回调到该方法 + @Override + public void onReq(BaseReq req) { + switch (req.getType()) { + case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX: + goToGetMsg(); + break; + case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX: + goToShowMsg((ShowMessageFromWX.Req) req); + break; + default: + break; + } + } + + // 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法 + @Override + public void onResp(BaseResp resp) { + int result = 0; + + switch (resp.errCode) { + case BaseResp.ErrCode.ERR_OK: + result = R.string.weibosdk_demo_toast_share_success; + break; + case BaseResp.ErrCode.ERR_USER_CANCEL: + result = R.string.weibosdk_demo_toast_share_canceled; + break; + case BaseResp.ErrCode.ERR_AUTH_DENIED: +// result = "errcode_deny"; + break; + default: + result = R.string.weibosdk_demo_toast_share_failed; + break; + } + + Toast.makeText(this, result, Toast.LENGTH_LONG).show(); + } + + private void goToGetMsg() { + UIHelper.toastMessage(this," goToGetMsg "); +// Intent intent = new Intent(this, GetFromWXActivity.class); +// intent.putExtras(getIntent()); +// startActivity(intent); +// finish(); + } + + private void goToShowMsg(ShowMessageFromWX.Req showReq) { + WXMediaMessage wxMsg = showReq.message; + WXAppExtendObject obj = (WXAppExtendObject) wxMsg.mediaObject; + + StringBuffer msg = new StringBuffer(); // 组织一个待显示的消息内容 + msg.append("description: "); + msg.append(wxMsg.description); + msg.append("\n"); + msg.append("extInfo: "); + msg.append(obj.extInfo); + msg.append("\n"); + msg.append("filePath: "); + msg.append(obj.filePath); + + UIHelper.toastMessage(this,"goToShowMsg "+msg.toString()); + +// Intent intent = new Intent(this, ShowFromWXActivity.class); +// intent.putExtra(Constants.ShowMsgActivity.STitle, wxMsg.title); +// intent.putExtra(Constants.ShowMsgActivity.SMessage, msg.toString()); +// intent.putExtra(Constants.ShowMsgActivity.BAThumbData, wxMsg.thumbData); +// startActivity(intent); + finish(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zhy/adapter/abslistview/CommonAdapter.java b/app/src/main/java/com/zhy/adapter/abslistview/CommonAdapter.java new file mode 100755 index 0000000..2608948 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/abslistview/CommonAdapter.java @@ -0,0 +1,41 @@ +package com.zhy.adapter.abslistview; + +import android.content.Context; +import android.view.View; + +import com.zhy.adapter.abslistview.base.ItemViewDelegate; + +import java.util.List; + +public abstract class CommonAdapter extends MultiItemTypeAdapter +{ + + public CommonAdapter(Context context, final int layoutId, List datas) + { + super(context, datas); + + addItemViewDelegate(new ItemViewDelegate() + { + @Override + public int getItemViewLayoutId() + { + return layoutId; + } + + @Override + public boolean isForViewType(T item, int position) + { + return true; + } + + @Override + public void convert(ViewHolder holder, T t, int position) + { + CommonAdapter.this.convert(holder, t, position); + } + }); + } + + protected abstract void convert(ViewHolder viewHolder, T item, int position); + +} diff --git a/app/src/main/java/com/zhy/adapter/abslistview/MultiItemTypeAdapter.java b/app/src/main/java/com/zhy/adapter/abslistview/MultiItemTypeAdapter.java new file mode 100755 index 0000000..1cba072 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/abslistview/MultiItemTypeAdapter.java @@ -0,0 +1,98 @@ +package com.zhy.adapter.abslistview; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; + +import com.zhy.adapter.abslistview.base.ItemViewDelegate; +import com.zhy.adapter.abslistview.base.ItemViewDelegateManager; + +import java.util.List; + +public class MultiItemTypeAdapter extends BaseAdapter { + protected Context mContext; + protected List mDatas; + + private ItemViewDelegateManager mItemViewDelegateManager; + + + public MultiItemTypeAdapter(Context context, List datas) { + this.mContext = context; + this.mDatas = datas; + mItemViewDelegateManager = new ItemViewDelegateManager(); + } + + public MultiItemTypeAdapter addItemViewDelegate(ItemViewDelegate itemViewDelegate) { + mItemViewDelegateManager.addDelegate(itemViewDelegate); + return this; + } + + private boolean useItemViewDelegateManager() { + return mItemViewDelegateManager.getItemViewDelegateCount() > 0; + } + + @Override + public int getViewTypeCount() { + if (useItemViewDelegateManager()) + return mItemViewDelegateManager.getItemViewDelegateCount(); + return super.getViewTypeCount(); + } + + @Override + public int getItemViewType(int position) { + if (useItemViewDelegateManager()) { + int viewType = mItemViewDelegateManager.getItemViewType(mDatas.get(position), position); + return viewType; + } + return super.getItemViewType(position); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ItemViewDelegate itemViewDelegate = mItemViewDelegateManager.getItemViewDelegate(mDatas.get(position), position); + int layoutId = itemViewDelegate.getItemViewLayoutId(); + ViewHolder viewHolder = null ; + if (convertView == null) + { + View itemView = LayoutInflater.from(mContext).inflate(layoutId, parent, + false); + viewHolder = new ViewHolder(mContext, itemView, parent, position); + viewHolder.mLayoutId = layoutId; + onViewHolderCreated(viewHolder,viewHolder.getConvertView()); + } else + { + viewHolder = (ViewHolder) convertView.getTag(); + viewHolder.mPosition = position; + } + + + convert(viewHolder, getItem(position), position); + return viewHolder.getConvertView(); + } + + protected void convert(ViewHolder viewHolder, T item, int position) { + mItemViewDelegateManager.convert(viewHolder, item, position); + } + + public void onViewHolderCreated(ViewHolder holder , View itemView ) + {} + + @Override + public int getCount() { + return mDatas.size(); + } + + @Override + public T getItem(int position) { + return mDatas.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + +} diff --git a/app/src/main/java/com/zhy/adapter/abslistview/ViewHolder.java b/app/src/main/java/com/zhy/adapter/abslistview/ViewHolder.java new file mode 100755 index 0000000..d8a86b0 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/abslistview/ViewHolder.java @@ -0,0 +1,290 @@ +package com.zhy.adapter.abslistview; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Paint; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.text.util.Linkify; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AlphaAnimation; +import android.widget.Checkable; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.RatingBar; +import android.widget.TextView; + +public class ViewHolder +{ + private SparseArray mViews; + protected int mPosition; + private View mConvertView; + private Context mContext; + protected int mLayoutId; + + public ViewHolder(Context context, View itemView, ViewGroup parent, int position) + { + mContext = context; + mConvertView = itemView; + mPosition = position; + mViews = new SparseArray(); + mConvertView.setTag(this); + } + + + public static ViewHolder get(Context context, View convertView, + ViewGroup parent, int layoutId, int position) + { + if (convertView == null) + { + View itemView = LayoutInflater.from(context).inflate(layoutId, parent, + false); + ViewHolder holder = new ViewHolder(context, itemView, parent, position); + holder.mLayoutId = layoutId; + return holder; + } else + { + ViewHolder holder = (ViewHolder) convertView.getTag(); + holder.mPosition = position; + return holder; + } + } + + + /** + * 通过viewId获取控件 + * + * @param viewId + * @return + */ + public T getView(int viewId) + { + View view = mViews.get(viewId); + if (view == null) + { + view = mConvertView.findViewById(viewId); + mViews.put(viewId, view); + } + return (T) view; + } + + public View getConvertView() + { + return mConvertView; + } + + public int getLayoutId() + { + return mLayoutId; + } + + public void updatePosition(int position) + { + mPosition = position; + } + + public int getItemPosition() + { + return mPosition; + } + + + /****以下为辅助方法*****/ + + /** + * 设置TextView的值 + * + * @param viewId + * @param text + * @return + */ + public ViewHolder setText(int viewId, String text) + { + TextView tv = getView(viewId); + tv.setText(text); + return this; + } + + public ViewHolder setImageResource(int viewId, int resId) + { + ImageView view = getView(viewId); + view.setImageResource(resId); + return this; + } + + public ViewHolder setImageBitmap(int viewId, Bitmap bitmap) + { + ImageView view = getView(viewId); + view.setImageBitmap(bitmap); + return this; + } + + public ViewHolder setImageDrawable(int viewId, Drawable drawable) + { + ImageView view = getView(viewId); + view.setImageDrawable(drawable); + return this; + } + + public ViewHolder setBackgroundColor(int viewId, int color) + { + View view = getView(viewId); + view.setBackgroundColor(color); + return this; + } + + public ViewHolder setBackgroundRes(int viewId, int backgroundRes) + { + View view = getView(viewId); + view.setBackgroundResource(backgroundRes); + return this; + } + + public ViewHolder setTextColor(int viewId, int textColor) + { + TextView view = getView(viewId); + view.setTextColor(textColor); + return this; + } + + public ViewHolder setTextColorRes(int viewId, int textColorRes) + { + TextView view = getView(viewId); + view.setTextColor(mContext.getResources().getColor(textColorRes)); + return this; + } + + @SuppressLint("NewApi") + public ViewHolder setAlpha(int viewId, float value) + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) + { + getView(viewId).setAlpha(value); + } else + { + // Pre-honeycomb hack to set Alpha value + AlphaAnimation alpha = new AlphaAnimation(value, value); + alpha.setDuration(0); + alpha.setFillAfter(true); + getView(viewId).startAnimation(alpha); + } + return this; + } + + public ViewHolder setVisible(int viewId, boolean visible) + { + View view = getView(viewId); + view.setVisibility(visible ? View.VISIBLE : View.GONE); + return this; + } + + public ViewHolder linkify(int viewId) + { + TextView view = getView(viewId); + Linkify.addLinks(view, Linkify.ALL); + return this; + } + + public ViewHolder setTypeface(Typeface typeface, int... viewIds) + { + for (int viewId : viewIds) + { + TextView view = getView(viewId); + view.setTypeface(typeface); + view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG); + } + return this; + } + + public ViewHolder setProgress(int viewId, int progress) + { + ProgressBar view = getView(viewId); + view.setProgress(progress); + return this; + } + + public ViewHolder setProgress(int viewId, int progress, int max) + { + ProgressBar view = getView(viewId); + view.setMax(max); + view.setProgress(progress); + return this; + } + + public ViewHolder setMax(int viewId, int max) + { + ProgressBar view = getView(viewId); + view.setMax(max); + return this; + } + + public ViewHolder setRating(int viewId, float rating) + { + RatingBar view = getView(viewId); + view.setRating(rating); + return this; + } + + public ViewHolder setRating(int viewId, float rating, int max) + { + RatingBar view = getView(viewId); + view.setMax(max); + view.setRating(rating); + return this; + } + + public ViewHolder setTag(int viewId, Object tag) + { + View view = getView(viewId); + view.setTag(tag); + return this; + } + + public ViewHolder setTag(int viewId, int key, Object tag) + { + View view = getView(viewId); + view.setTag(key, tag); + return this; + } + + public ViewHolder setChecked(int viewId, boolean checked) + { + Checkable view = (Checkable) getView(viewId); + view.setChecked(checked); + return this; + } + + /** + * 关于事件的 + */ + public ViewHolder setOnClickListener(int viewId, + View.OnClickListener listener) + { + View view = getView(viewId); + view.setOnClickListener(listener); + return this; + } + + public ViewHolder setOnTouchListener(int viewId, + View.OnTouchListener listener) + { + View view = getView(viewId); + view.setOnTouchListener(listener); + return this; + } + + public ViewHolder setOnLongClickListener(int viewId, + View.OnLongClickListener listener) + { + View view = getView(viewId); + view.setOnLongClickListener(listener); + return this; + } + + +} diff --git a/app/src/main/java/com/zhy/adapter/abslistview/base/ItemViewDelegate.java b/app/src/main/java/com/zhy/adapter/abslistview/base/ItemViewDelegate.java new file mode 100755 index 0000000..4f5ca9c --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/abslistview/base/ItemViewDelegate.java @@ -0,0 +1,22 @@ +package com.zhy.adapter.abslistview.base; + + +import android.view.View; + +import com.zhy.adapter.abslistview.ViewHolder; + +/** + * Created by zhy on 16/6/22. + */ +public interface ItemViewDelegate +{ + + public abstract int getItemViewLayoutId(); + + public abstract boolean isForViewType(T item, int position); + + public abstract void convert(ViewHolder holder, T t, int position); + + + +} diff --git a/app/src/main/java/com/zhy/adapter/abslistview/base/ItemViewDelegateManager.java b/app/src/main/java/com/zhy/adapter/abslistview/base/ItemViewDelegateManager.java new file mode 100755 index 0000000..298cccf --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/abslistview/base/ItemViewDelegateManager.java @@ -0,0 +1,133 @@ +package com.zhy.adapter.abslistview.base; + +import android.support.v4.util.SparseArrayCompat; + +import com.zhy.adapter.abslistview.ViewHolder; + + +/** + * Created by zhy on 16/6/22. + */ +public class ItemViewDelegateManager +{ + SparseArrayCompat> delegates = new SparseArrayCompat(); + + public int getItemViewDelegateCount() + { + return delegates.size(); + } + + public ItemViewDelegateManager addDelegate(ItemViewDelegate delegate) + { + int viewType = delegates.size(); + if (delegate != null) + { + delegates.put(viewType, delegate); + viewType++; + } + return this; + } + + public ItemViewDelegateManager addDelegate(int viewType, ItemViewDelegate delegate) + { + if (delegates.get(viewType) != null) + { + throw new IllegalArgumentException( + "An ItemViewDelegate is already registered for the viewType = " + + viewType + + ". Already registered ItemViewDelegate is " + + delegates.get(viewType)); + } + delegates.put(viewType, delegate); + return this; + } + + public ItemViewDelegateManager removeDelegate(ItemViewDelegate delegate) + { + if (delegate == null) + { + throw new NullPointerException("ItemViewDelegate is null"); + } + int indexToRemove = delegates.indexOfValue(delegate); + + if (indexToRemove >= 0) + { + delegates.removeAt(indexToRemove); + } + return this; + } + + public ItemViewDelegateManager removeDelegate(int itemType) + { + int indexToRemove = delegates.indexOfKey(itemType); + + if (indexToRemove >= 0) + { + delegates.removeAt(indexToRemove); + } + return this; + } + + public int getItemViewType(T item, int position) + { + int delegatesCount = delegates.size(); + for (int i = delegatesCount - 1; i >= 0; i--) + { + ItemViewDelegate delegate = delegates.valueAt(i); + if (delegate.isForViewType(item, position)) + { + return delegates.keyAt(i); + } + } + throw new IllegalArgumentException( + "No ItemViewDelegate added that matches position=" + position + " in data source"); + } + + public void convert(ViewHolder holder, T item, int position) + { + int delegatesCount = delegates.size(); + for (int i = 0; i < delegatesCount; i++) + { + ItemViewDelegate delegate = delegates.valueAt(i); + + if (delegate.isForViewType(item, position)) + { + delegate.convert(holder, item, position); + return; + } + } + throw new IllegalArgumentException( + "No ItemViewDelegateManager added that matches position=" + position + " in data source"); + } + + + public int getItemViewLayoutId(int viewType) + { + return delegates.get(viewType).getItemViewLayoutId(); + } + + public int getItemViewType(ItemViewDelegate itemViewDelegate) + { + return delegates.indexOfValue(itemViewDelegate); + } + + public ItemViewDelegate getItemViewDelegate(T item, int position) + { + int delegatesCount = delegates.size(); + for (int i = delegatesCount - 1; i >= 0; i--) + { + ItemViewDelegate delegate = delegates.valueAt(i); + if (delegate.isForViewType(item, position)) + { + return delegate; + } + } + throw new IllegalArgumentException( + "No ItemViewDelegate added that matches position=" + position + " in data source"); + } + + public int getItemViewLayoutId(T item, int position) + { + return getItemViewDelegate(item,position).getItemViewLayoutId(); + } +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/CommonAdapter.java b/app/src/main/java/com/zhy/adapter/recyclerview/CommonAdapter.java new file mode 100755 index 0000000..f5c36f1 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/CommonAdapter.java @@ -0,0 +1,55 @@ +package com.zhy.adapter.recyclerview; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; + +import com.zhy.adapter.recyclerview.base.ItemViewDelegate; +import com.zhy.adapter.recyclerview.base.ViewHolder; + +import java.util.List; + +/** + * Created by zhy on 16/4/9. + */ +public abstract class CommonAdapter extends MultiItemTypeAdapter +{ + protected Context mContext; + protected int mLayoutId; + protected List mDatas; + protected LayoutInflater mInflater; + + public CommonAdapter(final Context context, final int layoutId, List datas) + { + super(context, datas); + mContext = context; + mInflater = LayoutInflater.from(context); + mLayoutId = layoutId; + mDatas = datas; + + addItemViewDelegate(new ItemViewDelegate() + { + @Override + public int getItemViewLayoutId() + { + return layoutId; + } + + @Override + public boolean isForViewType( T item, int position) + { + return true; + } + + @Override + public void convert(ViewHolder holder, T t, int position) + { + CommonAdapter.this.convert(holder, t, position); + } + }); + } + + protected abstract void convert(ViewHolder holder, T t, int position); + + +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/MultiItemTypeAdapter.java b/app/src/main/java/com/zhy/adapter/recyclerview/MultiItemTypeAdapter.java new file mode 100755 index 0000000..84613d3 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/MultiItemTypeAdapter.java @@ -0,0 +1,124 @@ +package com.zhy.adapter.recyclerview; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.zhy.adapter.recyclerview.base.ItemViewDelegate; +import com.zhy.adapter.recyclerview.base.ItemViewDelegateManager; +import com.zhy.adapter.recyclerview.base.ViewHolder; + +import java.util.List; + +/** + * Created by zhy on 16/4/9. + */ +public class MultiItemTypeAdapter extends RecyclerView.Adapter { + protected Context mContext; + protected List mDatas; + + protected ItemViewDelegateManager mItemViewDelegateManager; + protected OnItemClickListener mOnItemClickListener; + + + public MultiItemTypeAdapter(Context context, List datas) { + mContext = context; + mDatas = datas; + mItemViewDelegateManager = new ItemViewDelegateManager(); + } + + @Override + public int getItemViewType(int position) { + if (!useItemViewDelegateManager()) return super.getItemViewType(position); + return mItemViewDelegateManager.getItemViewType(mDatas.get(position), position); + } + + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + ItemViewDelegate itemViewDelegate = mItemViewDelegateManager.getItemViewDelegate(viewType); + int layoutId = itemViewDelegate.getItemViewLayoutId(); + ViewHolder holder = ViewHolder.createViewHolder(mContext, parent, layoutId); + onViewHolderCreated(holder,holder.getConvertView()); + setListener(parent, holder, viewType); + return holder; + } + + public void onViewHolderCreated(ViewHolder holder,View itemView){ + + } + + public void convert(ViewHolder holder, T t) { + mItemViewDelegateManager.convert(holder, t, holder.getAdapterPosition()); + } + + protected boolean isEnabled(int viewType) { + return true; + } + + + protected void setListener(final ViewGroup parent, final ViewHolder viewHolder, int viewType) { + if (!isEnabled(viewType)) return; + viewHolder.getConvertView().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mOnItemClickListener != null) { + int position = viewHolder.getAdapterPosition(); + mOnItemClickListener.onItemClick(v, viewHolder , position); + } + } + }); + + viewHolder.getConvertView().setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + if (mOnItemClickListener != null) { + int position = viewHolder.getAdapterPosition(); + return mOnItemClickListener.onItemLongClick(v, viewHolder, position); + } + return false; + } + }); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + convert(holder, mDatas.get(position)); + } + + @Override + public int getItemCount() { + int itemCount = mDatas.size(); + return itemCount; + } + + + public List getDatas() { + return mDatas; + } + + public MultiItemTypeAdapter addItemViewDelegate(ItemViewDelegate itemViewDelegate) { + mItemViewDelegateManager.addDelegate(itemViewDelegate); + return this; + } + + public MultiItemTypeAdapter addItemViewDelegate(int viewType, ItemViewDelegate itemViewDelegate) { + mItemViewDelegateManager.addDelegate(viewType, itemViewDelegate); + return this; + } + + protected boolean useItemViewDelegateManager() { + return mItemViewDelegateManager.getItemViewDelegateCount() > 0; + } + + public interface OnItemClickListener { + void onItemClick(View view, RecyclerView.ViewHolder holder, int position); + + boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position); + } + + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + this.mOnItemClickListener = onItemClickListener; + } +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/base/ItemViewDelegate.java b/app/src/main/java/com/zhy/adapter/recyclerview/base/ItemViewDelegate.java new file mode 100755 index 0000000..9ba9863 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/base/ItemViewDelegate.java @@ -0,0 +1,18 @@ +package com.zhy.adapter.recyclerview.base; + + +import android.view.View; + +/** + * Created by zhy on 16/6/22. + */ +public interface ItemViewDelegate +{ + + int getItemViewLayoutId(); + + boolean isForViewType(T item, int position); + + void convert(ViewHolder holder, T t, int position); + +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/base/ItemViewDelegateManager.java b/app/src/main/java/com/zhy/adapter/recyclerview/base/ItemViewDelegateManager.java new file mode 100755 index 0000000..3c8dba8 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/base/ItemViewDelegateManager.java @@ -0,0 +1,116 @@ +package com.zhy.adapter.recyclerview.base; + +import android.support.v4.util.SparseArrayCompat; + + +/** + * Created by zhy on 16/6/22. + */ +public class ItemViewDelegateManager +{ + SparseArrayCompat> delegates = new SparseArrayCompat(); + + public int getItemViewDelegateCount() + { + return delegates.size(); + } + + public ItemViewDelegateManager addDelegate(ItemViewDelegate delegate) + { + int viewType = delegates.size(); + if (delegate != null) + { + delegates.put(viewType, delegate); + viewType++; + } + return this; + } + + public ItemViewDelegateManager addDelegate(int viewType, ItemViewDelegate delegate) + { + if (delegates.get(viewType) != null) + { + throw new IllegalArgumentException( + "An ItemViewDelegate is already registered for the viewType = " + + viewType + + ". Already registered ItemViewDelegate is " + + delegates.get(viewType)); + } + delegates.put(viewType, delegate); + return this; + } + + public ItemViewDelegateManager removeDelegate(ItemViewDelegate delegate) + { + if (delegate == null) + { + throw new NullPointerException("ItemViewDelegate is null"); + } + int indexToRemove = delegates.indexOfValue(delegate); + + if (indexToRemove >= 0) + { + delegates.removeAt(indexToRemove); + } + return this; + } + + public ItemViewDelegateManager removeDelegate(int itemType) + { + int indexToRemove = delegates.indexOfKey(itemType); + + if (indexToRemove >= 0) + { + delegates.removeAt(indexToRemove); + } + return this; + } + + public int getItemViewType(T item, int position) + { + int delegatesCount = delegates.size(); + for (int i = delegatesCount - 1; i >= 0; i--) + { + ItemViewDelegate delegate = delegates.valueAt(i); + if (delegate.isForViewType( item, position)) + { + return delegates.keyAt(i); + } + } + throw new IllegalArgumentException( + "No ItemViewDelegate added that matches position=" + position + " in data source"); + } + + public void convert(ViewHolder holder, T item, int position) + { + int delegatesCount = delegates.size(); + for (int i = 0; i < delegatesCount; i++) + { + ItemViewDelegate delegate = delegates.valueAt(i); + + if (delegate.isForViewType( item, position)) + { + delegate.convert(holder, item, position); + return; + } + } + throw new IllegalArgumentException( + "No ItemViewDelegateManager added that matches position=" + position + " in data source"); + } + + + public ItemViewDelegate getItemViewDelegate(int viewType) + { + return delegates.get(viewType); + } + + public int getItemViewLayoutId(int viewType) + { + return getItemViewDelegate(viewType).getItemViewLayoutId(); + } + + public int getItemViewType(ItemViewDelegate itemViewDelegate) + { + return delegates.indexOfValue(itemViewDelegate); + } +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/base/ViewHolder.java b/app/src/main/java/com/zhy/adapter/recyclerview/base/ViewHolder.java new file mode 100755 index 0000000..1d3ba07 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/base/ViewHolder.java @@ -0,0 +1,271 @@ +package com.zhy.adapter.recyclerview.base; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Paint; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v7.widget.RecyclerView; +import android.text.util.Linkify; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AlphaAnimation; +import android.widget.Checkable; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.RatingBar; +import android.widget.TextView; + +public class ViewHolder extends RecyclerView.ViewHolder +{ + private SparseArray mViews; + private View mConvertView; + private Context mContext; + + public ViewHolder(Context context, View itemView) + { + super(itemView); + mContext = context; + mConvertView = itemView; + mViews = new SparseArray(); + } + + + public static ViewHolder createViewHolder(Context context, View itemView) + { + ViewHolder holder = new ViewHolder(context, itemView); + return holder; + } + + public static ViewHolder createViewHolder(Context context, + ViewGroup parent, int layoutId) + { + View itemView = LayoutInflater.from(context).inflate(layoutId, parent, + false); + ViewHolder holder = new ViewHolder(context, itemView); + return holder; + } + + /** + * 通过viewId获取控件 + * + * @param viewId + * @return + */ + public T getView(int viewId) + { + View view = mViews.get(viewId); + if (view == null) + { + view = mConvertView.findViewById(viewId); + mViews.put(viewId, view); + } + return (T) view; + } + + public View getConvertView() + { + return mConvertView; + } + + + + + /****以下为辅助方法*****/ + + /** + * 设置TextView的值 + * + * @param viewId + * @param text + * @return + */ + public ViewHolder setText(int viewId, String text) + { + TextView tv = getView(viewId); + tv.setText(text); + return this; + } + + public ViewHolder setImageResource(int viewId, int resId) + { + ImageView view = getView(viewId); + view.setImageResource(resId); + return this; + } + + public ViewHolder setImageBitmap(int viewId, Bitmap bitmap) + { + ImageView view = getView(viewId); + view.setImageBitmap(bitmap); + return this; + } + + public ViewHolder setImageDrawable(int viewId, Drawable drawable) + { + ImageView view = getView(viewId); + view.setImageDrawable(drawable); + return this; + } + + public ViewHolder setBackgroundColor(int viewId, int color) + { + View view = getView(viewId); + view.setBackgroundColor(color); + return this; + } + + public ViewHolder setBackgroundRes(int viewId, int backgroundRes) + { + View view = getView(viewId); + view.setBackgroundResource(backgroundRes); + return this; + } + + public ViewHolder setTextColor(int viewId, int textColor) + { + TextView view = getView(viewId); + view.setTextColor(textColor); + return this; + } + + public ViewHolder setTextColorRes(int viewId, int textColorRes) + { + TextView view = getView(viewId); + view.setTextColor(mContext.getResources().getColor(textColorRes)); + return this; + } + + @SuppressLint("NewApi") + public ViewHolder setAlpha(int viewId, float value) + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) + { + getView(viewId).setAlpha(value); + } else + { + // Pre-honeycomb hack to set Alpha value + AlphaAnimation alpha = new AlphaAnimation(value, value); + alpha.setDuration(0); + alpha.setFillAfter(true); + getView(viewId).startAnimation(alpha); + } + return this; + } + + public ViewHolder setVisible(int viewId, boolean visible) + { + View view = getView(viewId); + view.setVisibility(visible ? View.VISIBLE : View.GONE); + return this; + } + + public ViewHolder linkify(int viewId) + { + TextView view = getView(viewId); + Linkify.addLinks(view, Linkify.ALL); + return this; + } + + public ViewHolder setTypeface(Typeface typeface, int... viewIds) + { + for (int viewId : viewIds) + { + TextView view = getView(viewId); + view.setTypeface(typeface); + view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG); + } + return this; + } + + public ViewHolder setProgress(int viewId, int progress) + { + ProgressBar view = getView(viewId); + view.setProgress(progress); + return this; + } + + public ViewHolder setProgress(int viewId, int progress, int max) + { + ProgressBar view = getView(viewId); + view.setMax(max); + view.setProgress(progress); + return this; + } + + public ViewHolder setMax(int viewId, int max) + { + ProgressBar view = getView(viewId); + view.setMax(max); + return this; + } + + public ViewHolder setRating(int viewId, float rating) + { + RatingBar view = getView(viewId); + view.setRating(rating); + return this; + } + + public ViewHolder setRating(int viewId, float rating, int max) + { + RatingBar view = getView(viewId); + view.setMax(max); + view.setRating(rating); + return this; + } + + public ViewHolder setTag(int viewId, Object tag) + { + View view = getView(viewId); + view.setTag(tag); + return this; + } + + public ViewHolder setTag(int viewId, int key, Object tag) + { + View view = getView(viewId); + view.setTag(key, tag); + return this; + } + + public ViewHolder setChecked(int viewId, boolean checked) + { + Checkable view = (Checkable) getView(viewId); + view.setChecked(checked); + return this; + } + + /** + * 关于事件的 + */ + public ViewHolder setOnClickListener(int viewId, + View.OnClickListener listener) + { + View view = getView(viewId); + view.setOnClickListener(listener); + return this; + } + + public ViewHolder setOnTouchListener(int viewId, + View.OnTouchListener listener) + { + View view = getView(viewId); + view.setOnTouchListener(listener); + return this; + } + + public ViewHolder setOnLongClickListener(int viewId, + View.OnLongClickListener listener) + { + View view = getView(viewId); + view.setOnLongClickListener(listener); + return this; + } + + +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/utils/WrapperUtils.java b/app/src/main/java/com/zhy/adapter/recyclerview/utils/WrapperUtils.java new file mode 100755 index 0000000..df453af --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/utils/WrapperUtils.java @@ -0,0 +1,53 @@ +package com.zhy.adapter.recyclerview.utils; + +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.StaggeredGridLayoutManager; +import android.view.ViewGroup; + +/** + * Created by zhy on 16/6/28. + */ +public class WrapperUtils +{ + public interface SpanSizeCallback + { + int getSpanSize(GridLayoutManager layoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position); + } + + public static void onAttachedToRecyclerView(RecyclerView.Adapter innerAdapter, RecyclerView recyclerView, final SpanSizeCallback callback) + { + innerAdapter.onAttachedToRecyclerView(recyclerView); + + RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); + if (layoutManager instanceof GridLayoutManager) + { + final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager; + final GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup(); + + gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() + { + @Override + public int getSpanSize(int position) + { + return callback.getSpanSize(gridLayoutManager, spanSizeLookup, position); + } + }); + gridLayoutManager.setSpanCount(gridLayoutManager.getSpanCount()); + } + } + + public static void setFullSpan(RecyclerView.ViewHolder holder) + { + ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); + + if (lp != null + && lp instanceof StaggeredGridLayoutManager.LayoutParams) + { + + StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp; + + p.setFullSpan(true); + } + } +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/EmptyWrapper.java b/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/EmptyWrapper.java new file mode 100755 index 0000000..2eb35b5 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/EmptyWrapper.java @@ -0,0 +1,125 @@ +package com.zhy.adapter.recyclerview.wrapper; + +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.zhy.adapter.recyclerview.base.ViewHolder; +import com.zhy.adapter.recyclerview.utils.WrapperUtils; + + +/** + * Created by zhy on 16/6/23. + */ +public class EmptyWrapper extends RecyclerView.Adapter +{ + public static final int ITEM_TYPE_EMPTY = Integer.MAX_VALUE - 1; + + private RecyclerView.Adapter mInnerAdapter; + private View mEmptyView; + private int mEmptyLayoutId; + + + public EmptyWrapper(RecyclerView.Adapter adapter) + { + mInnerAdapter = adapter; + } + + private boolean isEmpty() + { + return (mEmptyView != null || mEmptyLayoutId != 0) && mInnerAdapter.getItemCount() == 0; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) + { + if (isEmpty()) + { + ViewHolder holder; + if (mEmptyView != null) + { + holder = ViewHolder.createViewHolder(parent.getContext(), mEmptyView); + } else + { + holder = ViewHolder.createViewHolder(parent.getContext(), parent, mEmptyLayoutId); + } + return holder; + } + return mInnerAdapter.onCreateViewHolder(parent, viewType); + } + + @Override + public void onAttachedToRecyclerView(RecyclerView recyclerView) + { + WrapperUtils.onAttachedToRecyclerView(mInnerAdapter, recyclerView, new WrapperUtils.SpanSizeCallback() + { + @Override + public int getSpanSize(GridLayoutManager gridLayoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position) + { + if (isEmpty()) + { + return gridLayoutManager.getSpanCount(); + } + if (oldLookup != null) + { + return oldLookup.getSpanSize(position); + } + return 1; + } + }); + + + } + + @Override + public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) + { + mInnerAdapter.onViewAttachedToWindow(holder); + if (isEmpty()) + { + WrapperUtils.setFullSpan(holder); + } + } + + + @Override + public int getItemViewType(int position) + { + if (isEmpty()) + { + return ITEM_TYPE_EMPTY; + } + return mInnerAdapter.getItemViewType(position); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) + { + if (isEmpty()) + { + return; + } + mInnerAdapter.onBindViewHolder(holder, position); + } + + @Override + public int getItemCount() + { + if (isEmpty()) return 1; + return mInnerAdapter.getItemCount(); + } + + + + public void setEmptyView(View emptyView) + { + mEmptyView = emptyView; + } + + public void setEmptyView(int layoutId) + { + mEmptyLayoutId = layoutId; + } + +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/HeaderAndFooterWrapper.java b/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/HeaderAndFooterWrapper.java new file mode 100755 index 0000000..fa5fe7d --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/HeaderAndFooterWrapper.java @@ -0,0 +1,152 @@ +package com.zhy.adapter.recyclerview.wrapper; + +import android.support.v4.util.SparseArrayCompat; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.zhy.adapter.recyclerview.base.ViewHolder; +import com.zhy.adapter.recyclerview.utils.WrapperUtils; + + +/** + * Created by zhy on 16/6/23. + */ +public class HeaderAndFooterWrapper extends RecyclerView.Adapter +{ + private static final int BASE_ITEM_TYPE_HEADER = 100000; + private static final int BASE_ITEM_TYPE_FOOTER = 200000; + + private SparseArrayCompat mHeaderViews = new SparseArrayCompat<>(); + private SparseArrayCompat mFootViews = new SparseArrayCompat<>(); + + private RecyclerView.Adapter mInnerAdapter; + + public HeaderAndFooterWrapper(RecyclerView.Adapter adapter) + { + mInnerAdapter = adapter; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) + { + if (mHeaderViews.get(viewType) != null) + { + ViewHolder holder = ViewHolder.createViewHolder(parent.getContext(), mHeaderViews.get(viewType)); + return holder; + + } else if (mFootViews.get(viewType) != null) + { + ViewHolder holder = ViewHolder.createViewHolder(parent.getContext(), mFootViews.get(viewType)); + return holder; + } + return mInnerAdapter.onCreateViewHolder(parent, viewType); + } + + @Override + public int getItemViewType(int position) + { + if (isHeaderViewPos(position)) + { + return mHeaderViews.keyAt(position); + } else if (isFooterViewPos(position)) + { + return mFootViews.keyAt(position - getHeadersCount() - getRealItemCount()); + } + return mInnerAdapter.getItemViewType(position - getHeadersCount()); + } + + private int getRealItemCount() + { + return mInnerAdapter.getItemCount(); + } + + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) + { + if (isHeaderViewPos(position)) + { + return; + } + if (isFooterViewPos(position)) + { + return; + } + mInnerAdapter.onBindViewHolder(holder, position - getHeadersCount()); + } + + @Override + public int getItemCount() + { + return getHeadersCount() + getFootersCount() + getRealItemCount(); + } + + @Override + public void onAttachedToRecyclerView(RecyclerView recyclerView) + { + WrapperUtils.onAttachedToRecyclerView(mInnerAdapter, recyclerView, new WrapperUtils.SpanSizeCallback() + { + @Override + public int getSpanSize(GridLayoutManager layoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position) + { + int viewType = getItemViewType(position); + if (mHeaderViews.get(viewType) != null) + { + return layoutManager.getSpanCount(); + } else if (mFootViews.get(viewType) != null) + { + return layoutManager.getSpanCount(); + } + if (oldLookup != null) + return oldLookup.getSpanSize(position); + return 1; + } + }); + } + + @Override + public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) + { + mInnerAdapter.onViewAttachedToWindow(holder); + int position = holder.getLayoutPosition(); + if (isHeaderViewPos(position) || isFooterViewPos(position)) + { + WrapperUtils.setFullSpan(holder); + } + } + + private boolean isHeaderViewPos(int position) + { + return position < getHeadersCount(); + } + + private boolean isFooterViewPos(int position) + { + return position >= getHeadersCount() + getRealItemCount(); + } + + + public void addHeaderView(View view) + { + mHeaderViews.put(mHeaderViews.size() + BASE_ITEM_TYPE_HEADER, view); + } + + public void addFootView(View view) + { + mFootViews.put(mFootViews.size() + BASE_ITEM_TYPE_FOOTER, view); + } + + public int getHeadersCount() + { + return mHeaderViews.size(); + } + + public int getFootersCount() + { + return mFootViews.size(); + } + + +} diff --git a/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/LoadMoreWrapper.java b/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/LoadMoreWrapper.java new file mode 100755 index 0000000..894b8d7 --- /dev/null +++ b/app/src/main/java/com/zhy/adapter/recyclerview/wrapper/LoadMoreWrapper.java @@ -0,0 +1,162 @@ +package com.zhy.adapter.recyclerview.wrapper; + +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.StaggeredGridLayoutManager; +import android.view.View; +import android.view.ViewGroup; + +import com.zhy.adapter.recyclerview.base.ViewHolder; +import com.zhy.adapter.recyclerview.utils.WrapperUtils; + + +/** + * Created by zhy on 16/6/23. + */ +public class LoadMoreWrapper extends RecyclerView.Adapter +{ + public static final int ITEM_TYPE_LOAD_MORE = Integer.MAX_VALUE - 2; + + private RecyclerView.Adapter mInnerAdapter; + private View mLoadMoreView; + private int mLoadMoreLayoutId; + + public LoadMoreWrapper(RecyclerView.Adapter adapter) + { + mInnerAdapter = adapter; + } + + private boolean hasLoadMore() + { + return mLoadMoreView != null || mLoadMoreLayoutId != 0; + } + + + private boolean isShowLoadMore(int position) + { + return hasLoadMore() && (position >= mInnerAdapter.getItemCount()); + } + + @Override + public int getItemViewType(int position) + { + if (isShowLoadMore(position)) + { + return ITEM_TYPE_LOAD_MORE; + } + return mInnerAdapter.getItemViewType(position); + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) + { + if (viewType == ITEM_TYPE_LOAD_MORE) + { + ViewHolder holder; + if (mLoadMoreView != null) + { + holder = ViewHolder.createViewHolder(parent.getContext(), mLoadMoreView); + } else + { + holder = ViewHolder.createViewHolder(parent.getContext(), parent, mLoadMoreLayoutId); + } + return holder; + } + return mInnerAdapter.onCreateViewHolder(parent, viewType); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) + { + if (isShowLoadMore(position)) + { + if (mOnLoadMoreListener != null) + { + mOnLoadMoreListener.onLoadMoreRequested(); + } + return; + } + mInnerAdapter.onBindViewHolder(holder, position); + } + + @Override + public void onAttachedToRecyclerView(RecyclerView recyclerView) + { + WrapperUtils.onAttachedToRecyclerView(mInnerAdapter, recyclerView, new WrapperUtils.SpanSizeCallback() + { + @Override + public int getSpanSize(GridLayoutManager layoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position) + { + if (isShowLoadMore(position)) + { + return layoutManager.getSpanCount(); + } + if (oldLookup != null) + { + return oldLookup.getSpanSize(position); + } + return 1; + } + }); + } + + + @Override + public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) + { + mInnerAdapter.onViewAttachedToWindow(holder); + + if (isShowLoadMore(holder.getLayoutPosition())) + { + setFullSpan(holder); + } + } + + private void setFullSpan(RecyclerView.ViewHolder holder) + { + ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); + + if (lp != null + && lp instanceof StaggeredGridLayoutManager.LayoutParams) + { + StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp; + + p.setFullSpan(true); + } + } + + @Override + public int getItemCount() + { + return mInnerAdapter.getItemCount() + (hasLoadMore() ? 1 : 0); + } + + + public interface OnLoadMoreListener + { + void onLoadMoreRequested(); + } + + private OnLoadMoreListener mOnLoadMoreListener; + + public LoadMoreWrapper setOnLoadMoreListener(OnLoadMoreListener loadMoreListener) + { + if (loadMoreListener != null) + { + mOnLoadMoreListener = loadMoreListener; + } + return this; + } + + public LoadMoreWrapper setLoadMoreView(View loadMoreView) + { + mLoadMoreView = loadMoreView; + return this; + } + + public LoadMoreWrapper setLoadMoreView(int layoutId) + { + mLoadMoreLayoutId = layoutId; + return this; + } +} diff --git a/app/src/main/res/drawable-hdpi/icon_verify.png b/app/src/main/res/drawable-hdpi/icon_verify.png new file mode 100755 index 0000000000000000000000000000000000000000..d90c41ea80411e43f06feb66ee1b387b52df2525 GIT binary patch literal 21941 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 Xp2pSZ`oWpsZl++T-X4$Mo}Q2QKNht|w|}Z} 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/icon_artview.png b/app/src/main/res/drawable-xhdpi/icon_artview.png new file mode 100755 index 0000000000000000000000000000000000000000..428302c558010a4642fbe4f186f3a131e9db8a87 GIT binary patch literal 30620 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 aet=&-d815s<`U-Doat&AXlAHe`Th?K!nz*- literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/icon_back.png b/app/src/main/res/drawable-xhdpi/icon_back.png new file mode 100755 index 0000000000000000000000000000000000000000..6ea0e6e37fb6ab1deddf560450bf696ebc75d0d3 GIT binary patch literal 19821 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/icon_laba.png b/app/src/main/res/drawable-xhdpi/icon_laba.png new file mode 100755 index 0000000000000000000000000000000000000000..2991c9471bf65ece0bbf68952d6f48943ad43a5a GIT binary patch literal 29639 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 JO=rix{{d!s!%YAH literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/login_03.png b/app/src/main/res/drawable-xhdpi/login_03.png new file mode 100755 index 0000000000000000000000000000000000000000..20a7e58724c258814497a3912fb1bceed6ea11d2 GIT binary patch literal 19831 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 Mr6;~KarVN01K;v&(f|Me literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/logo_qq.png b/app/src/main/res/drawable-xhdpi/logo_qq.png new file mode 100755 index 0000000000000000000000000000000000000000..612bf2faabd8a479587029b6aa40e1009195c32e GIT binary patch literal 4350 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/logo_wechat.png b/app/src/main/res/drawable-xhdpi/logo_wechat.png new file mode 100755 index 0000000000000000000000000000000000000000..a4a99cd533a6d3365f967cde6eea3d30a36ed296 GIT binary patch literal 2285 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/tab_follow_nor.png b/app/src/main/res/drawable-xhdpi/tab_follow_nor.png new file mode 100755 index 0000000000000000000000000000000000000000..7003b4f5b2818fc51baa88167fb1c769bc450fe8 GIT binary patch literal 27628 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 Xr}a5?#1-McO|Z6@Z+^;j)#m>Ij8w#U literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/tab_follow_sel.png b/app/src/main/res/drawable-xhdpi/tab_follow_sel.png new file mode 100755 index 0000000000000000000000000000000000000000..76b444fa1ed6c1d55a56916a0029a4d70bf131e9 GIT binary patch literal 27543 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/tab_home_nor.png b/app/src/main/res/drawable-xhdpi/tab_home_nor.png new file mode 100755 index 0000000000000000000000000000000000000000..e6113ce3f6e1030208bbd1bc4a88fcc947148ef1 GIT binary patch literal 27655 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
0l3bRr^%_@YEE z@%o5ZC31-fBEBe*OT0cJR*769f`~6lxy0)uVwK1xB8d2+L@x3A zh*%|Zi3lRTD3MFNJ|b3$Tq1&qFG}PRuaAgTBA19D;)@cw#OotsmB=L`i1?yJF7f(^ zSS50a2qL~HkxRTjB36l9B7%r7O5_r+kBC(wmxv(ZixRoS>my>7$R#3(_@YEE@%o5Z zC31-fBEBe*OT0cJR*769f`~6lGMS01&VV0NTI8uXO<6g#m!qD*%AJ4**oTyO-zB0|03!b2DRm-|~iX zD{7?i#2YQehh@zZRk_B)To3I`q$zpLxPp|G_dq|myvZie#@2Y>%m-6mBO+BM+E|bO zJY{3HAed7^cwL&RvpW&-+Pm4sH{9fjkI$2{Z9eL)@jg%6iwfTra<|-3ksm(G_*j|} zgixc7*d2I3N?r9RhD?q*{CUFY=lH`5*i-ixr;Ic|Fv1{TF{6@~qm#ZwO3GD#Nhl)a z?k@ACd83a%Utt(1s9YQw`V#js?5Zm(ePq}!-|;Qj&0AYOIT#q}E(2Xro6_>@Uo|X@ z+uznPk#Z2VV)3f6$!cinno%KUOQ#Zoa{dbRHrO70Of77S^PO1r7Sdg0nfN0d%b%6}jIb>Wu9Y15G?)q8F40*>n6 zd|f6(EUdRspEeR)=w_Nek*er(#jSA0{vGiNyQ&|mT}pF9e173JO5aB60)BGB=pwUu z+Ow%nm0IiN#yD^kK>gc#NZq{(bi+6KrRpJ}4z`9b9>iR^p0T(3NN`iu_){fzK`+}z zE54XC596q#G06?O6S6GD!Rg)}+13~*SbaJ|?dDf0-0WhN6dSwBLr7+s-_xvbE#Pa+*~kZH%x*rrnMf{lJvO0Y$%HU})(*8gOVX^iajiM85fL>y z6|FbkI@_6O&{luh5KAoMKboV73mZLE=9UpIZ2U)EK)P=A2JLYh(}n+0!F=u_v*RW! GHvR{21Iu&( literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/tab_home_sel.png b/app/src/main/res/drawable-xhdpi/tab_home_sel.png new file mode 100755 index 0000000000000000000000000000000000000000..0e49db240086f8ad95be801d15928130bf624e4f GIT binary patch literal 27530 zcmeHQ30zFw`@d~eL?TgWl=am#OS3eiMyn=on>J;iX31!p88g$0ltk8|NLoaZ$Q~u7 z5JllFgtDeZk|`t+es@~ORrB)e{r~&?-p|aZW;*A&&-a|~_nh1a z1^__Cnrz_+zM@6HibKHXNpr$agD*;4vO6CDhK&~e$^iS~#{qz{Ez{iG!C?hQz~Qgp zaADTw<}fag!(g)L0N`Jd;N<5P)jF2+td%~})$C!@=@?cBprf0vSfuKHP<0nT*`TUs zaxE-e*>#NisCcqV!TS5kbbRn!p6og55DBo#n-jp z4!AQic$C_-owWy70tCk}BjQ8t2zzqDjoe^ab@Fq0m}+hD6;Fk00MH~C;2$J7HK$$X zBnOZMxcBv^s1?5W9-8eiZ2I&<$8AW5JDnqGSCq5=lcQm<9&gS-T0MKkJz5LB^PGnte z^^00Y9ZUG(+QDyLO&lH4Tw_!`Eo1iyTJ?2^Q}Q2LF>25z$ReT zK9ktv`N^SQS5er$CmeUw70a8U*sXQC-wMOlecds$v2v7Y*tX1C2*4m!4l0T zT1>vNyGpHo9lBY2&sU`=KNTQ-qkX>J`Jv~ES@}V4Wn{OGa4Yi#OoHCSw`mUB38;Ev z&;hLg5S7;!VKPewxD}J~5&&{ujaz&qTEphLA^=zYl4D4r$%r{99>> z_Y{wY6ZbE)_D=G3Ksaqm8;$YVH}zKBSo7i(c=G+f_Axz~tt$}qf^4NHp_43Q{)#E{ zdNs7Zu0HgG-*Ag>XInR7qj=rHGFE+daEbzOUSuFF}6muX7(#vZ$$Hqqr` z8t%kxM?c31hdc9^C0|#^ue+Z!8Sg)dsZh}AYu=KQ0KbjD6bLhY(sG9#{^e%?fQ6hH6wWv=F_Ctv*WGxa|4aVcC^FcV3h3QX2y5 zm0E7LjHrK7YSrTXA-P54wXj@Rs*Oit6mgN`StvtlQ%NNCmDgToR%z3Q7e_`FugKn6 zup+tCI(d55w6~i)Ut;|=NQ`vO1dnvgQ~F~sBZ>zTU71pla;^H(%v;f3`xx1!8FvLG zB}ICV(;ueac(a3WKi(^ma_Lb{W&8H9LzeN^=557oE!3dyCt^uws zt`E|!%NIB3HF%dVU^!?lh#MY9j4M8Wyqx@#y zn<0&akCcy7KYD+>GqGfX+QjnNg4t_$0-q9J7B{CM?`URd^o(K2|@39(( z|BNhFi}8)oaPm&wlFHs6SiHMN^KEw7xw|dNaTntrAAjV1?@5XAwYA5-*y_h=-B@zf zSZMm8snxA&RmsbQ)VS0u?<4CFOMRERFa44`$^LBow8V0xcTr`*qUX8AtCtf=#`Mp( z>*Yw-NwWI`_iws%_>#^u<4d|hG>bHR4m=i-31yo9z^q%UqVJk;x6w z3^^<3C8sSPD}QJxR$;rs#UY5{Bz3dlN-FN!yeLk-#yhPxs=;GVy?v$XHx(1q7ixV* zmQ1smR6c6Q#yg77RD(E&+idDf&MSsLw_=57X*0*iYP78#GxHDhQT^BRGn@pg1g(1I z>DBIEJacz6N2G1LFuQW)d7iIl`bw4~i~1%mD>&+X++PiC(*|GZ+O{al~x21@phvjTRG-*rLv zy{)T7`P1|}k5)Z`6Qbjz6iQ!8rI&DLt&Hvaoc zbyk>7X>x|+35OA5Z4gIh`7au`$UlpmOI~=-;2GoF>o(nC>&LFijXdR$b?WTHEPwar z=Q??o7su*ub<*(DM=f#8ruj3Q%GMUIC_c02t3#EWqszOM0gvD9a11RwbjWqvd^$BZtF~%^-Lm^@S^~T)DxS{E zyxG`5Zb)fhr?g^e zoKLTOcL10CF)(4>l494d$B$)RdNi$~JnxC$>h~i;C#uhWDvW-Ub8eRZ0cy-|R)yG$FJ&RqJ*`nA$4wzL&%=1ZyCwnIuAIKHH z+LoL!ap^>>OPSw;gs7KPpF(WJg2beR8OF_R)$5~PrqWUq6YS;~--~@5&}!2j>$PP5 zl3Y*oJBf2N1aECJm$lw_|FkY*NmCB@gHEeQ<7(FHIMx+jxutRuXbrvqcs zjCB@ZZIQNIbNUJk26|BmG@UslWg~wg2;fZ@P+-aSO9cNG zRU>p@9ft_KjCD*!4Z_@P9bo1h9vz0&$HJ*dGzx|%=%cV$JRYqFLnBcb1QLZn8Ng8l zA_hZ5B4J$*9g;Hmml2P~AUayi?P?Az8SAVN2)IN9!q3l7-_Jmw!}CO-2m}HGiAJE& zaPSB?KY%Tu_`}(J-A<5h91A+1%42c`Ob#0+!lig{d<4ciI--Vp9$mb=xjhZB`CZz9 zDkA(TTm(uViRjCTM(y$8`tVpCU87MEbQay4&KB@NKUAN7prp38J+6H==k496CtqOc z3o__Zq)$)2a{!l)aHR7&K0GSj(iiNBZeN|}3moaa;{E~@czB;c-0lmRzWdcE)p+(ed6w~jg0In+j=>O^xMog(1yoH-m8sdKvaUWS2JVWQ~?o3Vh& zrg8lEGmQ{Xm)?ofi$=Gg2ftj^MIAjS#(+ zVn=q&UZORdFQBlgbZZL|SfS5k(ujsA907-=)8J@BJPl5#VbE|7tN{g1K^hRK1Vax4 z43*j;hpnx+`%lmo9IB6K0fEq+v4+N>g77^Pi3kQ248;JAg%jvl6dZ-3Dbq+1ar4N{&nj$m#;JgbEn~&hE>~8Fc5r-@4$uui$M|$=nOoZ zfMcNGXc~qA_n?5mhKe-+ry_+$rQpHIKEPqX5z#&IYVd}kcNSAuP}rVy8VS+Oth?fW zY2*wj7!M2`iG$;*h8Q@(5QBkJFkreu!{a@u7#tFZLmG7R`~3yf$2meea$UiX!}g`~ zekc5aL6!ohvveMx#NctfVH7Tx#iUY1p%mfErgi0mJ!c@8fCCddO?K)ohVlP6OKEf- z^LHYQSTCvFGQs}GI1f0c{#vH;-^SE`=gRCnNB)?tbSGIqXE&n!7)*^UI%nrx(V7yS zV*fsw0rL^?LW3w454+RLUk#@a_aD|`7dn_wc4wHsm+*CVPRzY8bk0E2%Fb5$faz_m zTX`{o#gZ4Jo=8P>ruz$QC;_6#*6S@g(Taw{jNc{lFOY4>L%->Ozmh z>SK-!j8%UigT#q!?>sO*eE|#-m##(quR8;F^7_|iEdRP#-hbfgNI;>fp(we9By=4M zsDGG2T3^+<@vnlzY9hDSrJkzJ+ESg9RGq!C`eJbPg>cYR6BSY$bEr0c|G?tOf7{3) zX;Pb>{OVjpXQozj`gHB73@}-%+qa=6F7DOgkh+YdfvNHP@Pnj7P0GHSL%DT3(gw!2 zf0#kyWneWhLVfrT5)bwJe==)ni_HVETi6Ii%af=pmR`@Mq zeM1ZqpW66fSnZxu16xY{feaESJG!4AeV}hl^anCXoL&ZRsY}YJNe+1#ycK-kq4wKkK_7@-D6=4bao;sM^Q(8_?t{bwJun_WyAKi%%)og3 z?EV`(I`2yTc)Lx!J0hr`?$U|9S<$^i%@o{mC)!B%n>X`FmZqi_mS*PWC__AffHcFI zV(_MT@Piikx#nmBSp9c*&HCAhhru$?XbjpAPN1SGT^sQ{s8qNijfx~7=~%2G4*Oq1 zQ*bl`1DwIYpu2DGB57DO&4Yo4)6jSZ9Nd*d5cL=br(>viECYozz)=`|_w(-tPSU`L zjh{J(#o^gE^U$B^aIv4;?kMuHCnO7z_2DsG0lx=VHyH$z=}JzdyL z0SOEl9UX;Ki+PE5_!2wRa{_m@(?!&vRnVgynErH@n*|fxS;`mfki>$VI((ppJ{{fr za}+alId)DNvAyRVx7a&t!JX~krg}uruKJ(uzW3ai{3rkDW%N&?La?NbKm?Iol*%Pp zABa^d7eo-rMX6kp^?_KWazO-g-?fro!0EY5usO zP0LuLhMQdk|C_{fP5Dt16iO`%E?cK9gPB_@SY}(FRwjmzn7EC&IrQMC^~yne*8nkQ zrlw^}W2|PVecrX2EwnZMUaz)`FBH}q)sd#BxQq$=8Y%bD8a>4v{FyfEZe{L)yYa4WZh3L+>?@u6gW~M{9(q6nny+ z3YWLp$r8rg38t$1Xim=zNSYRs(WJLIOS!yhLzEB|&t9QM*ag?p6 zT2cGqD7`8dOQ!}I*Q!se(zo4!P0R^TJEu1N7<$;J@X*rhCDR_g_6WW>Uu)RvQ(u=B zs;{xqK9&Yshqt_|uHJT}y?{CV*o=<{a&Mj5;=x(dsnoZTMROG%INp4Cx@NcaB{OM0)I|OJya4gG>Qxv8O)q`V{m z08*=r^ewAXJ?ASP}W07#n9^z_WlotRuE$BD^; ztkTniu-Hs0jZOgokLq|!ce}7|S^TqZ%2XTOhi|eY>ArxXQo4AVwEa=(g8*Tdw2byu z|3FEb88fHF8ChT1c~8~^pAwzf|XJ{2^^HTK^2 zteEOEO=e+e!_mzE*1}&C_i$dYnbDQ&g+8J)jh>H#NH>&UavXmZ0N#jsdU$iQR`iOT zVgjN7>z?WYnbH?u{qoHh+5(VJ;JKnq<0O#~3!qHZs%!>OHVeqIJVTZQ!U2HpxlLCQ zI3WeJzF&nO4?Ii@dn^Y$Jo-nPIIv#?h+b^CKveqzu*urjVwq^kB_J_fTTyjfNv4R8 z{W+wes88W|!0mut$W-l3fKRmUvYP-zLln@PJN=dz#8@m5URC@&Z6nJ+&qxF)DL-^8 z^3N)@8F`2Pl6Qam=K0I{FE7!vbqR7yq^S~higA&#O4E%R#f)!H1_1ewl^4HgtO#jr zsC&^sZKSuqzk2kG^BbljetyTZF9rKV#{tr&746j<>+A1}u}VdzB>k+hMmS&s@=@)bqSW zsQ&!xhhEAw??86Ui})-N<}L-K2bh(Zo||~KoL=JnT0}Hxid~f(pzZw*x=(&mC?M^K zLV9)sKv?m|U~Lr<;8tXEEdUfW&02pvT+aBKH~{D;`Yz4VnK=34jP#NzaTn(ll*ow^ zCg^KVUQnVbtvjL4=MTvvvm$h6Tb1A*jyszrCZ9Mh=7n_5MTCY_<8ztyzAY@d37cjm zT$)u7ATds-Onf?FJ}z(?@xVjH+v0N32gWH9j8F%Ck|E83Gu9|xEn_E(rs-}DbudzT z3uVv1?q9Fn6H-$KLGJC{TVRL?_dUHv?5?P*_W9%U9Bp`Edv-f`ttr5u@jaa#$$U5HDI6vK|2j&#hCFd)LAXiOVzl^PKj&vu@@b$05k+}W^bu-rNi!H91Go@+#l#dU1SOxl?}V6{n=i zRY{BT7QWu?Sc~?M!&B3le-P7APbrU`H3>u-vL^XT^3}ScCAY$zW2pI+Id`}>ZEsXoNbaMsU*vYZD*z$A7Gh#EYxWzJ_&3HK@cuCcgPD__+L~C!WWNS?8gf?s! zp-Z`o(N!_$<{vV1?l0#q-^S*;-gKk03R;q1pf0CfNxR%^>!{#(gcJV`Etm3VNV!a; zTcn&NBXw`8%VDqbL-q2n^Q+F@=}d~f5c@de5##QYn_5@5pZsK^8mn;K;j&h{&igmr zb}zTwtc_2NO}+Fkq!G5kZG-)WPla>M&crQDxDRKP)m&Nkys&)hCLCUi(sR3641WzT zdf4mm?xK_;#b;VYO5XRqqrE5gCVX1nQ~o*lL-7mGx3V3k<2Q+16sZ>}^p*ELBjzkN zZ(Q`aV-wNi_m96Y0X7*wQ+Kk2l>Iz*7_&s~t-?o=+GEFMF_klKh{w-dtIz|#xzKp- z{b>gRD#V{jdoxo$8aLlOCm#6RkRF&fk2X76?&J0uOO_%}sJ>d0W69mZ?Ot|2z0UrV zW8s00;Iw_`m)C4Q$98i}-%PillUif*eDY4@`FiaBV9*gM!=1iBqHRyzm4{cf_SAAj z8|g7>adk0P5nNJc{o|wO&P?yG&<=gdooC3^Nx?WS0Ftbqc44r-OywW=p8~yuF z(<>frc?89V$A!lwSxC_$a#S9`a~J2DQB_pJr0P5y7&jEccHii(Q~JnxS2L6DZ(Ny_ zW07e-Mb;R0T*YJEtaToFMukRe@2WkcetGp#Y0^&FZG|CO=6P9X9_D%2cRW`tHn8$kQnIE!N<~6*uHQjh`Tc;#?m9yA0Y}HglQu$ES*mPfIW?F#G2k;aK&tKFsRawix%bthGz0 zT+*q(xae8Rwym}1O-F8Deth}Xv*;bUo#HJUN7RyBOVPo$35oHGwK_i5?F_3;C8s9Do37Bh8~xa`+qgH{*@Ick!uxDZWwN`~(mxWLM$WzYm{NUErCg(2s+W4`9SFp#a-lFQyuO{|P zeYGR!OE#s1@%+Q4l1&wt?WeX+k=UK^CH(81-7l&PZyMfHTB)=@IDXzd1u6N$x8&Pl zFH%pZPOrG(ZS&Q$g>$m;+2@y^{;aU;efVb5$DoShOwY7;?Dmssr*Nf8rSl4Iduny0 z^k&?y+1{Slp8u@0a9;G{UhOaD?<#vprKx|Jb>kbied&dD?|S!1x$3YQ0BoqFS=n*z zOpI|PCPS4#W)dl?9t;+kh5~@*3J(^6pF7fh8?PCoY$TgTdV0-BsPyRGDl?7y^sM!r(|45(x#5fO0%txC9TV z3rDFRWB^B>!XdF~EG~`d0^#8jh)h?mmZBoBq3@4xycn$S4Y_c>X$PtZ^B}Nb2vs<2 zI43gcyAR8iP4DX(nFOQIDGZ7Wmjn7ChV=s_H8J__I&5pX{RK^YYH7ofnyhXrB{T*wUHukYp&W#rPRBXopk8PSd6 zK^wu1XX$tAn^XNmtqH1*(_>QzTqfI!$)w}^r|aNl7eC6vJ*Q|;fN@t1_eW*K(Q1w9Ew0tFi-*&gNBmTu_QGr1qCNl z2?Grc0sE;TGd7rxyAbF@j^S}3gN>;n$W#=XtPX{1kjYSWGDri90^7l8P%#9Ix;lY` z=pR~;%P=rMHDyHOfb-6C$b1B6WnZwfq-^=IcECWV^#v^!fz6@t*0h%5z@q*h<-P|o zo=;zFz!6BiaEB-HCOUUs=Qbs6V>#!)wBLrw2Oi|6m|E1h>%*0~!U#s!^!mTEb8fP$U^e zg%Sy1upyzE*A6Q$F_}*5WsGFrggCFn=%M>+jqU_ul53Vu6lNZ?ry?G~E-f-v=9Dl4GF#K-rIoMubTc%(z#W(HAZ-_h9oD!f3 z8_xVgZ~D{GA>HnS;q_erOrMz_=ATXFhU<7gulme${{*k$V8)0Sfz1UkQbtE=1dK6a z)KC~zpPW{Is<^!%5TSupf9VsBz^WtK3-A{bN0t3EciDaE%jCvkLY{672`=}?~>Q-7?m@j%+>_>K%SM!eJv zM@MKF|1n~M93_)s{Ktq%|7vRtKU-IPWEg#aE6Dy0))+B_!~1U0@|_iai`eiGW5lN+ z&Ii&Eku|!dG!n=daWbX2yHiH{!Nf=)W5lV}XK!O-PJNPZtxpj6xkJO5L!%qAU%(SG z{ReOH4i_+*QzDv=oE_abj({;nW7iN8*O+s3bc{y87$ZjY{%0D_jPiqp5irJxQA1!T zm<5k=jE2V;BSwhPk@?wujCiPxj>pgLW5fg8vo&0}`_-%KpWVlZ2WoUYes=#29{qQv ze!Sf_v^zYgpYGBP`LJSOhnfz!^E=b;SF?j^bK_N^bi{ASS(x@qk~e{Q3tNW!;`ctjEjszD~fv2Y3+t-;&jB6x4r2+#x! zSxpV2Hah5mo4ar_8c8Nnkx(*HoeD(}QCMD&F;EJ)5eH30VAL=K>hS&iyMYrlFhj;q zk4a~;O_*c~{)c5fSUtF!hIoNr3^ecmULc-hVWIK0iX zyuFFwKDoY)EO^l8r#k-Q?Ra|(>8^cy2-T5r@Bu^cp1-*cHS@dL3w9l9=64nLCK5HH>iUtFJhmf)^-3Xd9p75~xZG!F{hPM-$uEamWaNTNYbeLnn#VIA#9 zavWm#=GZ@FhU`7>yT#sL3+`+OH`T+w@2dal?)&!}lmFzKK}P>1Dj$}x5k5f#7lm>O z)`!n3l#5Rg!9}55g7x9E3gzMxL~v0kmtcMPtU|f?1QA>m$|YDIKC4hJK0yQ*g>nhj zhtDdMi%$^2MWI}R_2IJ$<>C`Wa8W3iV14+kLb><^5nL3?C0HLmt57aJK?E0tatYRl z&nlFQPY}UHpO)`!n3 zl#5Rg!9}55g7x9E3gzMxL~v0kmtcMPtU|f?1QA>mD3|2m@6=OVz#pe~2Y-crL19-9 z_zU(Bl97c80C*__fR7&leEbT&HUoew8~|Qz0sveT0LU>9ZoIk@0K^up($}%_sBW!Z zcihT#MrlWdN4`_2L!08bnVsem25ZezX77SIWQE=JbJbod>6Nyt=}1|VsDXH8y>iow zC_5eLlqhL`vYe)b8$u;NQr_@bklXUcyYE@vVhSB@UB+i7#*dHfJRJSCr{c@&&f@g5 z)XkkvkLk1%@pdUMY1odO5%0}bu9M2INr|B zS;ax=Lg<++nd#ZGoQ}(?+b4A36ZY9sYYlE*+8X~nbc>yQpvd}cg+K@2%qbrTb~`2F z0k&SlCuZK<r!d+rt`PpqiDt1lLWo3D>mKjK;IvwqL2t<5W@!3d@sm{&cm z{g#zXjI#G&%Hpqz`L^zfynRvY!{i4udp1UCHXJ#j-B7!y4psb8XT87KL1U=#)&nodT?-IF4*J6)UK z89g#TMh|$X5EZKVs9o}~RIUH|-PFRnZ|inAy=%sey2OcTa;D8T*FWg` zA7eoLD(|cluPS?_o;$s+tton?O2DlfR_nvMUb*c|FL^*K-d7&$6BY2_^g1bO!MXTW zy}a?KYMlx~LrAlW5It&_ir&7zBNKZ|N`FqSe1_dQsc}zlaP1CC8Zk4Gr|&pD;@Uro zrJa*6Uh2Pl`DvSl!G!$#9hP&;Ed8aD!|&#Q-PQz7&wPkOh^o=_x6gp$pd`9Zw3R9E PKSZoDFxAi0-L&&RFXm5J literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/tab_my_sel.png b/app/src/main/res/drawable-xhdpi/tab_my_sel.png new file mode 100755 index 0000000000000000000000000000000000000000..b2a0c734bab9a705957342f570bbf210af196453 GIT binary patch literal 27523 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 bYk(@}xgnP6^uwb6&A`UW-txHliVgn(`{J2* literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/tab_seach_nor.png b/app/src/main/res/drawable-xhdpi/tab_seach_nor.png new file mode 100755 index 0000000000000000000000000000000000000000..c998fc0bb01e0a0e9158e88cd40310ed78d99cf0 GIT binary patch literal 27904 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/tab_seach_sel.png b/app/src/main/res/drawable-xhdpi/tab_seach_sel.png new file mode 100755 index 0000000000000000000000000000000000000000..a89db0edc62eef9bb58ca3889d7b595769e31f4f GIT binary patch literal 27658 zcmeHQ2{@Ep`+rbxC@oTomWk5Bn8l1SlO;3;A2ZJ|88g$&*jgl7v{(wsnh+@} zrAUcZ73rnr6|J%)2}x4a_l$L#n72Of|L^+VYv#I`Ip;q2@0{Q7oO3_-%yW!AR!dFg zWR+wA0FW~yn^?ooSpJXnAMo#K2L9>rlMI{ezy*MjEp)s~brH$#~jO~DmYO3_@u@3QL4+7wh zvGNOU?(~+9v3 z=$iH-ulr+s#>uN4sE*$N5UqFWl1irsS(0zu$?=h#Kz=z4F}Awkn$z%`0MIDq<>}2k zW6&;fngvJ#>_?h2?I84+lz9LY^uDrSVfzq=5hlAYzW`Ovwe8fb}c3TWd(>T?67$7pQ0s z%R43E<8T3MD(RCm9B>b`4<55%J>U~zq)`YUbR+@eY2)unA$!)W+;Gya=PBTGepM$?OLm-kB!1I8}B-%z%$s_L;6J740ATdqsWDxl03 zaDLIYMyp&VZl&y>o7(ny>9jAH7JJm{w(is^vLi><&vHDPgMPhF|GU;J*2{g~pJ3~^ z@=cAv#>fQ`X?Y2L9UDQW`zhbLxz+d2a07FXcXS8Ghz+ho5d%Sy!} z-|M3F0h1Yb!Ybrzw_%&6AL@_^@sI;jcUk5wy)fc@0VB`*y@cex(e@?ozyj}Pn{eRfW{N(a~3@ zUd~gL1phEuFluI=?pUKgDt)HN9-VZ^aI#GvsdU)+Gg3-%<04;;&A5uuk*j$rzj}Ke zTk((elVYz;y1YwfnBi^d@!$-S|2W6MQk5cU#fZRRDj*qm&?ga5>#wj(<>qZpqGXEE zh68KJsvnRX1!BPJ1z&>8ZzHgK+xK2J#e{A@yG-h#q}zgv$EPdpy%onT=HbSy@i`Rl zQmm9QP0!~-d~)%UH*P#&>)t?$PcddRZT}N+_5R%p*YB}cQp=x6sj|o02H`1F?FsG^ zl=EW22I-lS`+UZ~lU}=H>@|jOaImSpxxMl6S?^Rcda(VXRJHdrrp<_*wRZOC@#{j!Ge_S!Sh-Yo#;jnh*+?@Nayc29xI9t6WGp?} zT&*tH_0IE3>9anmi0}iM!DE6g4}QIKy)sjQbko1WTqb^|bz-ReVmxF}HSE|CtWiYV ziDmavVjoJM@FyKvY33T|ZiQODJ7ql1EppbqsENh}iO7UUe@4=s=&jDET3)uyGrwsI z!~YB~ad|VMwx-taqsJ(@U2=Z;WXCy^T_$gyoIELWGAhD6Y50Tih}$;kzp%;?PKU=F zX05QF_i5gi2?y@Vhmpc;!@R?4PS~vAt}uAybz-E=$rWQxuC?8ov}naStJf(q4=0{{ zlrnY2r4;Q`Mb;kHL00#dtxLGFuEX~WMegjbor~gjkrQkvnYShf%$Rr!3pLprJ?7X- z)oHjKws2f^w(Xs{`|z*I?x@Y?%Z<4wXsNUVw3zCR_asK&N`Ki%d=kC5XhxA-(PpF+ z(g2zMctaX3%{z@ywyEq&nPWYteqw!HS%VupWiL${g}|A__pD3L-BM18YitCJeh&fp)?i-Q{K27re_s5?s#>4 zT!C};fg8>V#byb!v((=2c6yEXRMe-XvZgqu;+{iKU35W5I<`FVM&ixND|7FKx;YE3Ay&HCi}>HgHhDe_Yv&*#nG!r{3Ux-;09>k?n#uBY5cxn67Mr0jH* z8`F$eOj;6LARq1?uDIMad2cfF$fkm@Dy8??CFdWsBt%_`dYbmc_2IKZy_;K4eznky zQogh1x?Y3f$HrFsij9S@W0IqiuQdnPpw_ytby)i~XPV`?XtmhKXxH22H&(sODcHQ8 zq^}2kDXNvyzojpEWYdw|SCX!%ywJO%>iyU|!h1w}?AQ5U3Oa&5=f3j#FtKUr@bwZ` zC8{KHwkvHvC*>kFeOSb>V9{q$l?ii zrDGT%(JI?*^Ay9@rLt3xpZa`eQC4+@-O_cBwzPP; zmX$qUoO!ptj$D^m$4qT?$UVI{XM^FRKX*0Cr71TBR4K1>UHqJPbkl~Gz;+BsOvWtz2nWNX#R_Pn^I+>ar8?)3v?_tDKuU7N+ z2$wa>*5o)D-;Xs=<+C!Er0Jc~GxcV7yds}o#j1l^ z3+nB3Pw_rl)Xgt$c(CouhP+4Izdrw^x#oyhPQ$Ht%9%{HXH&9fWw(5G|5UH&A^YC^ z>6%SJo~PTdly$rv@ny{0Z5iLvp*+`@pV#NDzkl6fOv7lI-Lc<7zdzXhs>HO=^pWZ! z)qtRw>C=_vlyW{$i$Y!{pG_Wr|E{;~cdt6`$(k1(6>92FO>Y`KP_AJYqorAN44%~ z{yMAVh!y~>EvDPp^Xx6mNfef=CP-yDLYkhgY&Z=C09^x5Hb`-ScnC+xiO$qhX}FZD zf}m6NRP68;XbZM62C!6P}BniXp#4guR6o!kEQ@5O_^Il7hx!5Cozo29GBYuo?&~8iPZjF(`}{ z5aR@ z3X4U;Es$IwwYem%Lo zh3+teZbka_0eO%S!H!c?*DawG_gzfHx5p zCgu@7;{Loeyhef5+ynYF#ucZJ6l|rJiIIbX1pY94eK`1uUNf*^u zDbTWW^^(k(Tpq}zKxQWTaD^tFP9@PG8lDJI&`3NDgGCakI1ouh6R}7w3>8n+Ay6qa zZCs}u78Zi;KS7(YC~o`>1VeYl8Y+td!}l&El9mpdh#{hBNFszsBQY3A8wt|1@klCx zNYSD}I5d?8_H-lw_ESfe95@|kf((H+d@fYDGkDB29G*%*qIIZLJ{Jf{#KHY&>(I18 zZ2|$LV7jIj=F$($PhFAeTzK7i39LtWRdxou<_UIZa4bR)A?%>bm0rQ58Q``GsG0NQM#Zy zTMZ1tWzl#ZAO|vZf>+3|?BOodAKirEby57w1B3p5FcDnPeQ?u&$DxT@5RHH&YSS=C zEEPvXI)ZSpq2RUPr3g|fAOT+NgPaC!61F#94c#>KtzwEZ$aI3J`ludeJr(~;GY3+r zXh#r^As|tQf+XnRaB!GHJ0b~=I0zzwR4oD(>f!hM8>pXagm~tW9qMED*tUv{dexnu509v*-B56^>cQ^&yV5M$fRp^F5>Sg{w4PBlNmT4 zf!}D51ma;&diks2RLK2@z1WQoCzL%I=IePfc z=YzU3wW{>=>N6Q|vQ`thqbe%uP15$7jJUz6@%!*Yq(fC=WYw{pn!uF7@f{duhdcHFEXg~V?R*?N0tRZ5EMt9z#6}l??7P0;zhKNsf zv=5^C(3!z)rGY?(h|^NY!vh-Z2NMH<3=yZ-K6`88GO7}`zxLS&f9_CyE^Kg9_6vAo zrvKnA-u?ncZPKCIqvr=Vj{{%~(cD!BN7rP;5023Q7(>LUYUjD?bA$X~VE~LFVpQ#a z0M3F3IY<3t3=t#D;K=;!K14jU2FK%P_aWke9UPCJ-G_(=eDGr_68!A`8$7!1 zO8t1dO>j7TsGsiA34B=5b3)A!K5@rCNcNjI^Yj-Q8k#ILGB(EO5Qs#yk+va@U`T-f z(1NhY7)yk!|L(5Y00;4Kcp4Uq!|EW36fD?%5YLf9LF!N`Xd)WI<8`$0|0Oi2P1VxU z)*2ji&&^#l6_2Gl(y&M>mOw+|9C1Ych_#UrjzWMBD{5;s5S-6*LRGI*4`^Gz+`-d9Gm6dHQh3 z=p3j}wSX7@gfFR6z2)$!c8E_+xJtOS72OkJ*qhMdlcik#2}wN6snbW;(66JzK#l^2 zZpW@ABXIV-^A>woEqt;aK2(qDJyrkH-S^%blmFz4K1Tl}st}gA6CpuF7sYak)^%1g)I+!iPlHRDwaz~ z5Ya`kT%z?6vWn#r5=3-SESG3~gsft@gai>?6w4)AA0ew)E+Iig7sYak)D_tZm7_{-@%;BTSdql>MDzrh|s zAzNDjz@}LM;Nu4XZQtQ%xZVv70B_d=0O>FQD6$T&ySWGeBv+c57}|K2y?e66zi8Q{ z{HFV>(W4?}Zn#^C9GOH@y>adQ#yyS`lae$v!fx*km76uPe9yIO*EHtL%3Q5Bf4tgA zMktkbmc6Pl%O(CV$D)Tbb6T5^Ecw1JC#S_7{y$2Y&8v%=qfaojUFIDxQ&=W@&^Hk= zm)!Yu{2l=jaz`QCc0y#j(!OFJgGo2kb&a+Wqw4GG)Tbr__zJ|Q^~++@Q5(nAG(z!* zZKp1+kPDm$NEEP@q;#yz9%#B9o%QA>rf?4EEk)X>*nDeb;&8oJmsY!ucEPL3mF!?@ z9FOxt$<1DVM1d@)Ndb4fdE%>Ow*6gxq<_kK)Jlq9;i$l=tCAi4GEA{4+s@0MboAxT z^elG{8gA|9CgaQ4JG{h(>8xRW?^tD~ks5BXt=o)dyD5pxDa@*K6rU~1BZ99^LP*IN zk9y@YD!BFYVFZ~~sLMea2A5+Dv*mq12e`n`O)3(>Cq0$N&)j$Yzzpv&E(WRQ_dI{6 zKf=_g;|O`Dr?jOC(bMVRvG(^!d7^9AuM2#^n^=+QuZ~pC0 zrgQSu26?j4(k{BA(S$R2v*2{)mCVF6uFQ1K{`&kUR>Ln;czy2RmTs|}lX9A}IbAvB zZmaGZlZNmE-&kr7(Fp;WmYx9~Ue!f1OLHe)FAa#IjHrCuVXKt5`q7AWPsXk%-J*S2 zjTm3=@M^yMu#lKQ^;gvRujEl3c}47HF|@?FrI^Wvi@-AWY@9*%8E>rb{^vPmzSr$2 z%u`p-t6kWYKC;>Pqq^P(i;2fhXU`?i?3fA|CUQ*j0>b9<|EYr6!lfpsjMn@92k;Qf A=>Px# literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_backspace_black_24dp.xml b/app/src/main/res/drawable/ic_backspace_black_24dp.xml new file mode 100644 index 0000000..db4def9 --- /dev/null +++ b/app/src/main/res/drawable/ic_backspace_black_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/shape_hui1_white.xml b/app/src/main/res/drawable/shape_hui1_white.xml new file mode 100755 index 0000000..cc465de --- /dev/null +++ b/app/src/main/res/drawable/shape_hui1_white.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_hui_white.xml b/app/src/main/res/drawable/shape_hui_white.xml new file mode 100755 index 0000000..0ec1fe0 --- /dev/null +++ b/app/src/main/res/drawable/shape_hui_white.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_follow_select.xml b/app/src/main/res/drawable/tab_follow_select.xml new file mode 100755 index 0000000..1bacafe --- /dev/null +++ b/app/src/main/res/drawable/tab_follow_select.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_home_select.xml b/app/src/main/res/drawable/tab_home_select.xml new file mode 100755 index 0000000..b21941e --- /dev/null +++ b/app/src/main/res/drawable/tab_home_select.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_my_select.xml b/app/src/main/res/drawable/tab_my_select.xml new file mode 100755 index 0000000..a4ed5a9 --- /dev/null +++ b/app/src/main/res/drawable/tab_my_select.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_seach_select.xml b/app/src/main/res/drawable/tab_seach_select.xml new file mode 100755 index 0000000..4a273ca --- /dev/null +++ b/app/src/main/res/drawable/tab_seach_select.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..a6b98fc --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + +