diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 9a8b7e5..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf3..0000000 --- a/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 97626ba..0000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index d35a3ac..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 95f0f03..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 4749aa3..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 46f55df..e7dcc27 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -More, please visit:[My CSDN](http://blog.csdn.net/liaoinstan/article/details/51023907)     apk demo:[download](https://github.com/liaoinstan/SpringView/blob/master/apk/demo-release.apk?raw=true)     中文文档:[中文文档](https://github.com/liaoinstan/SpringView/blob/master/README_CN.md) +More, please visit:[My CSDN](http://blog.csdn.net/liaoinstan/article/details/51023907)     apk demo:[download](https://github.com/liaoinstan/SpringView/blob/master/apk/DemoSpring-1.7.0-release.apk?raw=true)     中文文档:[中文文档](https://github.com/liaoinstan/SpringView/blob/master/README_CN.md) SpringView ===== @@ -21,7 +21,12 @@ SpringView ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/1459212323072_s.gif) ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/1459212372609_s.gif) ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/1459212462800_s.gif) ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/1459212485237_s.gif) ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/1459212517801_s.gif) ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/1459212658972_s.gif) -![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/1459212769245_s.gif) +![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/1459212769245_s.gif) + +**📌new:** + +![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/weixin_header_s.gif) ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/weixin_header_v2_s.gif) +![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/auto_footer_s.gif) ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/du_header_s.gif) **How to use SpringView** -------- @@ -35,7 +40,7 @@ Add Spring View in the layout file, note that Spring View and ScrollView have th app:header="@layout/myheader" app:footer="@layout/myfooter"> - @@ -68,7 +73,17 @@ springView.setListener(new SpringView.OnFreshListener() { use Gradle: ``` dependencies { - compile 'com.liaoinstan.springview:library:1.3.2' + + //SpringView core library (only include DefaultHeader/Footer) + implementation 'com.liaoinstan.springview:library:1.7.0' + + //other Headers/Footers, choose one or more that you like + implementation 'com.liaoinstan.springview:AcfunHeader:1.7.0' //AcFun style (header and footer) + implementation 'com.liaoinstan.springview:AliHeader:1.7.0' //Alitrip style (header and footer) + implementation 'com.liaoinstan.springview:MeituanHeader:1.7.0' //Meituan style (header and footer) + implementation 'com.liaoinstan.springview:RotationHeader:1.7.0' //Mechanical gear style (header and footer) + implementation 'com.liaoinstan.springview:WeixinHeader:1.7.0' //WeChat Mini Program header(only header) + implementation 'com.liaoinstan.springview:DuHeader:1.7.0' //Du app header(only header) } ``` or Maven: @@ -76,7 +91,7 @@ or Maven: com.liaoinstan.springview library - 1.3.2 + 1.7.0 pom ``` @@ -84,37 +99,61 @@ or Maven: **Update log** -------- -####**v1.3.2** - - fix the bug of the linkage damping of AppBarLayout in the case of null data, +### **v1.7.0** +- Add new a header (DuHeader), and a auto-scrolling Footer (AutoFooter). +- Add a new type SCROLL. Based on this mode, effects such as scrolling to the bottom and automatic loading can be achieved. +- Header / Footer now has setType () method, you can set different Type for Header and Footer respectively. +- Fix issus. + +### **v1.6.0** +- Add a new header (WeixinHeaderV2) for new version of WeChat (WeChat 7). +- The movement parameter of SpringView (MovePara) no longer affects both Header and Footer. BaseHeader/Footer now has a new getMovePara() interface that allows you to set different movement parameters for Header and Footer to match different drag-and-drop feel.(if you don't implement the interface, SpringView is still compatible with the previous rules). +- Update to Android X. +- Fixed several drag and drop stickiness issues, and callFresh method callback issues. + +### **v1.5.1** + - Fix bug when nested layout, fix bug callFresh() can't spring back when set SpringView Give.NONE. + +### **v1.5.0** + - headers /footers split off from SpringView library(except DefaultHeader/Footer),simplified core library,now core library's size only **26KB**,You can import headers/footers separately + +### **v1.4.0** + - New function setMovePara(),a new header for weixin:WeixinHeader,a new type DRAG like SwipeRefreshLayout:spring.setType(Type.DRAG) + +### **v1.3.3** + - Optimize several experiential issues,Added onFinishFreshAndLoadDelay(int delay), callFreshDelay(int delay) method,Optimizing performance with BottomSheetBehavior,Optimize the performance used in BottomSheetDialog + +### **v1.3.2** + - Fix the bug of the linkage damping of AppBarLayout in the case of null data, new setEnableFooter(Boolean), setEnableHeader(Boolean) disable or enable header/footer. -####**v1.3.0** - - support AppBarLayout,fix sliding conflict +### **v1.3.0** + - Support AppBarLayout,fix sliding conflict -####**v1.2.7** - - bug fix +### **v1.2.7** + - Bug fix -####**v1.2.6** - - padding bug fix +### **v1.2.6** + - Padding bug fix -####**v1.2.5** - - add **setEnable(boolean)** function +### **v1.2.5** + - Add **setEnable(boolean)** function -####**v1.2.4** +### **v1.2.4** - - add **callFresh()** method, used to call the refresh operation manual - - fixes the lateral sliding conflict + - Add **callFresh()** method, used to call the refresh operation manual + - Fixes the lateral sliding conflict -####**v1.2.2** - - repair the callback refresh many times +### **v1.2.2** + - Repair the callback refresh many times -####**v1.2.1** - - repair the click event occasional failure problem +### **v1.2.1** + - Repair the click event occasional failure problem **Feedback** -------- -If there are any questions or Suggestions, please feedback to my email: liaoinstan@outlook.com +If there are any questions or Suggestions, please feedback to my email: liaoinstan@outlook.com; Or in my blog If it works to you, please give me a star for my hardwork ,thank you diff --git a/README_CN.md b/README_CN.md index f8b00c8..e1354fb 100644 --- a/README_CN.md +++ b/README_CN.md @@ -1,4 +1,4 @@ -更多请移步至:[我的CSDN博客](http://blog.csdn.net/liaoinstan/article/details/51023907)     apk演示:[点击下载](https://github.com/liaoinstan/SpringView/blob/master/apk/demo-release.apk?raw=true)     English document:[English document](https://github.com/liaoinstan/SpringView/blob/master/README.md) +更多请移步至:[我的CSDN博客](http://blog.csdn.net/liaoinstan/article/details/51023907)     apk演示:[点击下载](https://github.com/liaoinstan/SpringView/blob/master/apk/DemoSpring-1.7.0-release.apk?raw=true)     English document:[English document](https://github.com/liaoinstan/SpringView/blob/master/README.md) SpringView ===== @@ -23,6 +23,11 @@ SpringView ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/1459212517801.gif) ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/1459212658972.gif) ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/1459212769245.gif) +**📌新增:** + +![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/weixin_header.gif) ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/weixin_header_v2.gif) +![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/auto_footer.gif) ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/du_header.gif) + **如何使用 SpringView** -------- @@ -35,7 +40,7 @@ SpringView app:header="@layout/myheader" app:footer="@layout/myfooter"> -             @@ -68,7 +73,17 @@ springView.setListener(new SpringView.OnFreshListener() { 使用 Gradle: ``` dependencies { - compile 'com.liaoinstan.springview:library:1.3.2' + + //SpringView核心库 (只包含DefaultHeader/Footer) + implementation 'com.liaoinstan.springview:library:1.7.0' + + //以下是各个风格的Header/Footer,选择自己喜欢的引入 + implementation 'com.liaoinstan.springview:AcfunHeader:1.7.0' //AcFun风格 (header and footer) + implementation 'com.liaoinstan.springview:AliHeader:1.7.0' //阿里旅行风格 (header and footer) + implementation 'com.liaoinstan.springview:MeituanHeader:1.7.0' //美团风格 (header and footer) + implementation 'com.liaoinstan.springview:RotationHeader:1.7.0' //齿轮机械风格 (header and footer) + implementation 'com.liaoinstan.springview:WeixinHeader:1.7.0' //微信小程序header(只有header) + implementation 'com.liaoinstan.springview:DuHeader:1.7.0' //'毒'App header(只有header) } ``` 或者 Maven: @@ -76,7 +91,7 @@ dependencies { com.liaoinstan.springview library - 1.3.2 + 1.7.0 pom ``` @@ -84,30 +99,53 @@ dependencies { **更新日志** -------- -####**v1.3.2** +#### **v1.7.0** + - 新增一个仿毒app的header (DuHeader),和一个自动滚动的Footer (AutoFooter) + - 新增SCROLL模式,基于这种模式可以实现滚动到底部自动加载等效果 + - Header/Footer现在新增了setType()方法,你可以分别给Header和Footer设置不同的Type + - 修复一些Bug + +#### **v1.6.0** + - 新增了仿新版微信(微信7)小程序效果的header (WeixinHeaderV2) + - SpringView的移动参数(MovePara)不再同时影响Header和Footer了,BaseHeader/Footer新增了getMovePara()接口,你可以分别为header和footer设置不同的移动参数以匹配不同的拖拽手感。(如果你没有实现该接口,SpringView仍然兼容以前的规则) + - 依赖更新到Android X + - 修复几个拖拽粘滞的问题,和callFresh方法回调的问题 +#### **v1.5.1** + - 修复在SpringView内部嵌套布局无法滚动的bug,修复给SpringView设置Give.NONE熟悉时调用callFresh()无法正确回弹的问题。 + +#### **v1.5.0** + - 把所有的header和footer单独从SpringView库中分离出来了(除DefaultHeader/Footer),现在可以只选择单独导入自己想要的headers/footers,彻底精简后的SpringView library只有**26KB**,后期新增的header/footer都将以独立库的形式发布,不再冗余到SpringView核心库里,库链接参见上述[获取SpringView]内容 + +#### **v1.4.0** + - 新增setMovePara()方法用于设置拖拽时的阻尼系数,新增了一个WeixinHeader仿微信小程序header,新增新的模式:DRAG(拖拽模式),可以实现类似于SwipeRefreshLayout的交互效果,重新设计了overLap模式的实现方式,更加稳定,弃用了support过时api,优化拖拽流畅性和交互效果细节 + +#### **v1.3.3** + - 优化几个体验性问题,新增onFinishFreshAndLoadDelay(int delay),callFreshDelay(int delay)方法,优化和BottomSheetBehavior联用的表现,优化在BottomSheetDialog中使用的表现 + +#### **v1.3.2** - 修复空数据情况下和AppBarLayout联动阻尼的bug,新增setEnableFooter(boolean),setEnableHeader(boolean)禁用或启用header/footer -####**v1.3.0** +#### **v1.3.0** - 支持和 AppBarLayout 联动,修复滚动冲突的问题 -####**v1.2.7** +#### **v1.2.7** - 修复一些bug -####**v1.2.6** +#### **v1.2.6** - 修复了内边距的失效的问题 -####**v1.2.5** +#### **v1.2.5** - 新增 **setEnable(boolean)** 方法,用于禁用/启用SpringView -####**v1.2.4** +#### **v1.2.4** - 新增 **callFresh()** 方法, 用于手动调用刷新 - 修复了内置水平滑动控件的事件冲突 -####**v1.2.2** +#### **v1.2.2** - 修复了会多次回调刷新的问题 -####**v1.2.1** +#### **v1.2.1** - 修复点击事件偶尔失效的问题 diff --git a/apk/DemoSpring-1.7.0-release.apk b/apk/DemoSpring-1.7.0-release.apk new file mode 100644 index 0000000..14a34ec Binary files /dev/null and b/apk/DemoSpring-1.7.0-release.apk differ diff --git a/apk/demo-debug.apk b/apk/demo-debug.apk deleted file mode 100644 index 6f6f9b9..0000000 Binary files a/apk/demo-debug.apk and /dev/null differ diff --git a/apk/demo-release.apk b/apk/demo-release.apk deleted file mode 100644 index 19262e1..0000000 Binary files a/apk/demo-release.apk and /dev/null differ diff --git a/build.gradle b/build.gradle index a923934..e46d921 100644 --- a/build.gradle +++ b/build.gradle @@ -1,39 +1,41 @@ buildscript { repositories { + google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.3' - classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.1' - classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + classpath 'com.android.tools.build:gradle:3.5.3' + classpath 'com.novoda:bintray-release:0.9.1' } } allprojects { repositories { + google() jcenter() } tasks.withType(Javadoc) { options.addStringOption('Xdoclint:none', '-quiet') options.addStringOption('encoding', 'UTF-8') } -// tasks.withType(Javadoc) { -// options { -// encoding "UTF-8" -// charSet 'UTF-8' -// links "http://docs.oracle.com/javase/7/docs/api" -// } -// options.addStringOption('Xdoclint:none', '-quiet') -// } } task clean(type: Delete) { delete rootProject.buildDir } ext { - buildToolsVersion = '25.0.2' - compileSdkVersion = 25 + compileSdkVersion = 29 minSdkVersion = 16 - targetSdkVersion = 25 - supportLibraryVersion = '25.3.1' -} \ No newline at end of file + targetSdkVersion = 27 + supportLibraryVersion = '1.1.0' + materialLibraryVersion = '1.2.0-alpha02' + + userOrg = 'liaoinstan' + repoName = "maven" + groupId = 'com.liaoinstan.springview' + desc = 'SpringView For Android' + website = 'https://github.com/liaoinstan/SpringView' + licences = ['Apache-2.0'] +} + +//gradlew clean build bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY \ No newline at end of file diff --git a/demo/build.gradle b/demo/build.gradle index 9cddc0c..1f4b07e 100644 --- a/demo/build.gradle +++ b/demo/build.gradle @@ -1,35 +1,61 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 25 - buildToolsVersion "25.0.2" - + compileSdkVersion rootProject.ext.compileSdkVersion + compileOptions { + targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_1_8 + } defaultConfig { applicationId "com.liaoinstan.demospring" - minSdkVersion 14 - targetSdkVersion 25 - versionCode 1 - versionName "1.0" + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 17 + versionName "1.7.0" } buildTypes { release { + minifyEnabled true //开启代码混淆 + zipAlignEnabled true //是否zip对齐优化 + shrinkResources true //移除无用的资源文件 + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + android.applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "DemoSpring-${defaultConfig.versionName}-${variant.buildType.name}.apk" + } + } } + tasks.withType(JavaCompile) { options.encoding = "UTF-8" } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:25.3.1' - compile 'com.android.support:design:25.3.1' + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "androidx.appcompat:appcompat:$supportLibraryVersion" + implementation "com.google.android.material:material:$materialLibraryVersion" + +// implementation 'com.liaoinstan.springview:library:1.7.0' +// implementation 'com.liaoinstan.springview:AcfunHeader:1.7.0' +// implementation 'com.liaoinstan.springview:AliHeader:1.7.0' +// implementation 'com.liaoinstan.springview:MeituanHeader:1.7.0' +// implementation 'com.liaoinstan.springview:RotationHeader:1.7.0' +// implementation 'com.liaoinstan.springview:WeixinHeader:1.7.0' +// implementation 'com.liaoinstan.springview:DuHeader:1.7.0' -// compile 'com.liaoinstan.springview:library:1.3.0' - compile project(':library') + implementation project(':library') + implementation project(':header_ali') + implementation project(':header_meituan') + implementation project(':header_rotation') + implementation project(':header_acfun') + implementation project(':header_weixin') + implementation project(':header_du') - //recycleView header - compile 'com.bartoszlipinski:recyclerviewheader2:2.0.1' + implementation project(':header_wangyi') } diff --git a/demo/liaoinstan.jks b/demo/liaoinstan.jks new file mode 100644 index 0000000..ac5fa3e Binary files /dev/null and b/demo/liaoinstan.jks differ diff --git a/demo/src/main/AndroidManifest.xml b/demo/src/main/AndroidManifest.xml index 7c9e7dc..9a26faa 100644 --- a/demo/src/main/AndroidManifest.xml +++ b/demo/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ @@ -9,62 +10,34 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" - android:theme="@style/AppTheme"> + android:theme="@style/AppTheme.NoActionBar" + tools:ignore="GoogleAppIndexingWarning"> + android:label="@string/app_name"> - - - - - - - - - - - - + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demo/src/main/java/com/liaoinstan/demospring/MainActivity.java b/demo/src/main/java/com/liaoinstan/demospring/MainActivity.java index 0162cf7..f2a6f37 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/MainActivity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/MainActivity.java @@ -2,10 +2,16 @@ import android.content.Intent; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.view.View; +import androidx.appcompat.app.AppCompatActivity; + import com.liaoinstan.demospring.demo1.Demo1Activity; +import com.liaoinstan.demospring.demo10.Demo10Activity; +import com.liaoinstan.demospring.demo11.Demo11Activity; +import com.liaoinstan.demospring.demo12.Demo12Activity; +import com.liaoinstan.demospring.demo13.Demo13Activity; +import com.liaoinstan.demospring.demo14.Demo14Activity; import com.liaoinstan.demospring.demo2.Demo2Activity; import com.liaoinstan.demospring.demo3.Demo3Activity; import com.liaoinstan.demospring.demo4.Demo4Activity; @@ -14,29 +20,17 @@ import com.liaoinstan.demospring.demo7.Demo7Activity; import com.liaoinstan.demospring.demo8.Demo8Activity; import com.liaoinstan.demospring.demo9.Demo9Activity; +import com.liaoinstan.demospring.demox.DemoXActivity; import com.liaoinstan.demospring.test.TestActivity; import com.liaoinstan.demospring.warning.WarningActivity; -public class MainActivity extends AppCompatActivity implements View.OnClickListener { +public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - - findViewById(R.id.demo1).setOnClickListener(this); - findViewById(R.id.demo2).setOnClickListener(this); - findViewById(R.id.demo3).setOnClickListener(this); - findViewById(R.id.demo4).setOnClickListener(this); - findViewById(R.id.demo5).setOnClickListener(this); - findViewById(R.id.demo6).setOnClickListener(this); - findViewById(R.id.demo7).setOnClickListener(this); - findViewById(R.id.demo8).setOnClickListener(this); - findViewById(R.id.demo9).setOnClickListener(this); - findViewById(R.id.warning).setOnClickListener(this); - findViewById(R.id.test).setOnClickListener(this); } - @Override public void onClick(View v) { Intent intent = new Intent(); switch (v.getId()) { @@ -76,6 +70,30 @@ public void onClick(View v) { intent.setClass(this, Demo9Activity.class); startActivity(intent); break; + case R.id.demo10: + intent.setClass(this, Demo10Activity.class); + startActivity(intent); + break; + case R.id.demo11: + intent.setClass(this, Demo11Activity.class); + startActivity(intent); + break; + case R.id.demo12: + intent.setClass(this, Demo12Activity.class); + startActivity(intent); + break; + case R.id.demo13: + intent.setClass(this, Demo13Activity.class); + startActivity(intent); + break; + case R.id.demo14: + intent.setClass(this, Demo14Activity.class); + startActivity(intent); + break; + case R.id.demox: + intent.setClass(this, DemoXActivity.class); + startActivity(intent); + break; case R.id.warning: intent.setClass(this, WarningActivity.class); startActivity(intent); diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo1/Demo1Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo1/Demo1Activity.java index f804a4b..a0e4e74 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo1/Demo1Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo1/Demo1Activity.java @@ -2,8 +2,8 @@ import android.os.Bundle; import android.os.Handler; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import com.liaoinstan.demospring.R; import com.liaoinstan.springview.container.DefaultFooter; @@ -19,30 +19,20 @@ public class Demo1Activity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo1); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - springView = (SpringView) findViewById(R.id.springview); + springView = findViewById(R.id.springview); springView.setType(SpringView.Type.FOLLOW); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } @Override public void onLoadmore() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } }); springView.setHeader(new DefaultHeader(this)); diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo10/Demo10Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo10/Demo10Activity.java new file mode 100644 index 0000000..b31bd19 --- /dev/null +++ b/demo/src/main/java/com/liaoinstan/demospring/demo10/Demo10Activity.java @@ -0,0 +1,48 @@ +package com.liaoinstan.demospring.demo10; + +import android.os.Bundle; +import android.os.Handler; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + +import com.liaoinstan.demospring.R; +import com.liaoinstan.springview.meituanheader.MeituanFooter; +import com.liaoinstan.springview.meituanheader.MeituanHeader; +import com.liaoinstan.springview.widget.SpringView; + +public class Demo10Activity extends AppCompatActivity { + + private SpringView springView; + + //下拉过程动画 + private int[] pullAnimSrcs = new int[]{R.drawable.mt_pull, R.drawable.mt_pull01, R.drawable.mt_pull02, R.drawable.mt_pull03, R.drawable.mt_pull04, R.drawable.mt_pull05}; + //刷新中动画 + private int[] refreshAnimSrcs = new int[]{R.drawable.mt_refreshing01, R.drawable.mt_refreshing02, R.drawable.mt_refreshing03, R.drawable.mt_refreshing04, R.drawable.mt_refreshing05, R.drawable.mt_refreshing06}; + //加载更多底部动画 + private int[] loadingAnimSrcs = new int[]{R.drawable.mt_loading01, R.drawable.mt_loading02}; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_demo10); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + springView = findViewById(R.id.springview); + springView.setListener(new SpringView.OnFreshListener() { + @Override + public void onRefresh() { + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 2000); + } + + @Override + public void onLoadmore() { + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 2000); + } + }); + //给header和footer设置为DRAG模式 + springView.setHeader(new MeituanHeader(this, pullAnimSrcs, refreshAnimSrcs).setType(SpringView.Type.DRAG)); + springView.setFooter(new MeituanFooter(this, loadingAnimSrcs).setType(SpringView.Type.DRAG)); + } +} diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo11/Demo11Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo11/Demo11Activity.java new file mode 100644 index 0000000..935a572 --- /dev/null +++ b/demo/src/main/java/com/liaoinstan/demospring/demo11/Demo11Activity.java @@ -0,0 +1,120 @@ +package com.liaoinstan.demospring.demo11; + +import android.os.Bundle; +import android.os.Handler; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.RecyclerView; +import androidx.appcompat.widget.Toolbar; +import android.widget.Toast; + +import com.liaoinstan.demospring.R; +import com.liaoinstan.springview.aliheader.AliFooter; +import com.liaoinstan.springview.weixinheader.Program; +import com.liaoinstan.springview.weixinheader.WeixinHeader; +import com.liaoinstan.springview.widget.SpringView; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class Demo11Activity extends AppCompatActivity implements WeixinHeader.OnMoreClickListener, WeixinHeader.OnProgramClickListener, WeixinHeader.OnProgramLongClickListener { + + private SpringView springView; + private WeixinHeader weixinHeader; + + //测试数据 + //注意这里本应该给每个对象一个网络图片url链接,再利用图片加载框架加载网络图片, + //但是在本demo中不想引入无关框架,所以这里把本地资源图片id转成String类型保存在url字段中,加载图片的时候再转回int类型设置图片,这样做仅为演示 + private List data = new ArrayList() {{ + add(new Program("ofo小黄车", String.valueOf(R.drawable.wx_program1))); + add(new Program("哈图", String.valueOf(R.drawable.wx_program2))); + add(new Program("好货", String.valueOf(R.drawable.wx_program3))); + }}; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_demo11); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + springView = findViewById(R.id.springview); + springView.setListener(new SpringView.OnFreshListener() { + @Override + public void onRefresh() { + } + + @Override + public void onLoadmore() { + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 2000); + } + }); + springView.setHeader(weixinHeader = new WeixinHeader()); + springView.setFooter(new AliFooter(this)); + + ///////////////////////////////// + //// 初始化微信小程序header //// + ///////////////////////////////// + + //设置加载图片回调方法 + weixinHeader.setOnLoadImgCallback((imageView, imgUrl, position) -> { + //在这个回调中自行使用项目中的图片加载框架加载网络图片,这里因为不想在demo中导入无关框架,所以直接加载本地图片演示 + imageView.setImageResource(Integer.parseInt(imgUrl)); + }); + //item 点击事件 + weixinHeader.setOnProgramClickListener(this); + //item 长点击事件 + weixinHeader.setOnProgramLongClickListener(this); + //“更多”按钮点击事件 + weixinHeader.setOnMoreClickListener(this); + + //设置小程序数据 + weixinHeader.freshItem(data); + } + + @Override + public void onClick(Program program, RecyclerView.ViewHolder holder, int position) { + Toast.makeText(Demo11Activity.this, program.getName() + " click", Toast.LENGTH_SHORT).show(); + } + + @Override + public void onLongClick(Program program, RecyclerView.ViewHolder holder, int position) { + //弹出个对话框,点确定就删除该小程序 + new AlertDialog.Builder(this) + .setMessage("确定要移除'" + program.getName() + "'?") + .setPositiveButton("确定", (dialog, which) -> { + weixinHeader.removeItem(position); + }) + .create() + .show(); + } + + @Override + public void onMoreClick() { + //弹出个对话框,点确定就随机添加一个小程序 + new AlertDialog.Builder(this) + .setMessage("确定要添加新的小程序?") + .setPositiveButton("确定", (dialog, which) -> { + switch (new Random().nextInt(5)) { + case 0: + weixinHeader.addItem(new Program("ofo小黄车", String.valueOf(R.drawable.wx_program1))); + break; + case 1: + weixinHeader.addItem(new Program("哈图", String.valueOf(R.drawable.wx_program2))); + break; + case 2: + weixinHeader.addItem(new Program("好货", String.valueOf(R.drawable.wx_program3))); + break; + case 3: + weixinHeader.addItem(new Program("快闪", String.valueOf(R.drawable.wx_program4))); + break; + case 4: + weixinHeader.addItem(new Program("蘑菇街", String.valueOf(R.drawable.wx_program5))); + break; + } + }) + .create() + .show(); + } +} diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo12/Demo12Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo12/Demo12Activity.java new file mode 100644 index 0000000..ceaa3c1 --- /dev/null +++ b/demo/src/main/java/com/liaoinstan/demospring/demo12/Demo12Activity.java @@ -0,0 +1,140 @@ +package com.liaoinstan.demospring.demo12; + +import android.os.Bundle; +import android.view.View; +import android.widget.Toast; + +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.RecyclerView; + +import com.liaoinstan.demospring.R; +import com.liaoinstan.demospring.utils.StatusBarUtil; +import com.liaoinstan.springview.weixinheader.Program; +import com.liaoinstan.springview.weixinheaderv2.WeixinHeaderV2; +import com.liaoinstan.springview.weixinheaderv2.WeixinTitleBar; +import com.liaoinstan.springview.widget.SpringView; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class Demo12Activity extends AppCompatActivity implements WeixinHeaderV2.OnMoreClickListener, WeixinHeaderV2.OnProgramClickListener, WeixinHeaderV2.OnProgramDropListener, WeixinHeaderV2.OnSearchClickListener { + + private View bottomView; + private WeixinTitleBar weixinTitleBar; + private SpringView springView; + private WeixinHeaderV2 weixinHeaderV2; + + //测试数据 + //注意这里本应该给每个对象一个网络图片url链接,再利用图片加载框架加载网络图片, + //但是在本demo中不想引入无关框架,所以这里把本地资源图片id转成String类型保存在url字段中,加载图片的时候再转回int类型设置图片,这样做仅为演示 + private List dataRecent = new ArrayList() {{ + add(new Program("ofo小黄车", String.valueOf(R.drawable.wx_program1))); + add(new Program("哈图", String.valueOf(R.drawable.wx_program2))); + add(new Program("好货", String.valueOf(R.drawable.wx_program3))); + add(new Program("快闪", String.valueOf(R.drawable.wx_program4))); + add(new Program("蘑菇街", String.valueOf(R.drawable.wx_program5))); + }}; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_demo12); + bottomView = findViewById(R.id.bottom_view); + weixinTitleBar = findViewById(R.id.weixin_title_bar); + springView = findViewById(R.id.springview); + //设置状态栏为透明重叠(沉浸式) + StatusBarUtil.setTranslucent(this); + + springView.setListener(new SpringView.OnFreshListener() { + @Override + public void onRefresh() { + } + + @Override + public void onLoadmore() { + } + }); + + /////////////////////////////////// + //// 初始化微信小程序headerV2 //// + /////////////////////////////////// + + //微信headerV2 的构造函数需要bottomView,weixinTitleBar两个参数 + //bottomView 是页面底部导航条,weixinHeaderV2在拖拽过程中会控制它收起或弹出,可以是任意View,这里为了方便使用了material包下的BottomNavigationView + //weixinTitleBar 是页面顶部的标题栏,weixinHeaderV2在拖拽过程中会控制它进行动画交互 + //这两个参数均可为 null,为null则 weixinHeaderV2不会进行任何处理 + weixinHeaderV2 = new WeixinHeaderV2(bottomView, weixinTitleBar); + + //设置加载图片回调方法 + weixinHeaderV2.setOnLoadImgCallback((imageView, imgUrl, position) -> { + //在这个回调中自行使用项目中的图片加载框架加载网络图片,这里因为不想在demo中导入无关框架,所以直接加载本地图片演示 + imageView.setImageResource(Integer.parseInt(imgUrl)); + }); + //item 点击事件 + weixinHeaderV2.setOnProgramClickListener(this); + //item drop(拖拽删除)事件 + weixinHeaderV2.setOnProgramDropListener(this); + //“更多”按钮点击事件 + weixinHeaderV2.setOnMoreClickListener(this); + //“搜索框”点击事件 + weixinHeaderV2.setOnSearchClickListener(this); + + //设置小程序数据('最近使用') + //如果要添加数据到'我的小程序',调用addItemMine(...)方法 + weixinHeaderV2.addItemRecent(dataRecent); + + //设置header到SpringView + springView.setHeader(weixinHeaderV2); + } + + @Override + public void onClick(Program program, RecyclerView.ViewHolder holder, int position) { + Toast.makeText(Demo12Activity.this, program.getName() + " click", Toast.LENGTH_SHORT).show(); + } + + @Override + public boolean onDrop(Program program, RecyclerView.ViewHolder holder, int position) { + //返回ture会执行删除操作,false不删除,默认会删除 + return true; + } + + @Override + public void onSearchClick() { + Toast.makeText(this, "onSearchClick", Toast.LENGTH_SHORT).show(); + } + + @Override + public void onMoreClick() { + //弹出个对话框,点确定就随机添加一个小程序 + new AlertDialog.Builder(this) + .setMessage("确定要添加新的小程序?(仅测试)") + .setPositiveButton("确定", (dialog, which) -> { + if (weixinHeaderV2.getRecentProgramCount() >= 7) { + //'最近使用'最多只能有7条数据 + Toast.makeText(Demo12Activity.this, "已经放不下了", Toast.LENGTH_SHORT).show(); + return; + } + switch (new Random().nextInt(5)) { + case 0: + weixinHeaderV2.addItemRecent(new Program("ofo小黄车", String.valueOf(R.drawable.wx_program1))); + break; + case 1: + weixinHeaderV2.addItemRecent(new Program("哈图", String.valueOf(R.drawable.wx_program2))); + break; + case 2: + weixinHeaderV2.addItemRecent(new Program("好货", String.valueOf(R.drawable.wx_program3))); + break; + case 3: + weixinHeaderV2.addItemRecent(new Program("快闪", String.valueOf(R.drawable.wx_program4))); + break; + case 4: + weixinHeaderV2.addItemRecent(new Program("蘑菇街", String.valueOf(R.drawable.wx_program5))); + break; + } + }) + .create() + .show(); + } +} diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo13/Demo13Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo13/Demo13Activity.java new file mode 100644 index 0000000..e75cf15 --- /dev/null +++ b/demo/src/main/java/com/liaoinstan/demospring/demo13/Demo13Activity.java @@ -0,0 +1,147 @@ +package com.liaoinstan.demospring.demo13; + +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; + +import com.liaoinstan.demospring.R; +import com.liaoinstan.springview.aliheader.AliHeader; +import com.liaoinstan.springview.container.AutoFooter; +import com.liaoinstan.springview.utils.DensityUtil; +import com.liaoinstan.springview.widget.SpringView; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class Demo13Activity extends AppCompatActivity { + private List mDatas = new ArrayList<>(); + + private RecyclerView recyclerView; + private RecyclerViewAdapter recyclerViewAdapter; + private SpringView springView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_demo13); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + initData(); + + recyclerView = findViewById(R.id.recycle); + recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, RecyclerView.VERTICAL)); +// recyclerView.setLayoutManager(new GridLayoutManager(Demo13Activity.this, 2, RecyclerView.VERTICAL, false)); + recyclerViewAdapter = new RecyclerViewAdapter(mDatas); + recyclerView.setAdapter(recyclerViewAdapter); + recyclerView.setItemAnimator(new DefaultItemAnimator()); + + springView = findViewById(R.id.springview); + springView.setListener(new SpringView.OnFreshListener() { + @Override + public void onRefresh() { + Toast.makeText(Demo13Activity.this, "onRefresh", Toast.LENGTH_SHORT).show(); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); + } + + @Override + public void onLoadmore() { + if (springView.getFooter(AutoFooter.class).isInProgress()) { + //模拟网络请求列表数据 + new Handler().postDelayed(() -> { + List remoteData = getRemoteData(); + if (remoteData != null) { + mDatas.addAll(remoteData); + recyclerViewAdapter.notifyItemInserted(mDatas.size() - 1); + } else { + springView.getFooter(AutoFooter.class).showBottomLine(); + } + }, 1000); + } + } + }); + springView.setHeader(new AliHeader(this)); + springView.setFooter(new AutoFooter()); + } + + //模拟请求服务器数据 + //如果数据小于25条就每次返回5条,大于25条就返回null,模拟服务器已经没有数据的情况,这只为演示 + private List getRemoteData() { + if (mDatas.size() < 25) { + List remoteData = new ArrayList<>(); + remoteData.add("add item"); + remoteData.add("add item"); + remoteData.add("add item"); + remoteData.add("add item"); + remoteData.add("add item"); + return remoteData; + } else { + return null; + } + } + + private void initData() { + for (int i = 0; i < 15; i++) { + mDatas.add(i == 0 ? "We are in RecyclerView" : (i == 1 ? "SpringView新增了SCROLL模式\n\n基于这种模式可以实现自动加载等效果\n\n下拉到底部试试" : "")); + } + } + + /** + * Adapter for RecyclerView + */ + public static class RecyclerViewAdapter extends RecyclerView.Adapter { + private List results; + + public RecyclerViewAdapter(List results) { + this.results = results; + } + + @NonNull + @Override + public SampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); + return new SampleViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull final SampleViewHolder holder, final int position) { + holder.text_item.setText(results.get(position)); + Random random = new Random(position); + //瀑布流:给item设置一个随机的颜色 + int color = Color.argb(88, random.nextInt(256), random.nextInt(256), random.nextInt(256)); + holder.text_item.setBackgroundColor(color); + holder.text_item.setTextColor(Color.WHITE); + //瀑布流:给item设置一个随机的高度 + ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams(); + layoutParams.height = 300 + DensityUtil.dp2px(random.nextInt(60)); + holder.itemView.setLayoutParams(layoutParams); + } + + @Override + public int getItemCount() { + return results.size(); + } + + class SampleViewHolder extends RecyclerView.ViewHolder { + TextView text_item; + + SampleViewHolder(View view) { + super(view); + text_item = view.findViewById(R.id.item_text); + } + } + } +} diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo14/Demo14Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo14/Demo14Activity.java new file mode 100644 index 0000000..05ccb35 --- /dev/null +++ b/demo/src/main/java/com/liaoinstan/demospring/demo14/Demo14Activity.java @@ -0,0 +1,47 @@ +package com.liaoinstan.demospring.demo14; + +import android.os.Bundle; +import android.os.Handler; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + +import com.liaoinstan.demospring.R; +import com.liaoinstan.springview.duheader.DuHeader; +import com.liaoinstan.springview.duheader.TopBarFrameLayout; +import com.liaoinstan.springview.widget.SpringView; + +public class Demo14Activity extends AppCompatActivity { + + private SpringView springView; + private TopBarFrameLayout topBarFrameLayout; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_demo14); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + topBarFrameLayout = findViewById(R.id.top_bar_frame_layout); + springView = findViewById(R.id.springview); + springView.setListener(new SpringView.OnFreshListener() { + @Override + public void onRefresh() { + new Handler().postDelayed(() -> { + //0.5秒后再结束header刷新动画(模仿'毒'的延迟,大概0.5秒左右) + springView.onFinishFreshAndLoadDelay(500); + //开始展开topBar顶部提示,并在2.5秒回自动收回 + topBarFrameLayout.setTopBarText("为你更新20条新内容"); + topBarFrameLayout.showAndHideDelay(2500); + }, 2000); + } + + @Override + public void onLoadmore() { + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 2000); + } + }); + springView.setHeader(new DuHeader()); + } +} diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo2/Demo2Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo2/Demo2Activity.java index b606fc6..5e179b6 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo2/Demo2Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo2/Demo2Activity.java @@ -1,12 +1,8 @@ package com.liaoinstan.demospring.demo2; -import android.content.Context; import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.os.Handler; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -14,9 +10,12 @@ import android.widget.ListView; import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + import com.liaoinstan.demospring.R; -import com.liaoinstan.springview.container.RotationFooter; -import com.liaoinstan.springview.container.RotationHeader; +import com.liaoinstan.springview.rotationheader.RotationFooter; +import com.liaoinstan.springview.rotationheader.RotationHeader; import com.liaoinstan.springview.widget.SpringView; import java.util.ArrayList; @@ -25,7 +24,7 @@ public class Demo2Activity extends AppCompatActivity { private SpringView springView; - private List mDatas = new ArrayList(); + private List mDatas = new ArrayList<>(); private ListView listView; private AdapterForList listAdapter; @@ -33,41 +32,29 @@ public class Demo2Activity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo2); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - toolbar.setTitleTextColor(Color.parseColor("#999999")); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#ffffff"))); initData(); - listView = (ListView) findViewById(R.id.list); - listAdapter = new AdapterForList(this, mDatas); + listView = findViewById(R.id.list); + listAdapter = new AdapterForList(mDatas); listView.setAdapter(listAdapter); - springView = (SpringView) findViewById(R.id.springview); + springView = findViewById(R.id.springview); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } @Override public void onLoadmore() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } }); - springView.setHeader(new RotationHeader(this)); - springView.setFooter(new RotationFooter(this)); + springView.setHeader(new RotationHeader()); + springView.setFooter(new RotationFooter()); } private void initData() { @@ -94,12 +81,13 @@ public void onClick(View v) { } + /** + * Adapter for ListView + */ private class AdapterForList extends BaseAdapter { - private Context context = null; private List results; - public AdapterForList(Context context, List results) { - this.context = context; + AdapterForList(List results) { this.results = results; } @@ -122,8 +110,8 @@ public int getCount() { public View getView(int position, View convertView, ViewGroup parent) { TextView item_text; if (convertView == null) { - convertView = LayoutInflater.from(context).inflate(R.layout.item, parent, false); - item_text = (TextView) convertView.findViewById(R.id.item_text); + convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); + item_text = convertView.findViewById(R.id.item_text); convertView.setTag(item_text); } else { item_text = (TextView) convertView.getTag(); diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo3/Demo3Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo3/Demo3Activity.java index 3c22f68..7c2a7bd 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo3/Demo3Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo3/Demo3Activity.java @@ -1,23 +1,23 @@ package com.liaoinstan.demospring.demo3; -import android.content.Context; import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.os.Handler; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import com.liaoinstan.demospring.R; -import com.liaoinstan.springview.container.AliFooter; -import com.liaoinstan.springview.container.AliHeader; +import com.liaoinstan.springview.aliheader.AliFooter; +import com.liaoinstan.springview.aliheader.AliHeader; import com.liaoinstan.springview.widget.SpringView; import java.util.ArrayList; @@ -34,42 +34,27 @@ public class Demo3Activity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo3); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - toolbar.setTitleTextColor(Color.parseColor("#999999")); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.WHITE)); initData(); - recyclerView = (RecyclerView) findViewById(R.id.recycle); - recyclerView.setLayoutManager(new LinearLayoutManager(this)); -// recyclerView.setLayoutManager(new GridLayoutManager(recyclerView.getContext(), 3, GridLayoutManager.VERTICAL, false)); -// recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)); - recyclerViewAdapter = new RecyclerViewAdapter(this, mDatas); + recyclerView = findViewById(R.id.recycle); + recyclerView.setLayoutManager(new GridLayoutManager(this, 2, RecyclerView.VERTICAL, false)); + recyclerViewAdapter = new RecyclerViewAdapter(mDatas); recyclerView.setAdapter(recyclerViewAdapter); recyclerView.setItemAnimator(new DefaultItemAnimator()); - springView = (SpringView) findViewById(R.id.springview); - springView.setType(SpringView.Type.FOLLOW); + springView = findViewById(R.id.springview); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } @Override public void onLoadmore() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } }); springView.setHeader(new AliHeader(this, R.drawable.ali, true)); //参数为:logo图片资源,是否显示文字 @@ -77,8 +62,8 @@ public void run() { } private void initData() { - for (int i = 0; i < 9; i++) { - mDatas.add(i == 0 ? "We are in RecyclerView" : (i == 1 ? "SpringView支持RecyclerView\n\n这是一个仿阿里旅行的header,logo可以图片可自行替换" : "")); + for (int i = 0; i < 14; i++) { + mDatas.add(i == 0 ? "We are in RecyclerView" : (i == 3 ? "SpringView支持RecyclerView\n\n这是一个仿阿里旅行的header\n\nlogo可以图片可自行替换" : "")); } } @@ -100,23 +85,27 @@ public void onClick(View v) { } + /** + * Adapter for RecyclerView + */ private class RecyclerViewAdapter extends RecyclerView.Adapter { private List results; - public RecyclerViewAdapter(Context context, List results) { + RecyclerViewAdapter(List results) { this.results = results; } + @NonNull @Override - public SampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + public SampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); return new SampleViewHolder(view); } @Override - public void onBindViewHolder(final SampleViewHolder holder, final int position) { + public void onBindViewHolder(@NonNull final SampleViewHolder holder, final int position) { holder.text_item.setText(results.get(position)); - if (position % 2 == 1) { + if ((position + 1) / 2 % 2 == 1) { holder.text_item.setBackgroundColor(Color.parseColor("#e3f1fc")); holder.text_item.setTextColor(Color.parseColor("#9dd2fc")); } else { @@ -130,12 +119,12 @@ public int getItemCount() { return results.size(); } - public class SampleViewHolder extends RecyclerView.ViewHolder { - public TextView text_item; + class SampleViewHolder extends RecyclerView.ViewHolder { + TextView text_item; - public SampleViewHolder(View view) { + SampleViewHolder(View view) { super(view); - text_item = (TextView) view.findViewById(R.id.item_text); + text_item = view.findViewById(R.id.item_text); } } } diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo4/Demo4Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo4/Demo4Activity.java index d998a53..f3a17d3 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo4/Demo4Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo4/Demo4Activity.java @@ -3,8 +3,8 @@ import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import android.webkit.WebSettings; import android.webkit.WebView; @@ -14,18 +14,18 @@ public class Demo4Activity extends AppCompatActivity { private WebView webView; + @SuppressWarnings("all") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo4); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#18cfbe"))); - webView = (WebView) findViewById(R.id.webView); + webView = findViewById(R.id.webView); WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); - webView.loadUrl("https://github.com");//https://github.com //http://cn.bing.com/ - + webView.loadUrl("https://github.com"); //https://github.com //http://cn.bing.com/ } } diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo5/Demo5Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo5/Demo5Activity.java index d3287f9..ed1f746 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo5/Demo5Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo5/Demo5Activity.java @@ -1,14 +1,12 @@ package com.liaoinstan.demospring.demo5; -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import com.liaoinstan.demospring.R; -import com.liaoinstan.springview.container.AcFunFooter; -import com.liaoinstan.springview.container.AcFunHeader; +import com.liaoinstan.springview.acfunheader.AcFunFooter; +import com.liaoinstan.springview.acfunheader.AcFunHeader; import com.liaoinstan.springview.widget.SpringView; public class Demo5Activity extends AppCompatActivity { @@ -18,11 +16,10 @@ public class Demo5Activity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo5); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#ff8277"))); - springView = (SpringView) findViewById(R.id.springview); + springView = findViewById(R.id.springview); springView.setGive(SpringView.Give.NONE); springView.setListener(new SpringView.OnFreshListener() { @Override diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo6/Demo6Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo6/Demo6Activity.java index f5fbf22..81c5266 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo6/Demo6Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo6/Demo6Activity.java @@ -1,13 +1,12 @@ package com.liaoinstan.demospring.demo6; -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.os.Handler; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; import android.widget.RadioGroup; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + import com.liaoinstan.demospring.R; import com.liaoinstan.springview.container.DefaultFooter; import com.liaoinstan.springview.container.DefaultHeader; @@ -21,40 +20,26 @@ public class Demo6Activity extends AppCompatActivity implements RadioGroup.OnChe protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo6); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - toolbar.setTitleTextColor(Color.parseColor("#999999")); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.WHITE)); ((RadioGroup) findViewById(R.id.group_header)).setOnCheckedChangeListener(this); - springView = (SpringView) findViewById(R.id.springview); -// springView.setGive(SpringView.Give.NONE); + springView = findViewById(R.id.springview); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { //如果当前设置的头部是QQHeader,则不finish - if (springView.getHeader() instanceof QQHeader) - return; - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + if (springView.getHeader() instanceof QQHeader) return; + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } @Override public void onLoadmore() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } }); - springView.setHeader(new QQHeader()); + springView.setHeader(new QQHeader().setMovePara(1.5f)); //设置拖拽系数(值越大,移动越慢) springView.setFooter(new DefaultFooter(this, R.drawable.progress_small)); } @@ -62,11 +47,9 @@ public void run() { public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.drag_header: - springView.setType(SpringView.Type.OVERLAP); //重叠模式 springView.setHeader(new QQHeader()); break; case R.id.nomal_header: - springView.setType(SpringView.Type.FOLLOW); //跟随模式 springView.setHeader(new DefaultHeader(this)); break; } diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo6/QQHeader.java b/demo/src/main/java/com/liaoinstan/demospring/demo6/QQHeader.java index dbea846..0200a26 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo6/QQHeader.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo6/QQHeader.java @@ -6,21 +6,28 @@ import android.widget.TextView; import com.liaoinstan.demospring.R; -import com.liaoinstan.springview.container.BaseHeader; +import com.liaoinstan.springview.container.BaseSimpleHeader; +import com.liaoinstan.springview.widget.SpringView; /** * Created by liaoinstan on 2016/3/23. * 简单定制的QQ新年刷红包效果,可以在此基础上自己增加动画特效,这里只是模拟出该效果框架进行演示,故该Header不放在library里面 */ -public class QQHeader extends BaseHeader { +//TODO:重构后该demo失效,待修复 +public class QQHeader extends BaseSimpleHeader { private TextView text_dot; private int dotcount; + public QQHeader() { + setType(SpringView.Type.OVERLAP); + setMovePara(2.0f); + } + @Override public View getView(LayoutInflater inflater, ViewGroup viewGroup) { - View view = inflater.inflate(R.layout.header_qq, viewGroup, true); - text_dot = (TextView) view.findViewById(R.id.text_dot); + View view = inflater.inflate(R.layout.header_qq, viewGroup, false); + text_dot = view.findViewById(R.id.text_dot); return view; } @@ -36,11 +43,17 @@ public int getDragMaxHeight(View rootView) { @Override public int getDragSpringHeight(View rootView) { - return rootView.getMeasuredHeight()-100; + return rootView.getMeasuredHeight() - 100; } @Override public void onPreDrag(View rootView) { + dotcount++; + text_dot.setText("x" + dotcount); + } + + @Override + public void onFinishDrag(View rootView) { } @Override @@ -53,8 +66,6 @@ public void onLimitDes(View rootView, boolean upORdown) { @Override public void onStartAnim() { - dotcount++; - text_dot.setText("x"+dotcount); } @Override diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo7/Demo7Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo7/Demo7Activity.java index f896f84..2dd1d01 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo7/Demo7Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo7/Demo7Activity.java @@ -1,54 +1,44 @@ package com.liaoinstan.demospring.demo7; -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.os.Handler; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import com.liaoinstan.demospring.R; -import com.liaoinstan.springview.container.MeituanFooter; -import com.liaoinstan.springview.container.MeituanHeader; +import com.liaoinstan.springview.meituanheader.MeituanFooter; +import com.liaoinstan.springview.meituanheader.MeituanHeader; import com.liaoinstan.springview.widget.SpringView; public class Demo7Activity extends AppCompatActivity { private SpringView springView; + //下拉过程动画 private int[] pullAnimSrcs = new int[]{R.drawable.mt_pull, R.drawable.mt_pull01, R.drawable.mt_pull02, R.drawable.mt_pull03, R.drawable.mt_pull04, R.drawable.mt_pull05}; + //刷新中动画 private int[] refreshAnimSrcs = new int[]{R.drawable.mt_refreshing01, R.drawable.mt_refreshing02, R.drawable.mt_refreshing03, R.drawable.mt_refreshing04, R.drawable.mt_refreshing05, R.drawable.mt_refreshing06}; + //加载更多底部动画 private int[] loadingAnimSrcs = new int[]{R.drawable.mt_loading01, R.drawable.mt_loading02}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo7); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#18cfbe"))); - springView = (SpringView) findViewById(R.id.springview); - springView.setType(SpringView.Type.FOLLOW); + springView = findViewById(R.id.springview); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 2000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 2000); } @Override public void onLoadmore() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 2000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 2000); } }); springView.setHeader(new MeituanHeader(this, pullAnimSrcs, refreshAnimSrcs)); diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo8/Demo8Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo8/Demo8Activity.java index 68f0baa..7664d69 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo8/Demo8Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo8/Demo8Activity.java @@ -1,13 +1,14 @@ package com.liaoinstan.demospring.demo8; -import android.content.Context; import android.os.Bundle; import android.os.Handler; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; -import android.support.v7.widget.helper.ItemTouchHelper; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.appcompat.widget.Toolbar; +import androidx.recyclerview.widget.ItemTouchHelper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -29,40 +30,29 @@ public class Demo8Activity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo8); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); initData(); - springView = (SpringView) findViewById(R.id.springview); - springView.setType(SpringView.Type.FOLLOW); + springView = findViewById(R.id.springview); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } @Override public void onLoadmore() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } }); springView.setHeader(new DefaultHeader(this)); springView.setFooter(new DefaultFooter(this)); - RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycle); + RecyclerView recyclerView = findViewById(R.id.recycle); recyclerView.setHasFixedSize(true); - RecyclerAdapter recyclerAdapter = new RecyclerAdapter(R.layout.item, mDatas); + RecyclerAdapter recyclerAdapter = new RecyclerAdapter(mDatas); recyclerView.setAdapter(recyclerAdapter); recyclerView.setLayoutManager(new LinearLayoutManager(this)); @@ -72,30 +62,29 @@ public void run() { private void initData() { for (int i = 0; i < 20; i++) { - mDatas.add(i == 0 ? "SpringView处理了水平滑动的手势冲突,侧滑删除试试" : "item" + i); + mDatas.add(i == 0 ? "SpringView不会和水平滑动有冲突,侧滑删除试试" : "item" + i); } } + /** + * Adapter for RecyclerView + */ private class RecyclerAdapter extends RecyclerView.Adapter implements MyItemTouchCallback.ItemTouchAdapter { - - private Context context; - private int src; private List results; - public RecyclerAdapter(int src, List results) { + RecyclerAdapter(List results) { this.results = results; - this.src = src; } + @NonNull @Override - public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - this.context = parent.getContext(); - View itemView = LayoutInflater.from(parent.getContext()).inflate(src, parent, false); + public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); return new MyViewHolder(itemView); } @Override - public void onBindViewHolder(final MyViewHolder holder, int position) { + public void onBindViewHolder(@NonNull final MyViewHolder holder, int position) { holder.textView.setText(results.get(position)); } @@ -114,16 +103,16 @@ public void onSwiped(int position) { notifyItemRemoved(position); } - public class MyViewHolder extends RecyclerView.ViewHolder { + class MyViewHolder extends RecyclerView.ViewHolder { - public TextView textView; + TextView textView; - public MyViewHolder(View itemView) { + MyViewHolder(View itemView) { super(itemView); ViewGroup.LayoutParams layoutParams = itemView.getLayoutParams(); - layoutParams.height = 100; + layoutParams.height = 150; itemView.setLayoutParams(layoutParams); - textView = (TextView) itemView.findViewById(R.id.item_text); + textView = itemView.findViewById(R.id.item_text); } } } diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo8/MyItemTouchCallback.java b/demo/src/main/java/com/liaoinstan/demospring/demo8/MyItemTouchCallback.java index bb01f33..93f952c 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo8/MyItemTouchCallback.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo8/MyItemTouchCallback.java @@ -1,12 +1,14 @@ package com.liaoinstan.demospring.demo8; import android.graphics.Canvas; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.helper.ItemTouchHelper; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; /** - * Created by Administrator on 2016/4/12. + * Created by liaoinstan on 2016/4/12. * 实现侧滑删除功能 */ public class MyItemTouchCallback extends ItemTouchHelper.Callback { @@ -29,7 +31,7 @@ public boolean isItemViewSwipeEnabled() { @Override - public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { + public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { if (recyclerView.getLayoutManager() instanceof GridLayoutManager) { final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; final int swipeFlags = 0; @@ -42,7 +44,7 @@ public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder v } @Override - public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { + public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { int fromPosition = viewHolder.getAdapterPosition();//得到拖动ViewHolder的position int toPosition = target.getAdapterPosition();//得到目标ViewHolder的position itemTouchAdapter.onMove(fromPosition, toPosition); @@ -50,13 +52,13 @@ public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHol } @Override - public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { int position = viewHolder.getAdapterPosition(); itemTouchAdapter.onSwiped(position); } @Override - public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { + public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { //滑动时改变Item的透明度 final float alpha = 1 - Math.abs(dX) / (float) viewHolder.itemView.getWidth(); diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9Activity.java index 606cdcf..aa55166 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9Activity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9Activity.java @@ -1,16 +1,19 @@ package com.liaoinstan.demospring.demo9; import android.os.Bundle; -import android.support.design.widget.TabLayout; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; -import android.support.v4.view.ViewPager; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; +import com.google.android.material.tabs.TabLayout; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; +import androidx.viewpager.widget.ViewPager; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import com.liaoinstan.demospring.R; +@SuppressWarnings("all") public class Demo9Activity extends AppCompatActivity { private TabLayout tab; private ViewPager pager; @@ -20,21 +23,24 @@ public class Demo9Activity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo9); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - tab = (TabLayout) findViewById(R.id.tab); - pager = (ViewPager) findViewById(R.id.pager); + tab = findViewById(R.id.tab); + pager = findViewById(R.id.pager); adapterPager = new PagerAdapter(getSupportFragmentManager(), new String[]{"ScrollView", "RecyclerView", "note"}); pager.setAdapter(adapterPager); tab.setupWithViewPager(pager); } + /** + * Adapter for Viewpager + */ private class PagerAdapter extends FragmentPagerAdapter { private String[] titles; - public PagerAdapter(FragmentManager fm, String[] titles) { + PagerAdapter(FragmentManager fm, String[] titles) { super(fm); this.titles = titles; } diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentNote.java b/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentNote.java index be16866..fcf14de 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentNote.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentNote.java @@ -2,15 +2,17 @@ import android.os.Bundle; import android.os.Handler; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + import com.liaoinstan.demospring.R; -import com.liaoinstan.springview.container.RotationFooter; -import com.liaoinstan.springview.container.RotationHeader; +import com.liaoinstan.springview.rotationheader.RotationFooter; +import com.liaoinstan.springview.rotationheader.RotationHeader; import com.liaoinstan.springview.widget.SpringView; @@ -40,7 +42,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) { @Nullable @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.fragment_demo9_note, container, false); return rootView; } @@ -53,31 +55,18 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) { private void initView() { //初始化SpringView - springView = (SpringView) rootView.findViewById(R.id.springview); -// springView.setHeader(new AliHeader(getContext(), false)); -// springView.setFooter(new AliFooter(getContext(), false)); - springView.setType(SpringView.Type.OVERLAP); //设为重叠样式 - springView.setHeader(new RotationHeader(getContext())); - springView.setFooter(new RotationFooter(getContext())); + springView = rootView.findViewById(R.id.springview); + springView.setHeader(new RotationHeader()); + springView.setFooter(new RotationFooter()); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } @Override public void onLoadmore() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } }); } diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentRecyclerView.java b/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentRecyclerView.java index 2db6534..b0aeeea 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentRecyclerView.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentRecyclerView.java @@ -3,18 +3,20 @@ import android.graphics.Color; import android.os.Bundle; import android.os.Handler; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import com.liaoinstan.demospring.R; -import com.liaoinstan.springview.container.AliFooter; -import com.liaoinstan.springview.container.AliHeader; +import com.liaoinstan.springview.aliheader.AliFooter; +import com.liaoinstan.springview.aliheader.AliHeader; import com.liaoinstan.springview.widget.SpringView; import java.util.ArrayList; @@ -50,7 +52,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) { @Nullable @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.fragment_demo9_recyclerview, container, false); return rootView; } @@ -64,34 +66,26 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) { private void initView() { //初始化recyclerView - recyclerView = (RecyclerView) rootView.findViewById(R.id.recycle); + recyclerView = rootView.findViewById(R.id.recycle); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerViewAdapter = new RecyclerViewAdapter(mDatas); recyclerView.setAdapter(recyclerViewAdapter); //初始化SpringView - springView = (SpringView) rootView.findViewById(R.id.springview); + springView = rootView.findViewById(R.id.springview); springView.setHeader(new AliHeader(getContext(), false)); springView.setFooter(new AliFooter(getContext(), false)); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } @Override public void onLoadmore() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - mDatas.add("add item"); - recyclerViewAdapter.notifyItemInserted(mDatas.size() - 1); - springView.onFinishFreshAndLoad(); - } + new Handler().postDelayed(() -> { + mDatas.add("add item"); + recyclerViewAdapter.notifyItemInserted(mDatas.size() - 1); + springView.onFinishFreshAndLoad(); }, 1000); } }); @@ -103,21 +97,25 @@ private void initData() { } } + /** + * Adapter for RecyclerView + */ private class RecyclerViewAdapter extends RecyclerView.Adapter { private List results; - public RecyclerViewAdapter(List results) { + RecyclerViewAdapter(List results) { this.results = results; } + @NonNull @Override - public RecyclerViewAdapter.SampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + public RecyclerViewAdapter.SampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); return new RecyclerViewAdapter.SampleViewHolder(view); } @Override - public void onBindViewHolder(final RecyclerViewAdapter.SampleViewHolder holder, final int position) { + public void onBindViewHolder(@NonNull final RecyclerViewAdapter.SampleViewHolder holder, final int position) { holder.text_item.setText(results.get(position)); if (position % 2 == 1) { holder.text_item.setBackgroundColor(Color.parseColor("#ffffff")); @@ -133,12 +131,12 @@ public int getItemCount() { return results.size(); } - public class SampleViewHolder extends RecyclerView.ViewHolder { - public TextView text_item; + class SampleViewHolder extends RecyclerView.ViewHolder { + TextView text_item; - public SampleViewHolder(View view) { + SampleViewHolder(View view) { super(view); - text_item = (TextView) view.findViewById(R.id.item_text); + text_item = view.findViewById(R.id.item_text); } } } diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentScrollView.java b/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentScrollView.java index effb7d1..839d15a 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentScrollView.java +++ b/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentScrollView.java @@ -2,17 +2,17 @@ import android.os.Bundle; import android.os.Handler; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.liaoinstan.demospring.R; -import com.liaoinstan.springview.container.AliFooter; -import com.liaoinstan.springview.container.AliHeader; -import com.liaoinstan.springview.container.RotationFooter; -import com.liaoinstan.springview.container.RotationHeader; +import com.liaoinstan.springview.aliheader.AliFooter; +import com.liaoinstan.springview.aliheader.AliHeader; import com.liaoinstan.springview.widget.SpringView; @@ -42,7 +42,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) { @Nullable @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.fragment_demo9_scrollview, container, false); return rootView; } @@ -55,28 +55,18 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) { private void initView() { //初始化SpringView - springView = (SpringView) rootView.findViewById(R.id.springview); + springView = rootView.findViewById(R.id.springview); springView.setHeader(new AliHeader(getContext(), R.drawable.ali, true)); springView.setFooter(new AliFooter(getContext(), false)); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } @Override public void onLoadmore() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } }); } diff --git a/demo/src/main/java/com/liaoinstan/demospring/demox/DemoXActivity.java b/demo/src/main/java/com/liaoinstan/demospring/demox/DemoXActivity.java new file mode 100644 index 0000000..639355b --- /dev/null +++ b/demo/src/main/java/com/liaoinstan/demospring/demox/DemoXActivity.java @@ -0,0 +1,46 @@ +package com.liaoinstan.demospring.demox; + +import android.os.Bundle; +import android.os.Handler; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + +import com.liaoinstan.demospring.R; +import com.liaoinstan.springview.aliheader.AliFooter; +import com.liaoinstan.springview.wangyiheader.WangyiHeader; +import com.liaoinstan.springview.widget.SpringView; + +/** + * 这是仿网易新闻的例子,使用了SpringView新增的'收场动画'特性 + * 目前该特性还处于试验阶段,并未正式发布,如果效果不佳可能在后续版本移除,目前暂时移除掉这个例子 + */ +public class DemoXActivity extends AppCompatActivity { + + private SpringView springView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_demox); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + springView = findViewById(R.id.springview); + springView.setMovePara(1.3f); + springView.setListener(new SpringView.OnFreshListener() { + @Override + public void onRefresh() { + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 2000); + } + + @Override + public void onLoadmore() { + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 2000); + } + }); + springView.setHeader(new WangyiHeader()); + springView.setFooter(new AliFooter(this)); + + } +} diff --git a/demo/src/main/java/com/liaoinstan/demospring/test/TestActivity.java b/demo/src/main/java/com/liaoinstan/demospring/test/TestActivity.java index 73e0cb6..9b62cd7 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/test/TestActivity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/test/TestActivity.java @@ -26,28 +26,18 @@ protected void onCreate(Bundle savedInstanceState) { ((CheckBox) findViewById(R.id.check_enableFooter)).setOnCheckedChangeListener(this); - springView = (SpringView) findViewById(R.id.my); + springView = findViewById(R.id.my); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { Toast.makeText(TestActivity.this, "onRefresh", Toast.LENGTH_SHORT).show(); - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } @Override public void onLoadmore() { Toast.makeText(TestActivity.this, "onLoadmore", Toast.LENGTH_SHORT).show(); - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } }); } @@ -61,6 +51,12 @@ public void onCheckedChanged(RadioGroup group, int checkedId) { case R.id.follow: springView.setType(SpringView.Type.FOLLOW); break; + case R.id.drag: + springView.setType(SpringView.Type.DRAG); + break; + case R.id.scroll: + springView.setType(SpringView.Type.SCROLL); + break; case R.id.both: springView.setGive(SpringView.Give.BOTH); break; @@ -88,8 +84,8 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { } } - public void onClick(View v){ - switch (v.getId()){ + public void onClick(View v) { + switch (v.getId()) { case R.id.btn_callfresh: springView.callFresh(); break; diff --git a/demo/src/main/java/com/liaoinstan/demospring/utils/StatusBarUtil.java b/demo/src/main/java/com/liaoinstan/demospring/utils/StatusBarUtil.java new file mode 100644 index 0000000..6fb9d05 --- /dev/null +++ b/demo/src/main/java/com/liaoinstan/demospring/utils/StatusBarUtil.java @@ -0,0 +1,79 @@ +package com.liaoinstan.demospring.utils; + +import android.app.Activity; +import android.graphics.Color; +import android.os.Build; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +import androidx.annotation.ColorInt; +import androidx.annotation.ColorRes; +import androidx.core.content.ContextCompat; + +/** + * 状态栏样式工具栏 + */ +public class StatusBarUtil { + //修改状态栏为全透明 + public static void setTranslucent(Activity activity) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + setBarOverlap(activity); + setStatusBarColorInt(activity, Color.TRANSPARENT); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + Window window = activity.getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //4.4设置的透明样式 + } + } + + public static void setStatusBarColor(Activity activity, @ColorRes int colorResId) { + setStatusBarColorInt(activity, ContextCompat.getColor(activity, colorResId)); + } + + //设置状态栏背景色 + public static void setStatusBarColorInt(Activity activity, @ColorInt int color) { + if (activity == null) return; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = activity.getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //清除4.4设置的透明样式 + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(color); + } + } + + //设置状态栏重叠样式 + public static void setBarOverlap(Activity activity) { + Window window = activity.getWindow(); + window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); +// | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION +// | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + } + + //设置状态栏正常状态(系统默认) + public static void setBarFollow(Activity activity) { + Window window = activity.getWindow(); + window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + } + + //设置状态栏深色文字 + public static void setTextDark(Activity activity) { + Window window = activity.getWindow(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + //6.0以上调用系统方法 + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //清除4.4设置的透明样式 + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + int flag = window.getDecorView().getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + window.getDecorView().setSystemUiVisibility(flag); + } + } + + //设置状态栏浅色文字 + public static void setTextLight(Activity activity) { + Window window = activity.getWindow(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + //6.0以上调用系统方法 + int flag = window.getDecorView().getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + window.getDecorView().setSystemUiVisibility(flag); + } + } +} diff --git a/demo/src/main/java/com/liaoinstan/demospring/warning/WarningActivity.java b/demo/src/main/java/com/liaoinstan/demospring/warning/WarningActivity.java index f356871..d99dc20 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/warning/WarningActivity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/warning/WarningActivity.java @@ -2,66 +2,35 @@ import android.os.Bundle; import android.os.Handler; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; -import android.view.ViewGroup; -import android.widget.RadioGroup; -import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import com.liaoinstan.demospring.R; -import com.liaoinstan.springview.utils.DensityUtil; import com.liaoinstan.springview.widget.SpringView; -public class WarningActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener { +public class WarningActivity extends AppCompatActivity { - private TextView textView; private SpringView springView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_warning); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - ((RadioGroup) findViewById(R.id.group_text)).setOnCheckedChangeListener(this); - - springView = (SpringView) findViewById(R.id.springview); + springView = findViewById(R.id.springview); springView.setListener(new SpringView.OnFreshListener() { @Override public void onRefresh() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } @Override public void onLoadmore() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - springView.onFinishFreshAndLoad(); - } - }, 1000); + new Handler().postDelayed(() -> springView.onFinishFreshAndLoad(), 1000); } }); springView.setHeader(new WarningHeader()); } - - @Override - public void onCheckedChanged(RadioGroup group, int checkedId) { - switch (checkedId) { - case R.id.setwrap: - textView = (TextView) springView.getHeaderView().findViewById(R.id.textView); - textView.getLayoutParams().width = ViewGroup.LayoutParams.WRAP_CONTENT; - break; - case R.id.sethard: - textView = (TextView) springView.getHeaderView().findViewById(R.id.textView); - textView.getLayoutParams().width = DensityUtil.dp2px(120); - break; - } - } } diff --git a/demo/src/main/java/com/liaoinstan/demospring/warning/WarningHeader.java b/demo/src/main/java/com/liaoinstan/demospring/warning/WarningHeader.java index 72e8097..64ca40f 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/warning/WarningHeader.java +++ b/demo/src/main/java/com/liaoinstan/demospring/warning/WarningHeader.java @@ -18,8 +18,8 @@ public class WarningHeader extends BaseHeader { @Override public View getView(LayoutInflater inflater, ViewGroup viewGroup) { - View view = inflater.inflate(R.layout.header_warning, viewGroup, true); - textView = (TextView) view.findViewById(R.id.textView); + View view = inflater.inflate(R.layout.header_warning, viewGroup, false); + textView = view.findViewById(R.id.textView); return view; } diff --git a/demo/src/main/res/color/weixin_color_select.xml b/demo/src/main/res/color/weixin_color_select.xml new file mode 100644 index 0000000..d635501 --- /dev/null +++ b/demo/src/main/res/color/weixin_color_select.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/demo/src/main/res/drawable-xxhdpi/adver.jpg b/demo/src/main/res/drawable-xxhdpi/adver.jpg new file mode 100644 index 0000000..eb10887 Binary files /dev/null and b/demo/src/main/res/drawable-xxhdpi/adver.jpg differ diff --git a/demo/src/main/res/drawable-xxhdpi/wx_program1.png b/demo/src/main/res/drawable-xxhdpi/wx_program1.png new file mode 100644 index 0000000..5c0182c Binary files /dev/null and b/demo/src/main/res/drawable-xxhdpi/wx_program1.png differ diff --git a/demo/src/main/res/drawable-xxhdpi/wx_program2.png b/demo/src/main/res/drawable-xxhdpi/wx_program2.png new file mode 100644 index 0000000..cd10fe8 Binary files /dev/null and b/demo/src/main/res/drawable-xxhdpi/wx_program2.png differ diff --git a/demo/src/main/res/drawable-xxhdpi/wx_program3.png b/demo/src/main/res/drawable-xxhdpi/wx_program3.png new file mode 100644 index 0000000..38eba80 Binary files /dev/null and b/demo/src/main/res/drawable-xxhdpi/wx_program3.png differ diff --git a/demo/src/main/res/drawable-xxhdpi/wx_program4.png b/demo/src/main/res/drawable-xxhdpi/wx_program4.png new file mode 100644 index 0000000..e953a34 Binary files /dev/null and b/demo/src/main/res/drawable-xxhdpi/wx_program4.png differ diff --git a/demo/src/main/res/drawable-xxhdpi/wx_program5.png b/demo/src/main/res/drawable-xxhdpi/wx_program5.png new file mode 100644 index 0000000..242721e Binary files /dev/null and b/demo/src/main/res/drawable-xxhdpi/wx_program5.png differ diff --git a/demo/src/main/res/drawable/ic_dashboard_black_24dp.xml b/demo/src/main/res/drawable/ic_dashboard_black_24dp.xml new file mode 100644 index 0000000..46fc8de --- /dev/null +++ b/demo/src/main/res/drawable/ic_dashboard_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/demo/src/main/res/drawable/ic_home_black_24dp.xml b/demo/src/main/res/drawable/ic_home_black_24dp.xml new file mode 100644 index 0000000..f8bb0b5 --- /dev/null +++ b/demo/src/main/res/drawable/ic_home_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/demo/src/main/res/drawable/ic_notifications_black_24dp.xml b/demo/src/main/res/drawable/ic_notifications_black_24dp.xml new file mode 100644 index 0000000..78b75c3 --- /dev/null +++ b/demo/src/main/res/drawable/ic_notifications_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/demo/src/main/res/layout/activity_demo1.xml b/demo/src/main/res/layout/activity_demo1.xml index 79a78c3..fbaf87c 100644 --- a/demo/src/main/res/layout/activity_demo1.xml +++ b/demo/src/main/res/layout/activity_demo1.xml @@ -1,5 +1,5 @@ - - - + app:popupTheme="@style/AppTheme.PopupOverlay" + app:title="Demo1Activity" /> - + - - + android:layout_height="match_parent"> - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_height="200dp" + android:background="#68b3f3" /> + + + + + + + + + + + + + + + + + + diff --git a/demo/src/main/res/layout/activity_demo10.xml b/demo/src/main/res/layout/activity_demo10.xml new file mode 100644 index 0000000..08c7d0b --- /dev/null +++ b/demo/src/main/res/layout/activity_demo10.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo/src/main/res/layout/activity_demo11.xml b/demo/src/main/res/layout/activity_demo11.xml new file mode 100644 index 0000000..4c0f356 --- /dev/null +++ b/demo/src/main/res/layout/activity_demo11.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo/src/main/res/layout/activity_demo12.xml b/demo/src/main/res/layout/activity_demo12.xml new file mode 100644 index 0000000..d33f945 --- /dev/null +++ b/demo/src/main/res/layout/activity_demo12.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo/src/main/res/layout/activity_demo13.xml b/demo/src/main/res/layout/activity_demo13.xml new file mode 100644 index 0000000..db18078 --- /dev/null +++ b/demo/src/main/res/layout/activity_demo13.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/demo/src/main/res/layout/activity_demo14.xml b/demo/src/main/res/layout/activity_demo14.xml new file mode 100644 index 0000000..3d9bc23 --- /dev/null +++ b/demo/src/main/res/layout/activity_demo14.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo/src/main/res/layout/activity_demo2.xml b/demo/src/main/res/layout/activity_demo2.xml index 5e7c786..de59053 100644 --- a/demo/src/main/res/layout/activity_demo2.xml +++ b/demo/src/main/res/layout/activity_demo2.xml @@ -1,25 +1,27 @@ - + tools:context="com.liaoinstan.demospring.demo2.Demo2Activity"> - - + android:background="#ffffff" + app:popupTheme="@style/AppTheme.PopupOverlay" + app:title="Demo2Activity" + app:titleTextColor="#999999" /> - + + android:background="#ffffff"> - + diff --git a/demo/src/main/res/layout/activity_demo3.xml b/demo/src/main/res/layout/activity_demo3.xml index 1f622c9..1ea5e05 100644 --- a/demo/src/main/res/layout/activity_demo3.xml +++ b/demo/src/main/res/layout/activity_demo3.xml @@ -1,5 +1,5 @@ - - - - - + android:background="#ffffff" + app:popupTheme="@style/AppTheme.PopupOverlay" + app:title="Demo3Activity" + app:titleTextColor="#999999" /> + + android:background="#ffffff"> - - @@ -50,8 +47,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|right" - android:layout_marginBottom="90dp" android:layout_marginRight="20dp" + android:layout_marginBottom="90dp" android:orientation="vertical">