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 63b212f..e7dcc27 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ -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-debug.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 ===== **SpringView** is one provides the function of the upper and lower drag and drop components, can be highly customized, implement all kinds of drop-down \ pull painting effect, implementation in the demo: imitation ali travel, imitation Meituan, imitation QQ drop-down brush red envelopes, imitation acfun etc., is fully compatible with the source control such as ListView, RecyclerView, ScrollView, WebView, etc., using a simple, easily customize their style of drag and drop page ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/springview.png) + **SpringView** Individual independence will head/foot, almost achieve the effect of whatever you want, just need to inherit BaseHeader (or Footer) to implement the interface **SpringView** Can dynamically replace the head/tail, you just need to set up different Footer:springView.setHeader(MyHeader()); @@ -13,13 +14,19 @@ SpringView **SpringView** Provides two methods for drag and drop (overlap and follow), can be dynamically switching **SpringView** For lazy people don't want to go to the custom head/tail provides 7 kinds of the default implementation (mimics the ali, tencent, Meituan etc. Various style) as follows, will continue to increase -  -  +**SpringView** support AppBarLayout + + ![这里写图片描述](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** -------- @@ -33,13 +40,13 @@ Add Spring View in the layout file, note that Spring View and ScrollView have th app:header="@layout/myheader" app:footer="@layout/myfooter"> - ``` -Of course, you also can not add in the layout, use the code dynamically added: +Of course, you can also add the header/footer in java code: ``` springView.setHeader(new DefaultHeader(this)); @@ -66,7 +73,17 @@ springView.setListener(new SpringView.OnFreshListener() { use Gradle: ``` dependencies { - compile 'com.liaoinstan.springview:library:1.2.6' + + //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: @@ -74,7 +91,7 @@ or Maven: com.liaoinstan.springview library - 1.2.6 + 1.7.0 pom ``` @@ -82,27 +99,61 @@ or Maven: **Update log** -------- -####**v1.2.6** - - padding bug fix +### **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.2.7** + - 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 2af564c..e1354fb 100644 --- a/README_CN.md +++ b/README_CN.md @@ -1,19 +1,21 @@ -更多请移步至:[我的CSDN博客](http://blog.csdn.net/liaoinstan/article/details/51023907)     apk演示:[点击下载](https://github.com/liaoinstan/SpringView/blob/master/apk/demo-debug.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 ===== **SpringView** 是一个提供了上下拖拽的功能组件,能够进行高度自定义,实现各种下拉\上拉动画效果,demo里实现了:仿阿里旅行、仿美团,仿QQ下拉刷红包,仿acfun等,完全兼容源生控件如ListView、RecyclerView、ScrollView、WebView等,使用简单,轻易定制自己风格的拖拽页面 ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/springview.png) -**SpringView** 单独将头部/尾部独立出来,几乎可是实现任何你想要的效果,只需要继承BaseHeader(或Footer)实现接口 -**SpringView** 能动态地替换头部/尾部,只需要设置不同的头尾即可:springView.setHeader(MyHeader()); +**SpringView** 单独将头部/尾部独立出来,几乎可以实现任何你想要的效果,只需要继承BaseHeader(或Footer)实现接口 -**SpringView** 支持多点触控,可以两只手连续拖拽,你可以定制一些有趣味的效果 +**SpringView** 能在运行时动态地替换头部/尾部,只需要设置不同的头尾即可:springView.setHeader(MyHeader()); + +**SpringView** 支持多点触控,可以两只手连续拖拽,你可以定制一些非常有趣的效果(例如demo5) **SpringView** 提供了2种拖拽方式(重叠和跟随),可以动态地切换 **SpringView** 为不想去自定义头/尾的懒人提供了7种默认的实现(模仿了阿里,腾讯,美团等多种风格)如下,还会继续增加 -  + +**SpringView** 支持和 AppBarLayout 联动   ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/1459212323072.gif) ![这里写图片描述](https://github.com/liaoinstan/SpringView/blob/master/screenshot/1459212372609.gif) @@ -21,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** -------- @@ -33,13 +40,13 @@ SpringView app:header="@layout/myheader" app:footer="@layout/myfooter"> - - + ``` -当然,你也可以不再布局中设置,使用代码动态添加: +当然,你也可以不在布局中设置header\footer,使用代码动态添加: ``` springView.setHeader(new DefaultHeader(this)); @@ -66,7 +73,17 @@ springView.setListener(new SpringView.OnFreshListener() { 使用 Gradle: ``` dependencies { - compile 'com.liaoinstan.springview:library:1.2.6' + + //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: @@ -74,7 +91,7 @@ dependencies { com.liaoinstan.springview library - 1.2.6 + 1.7.0 pom ``` @@ -82,21 +99,53 @@ dependencies { **更新日志** -------- -####**v1.2.6** +#### **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** + - 支持和 AppBarLayout 联动,修复滚动冲突的问题 + +#### **v1.2.7** + - 修复一些bug + +#### **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/build.gradle b/build.gradle index 12e1e89..e46d921 100644 --- a/build.gradle +++ b/build.gradle @@ -1,24 +1,41 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - buildscript { repositories { + google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.5.0' - classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0' - //classpath 'com.github.dcendents:android-maven-plugin:1.3' - classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files + 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') + } } task clean(type: Delete) { delete rootProject.buildDir } + +ext { + compileSdkVersion = 29 + minSdkVersion = 16 + 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 a4e5209..1f4b07e 100644 --- a/demo/build.gradle +++ b/demo/build.gradle @@ -1,35 +1,61 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 23 - buildToolsVersion "23.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 23 - 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:23.2.0' - compile 'com.android.support:design:23.2.0' + 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.2.6' - 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 aecf363..9a26faa 100644 --- a/demo/src/main/AndroidManifest.xml +++ b/demo/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ @@ -9,57 +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 47c010a..f2a6f37 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/MainActivity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/MainActivity.java @@ -2,72 +2,96 @@ 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; import com.liaoinstan.demospring.demo5.Demo5Activity; import com.liaoinstan.demospring.demo6.Demo6Activity; -import com.liaoinstan.demospring.demo3.Demo3Activity; import com.liaoinstan.demospring.demo7.Demo7Activity; -import com.liaoinstan.demospring.demo4.Demo4Activity; 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.warning).setOnClickListener(this); - findViewById(R.id.test).setOnClickListener(this); } - @Override public void onClick(View v) { Intent intent = new Intent(); - switch (v.getId()){ + switch (v.getId()) { case R.id.demo1: - intent.setClass(this,Demo1Activity.class); + intent.setClass(this, Demo1Activity.class); startActivity(intent); break; case R.id.demo2: - intent.setClass(this,Demo2Activity.class); + intent.setClass(this, Demo2Activity.class); startActivity(intent); break; case R.id.demo3: - intent.setClass(this,Demo3Activity.class); + intent.setClass(this, Demo3Activity.class); startActivity(intent); break; case R.id.demo4: - intent.setClass(this,Demo4Activity.class); + intent.setClass(this, Demo4Activity.class); startActivity(intent); break; case R.id.demo5: - intent.setClass(this,Demo5Activity.class); + intent.setClass(this, Demo5Activity.class); startActivity(intent); break; case R.id.demo6: - intent.setClass(this,Demo6Activity.class); + intent.setClass(this, Demo6Activity.class); startActivity(intent); break; case R.id.demo7: - intent.setClass(this,Demo7Activity.class); + intent.setClass(this, Demo7Activity.class); startActivity(intent); break; case R.id.demo8: - intent.setClass(this,Demo8Activity.class); + intent.setClass(this, Demo8Activity.class); + startActivity(intent); + break; + case R.id.demo9: + 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: 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 38bf36b..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,38 +1,30 @@ package com.liaoinstan.demospring.demo2; -import android.content.Context; import android.graphics.Color; -import android.graphics.Paint; -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.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.AbsListView; import android.widget.BaseAdapter; 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.DefaultFooter; -import com.liaoinstan.springview.container.DefaultHeader; -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.lang.reflect.Field; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class Demo2Activity extends AppCompatActivity { private SpringView springView; - private List mDatas = new ArrayList(); + private List mDatas = new ArrayList<>(); private ListView listView; private AdapterForList listAdapter; @@ -40,58 +32,46 @@ 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(){ + private void initData() { for (int i = 0; i < 8; i++) { - mDatas.add(i==0?"We are in ListView":(i==1?"SpringView支持ListView\n\n你可以轻易定制个性化的头部和尾部并在任何控件中使用它":"")); + mDatas.add(i == 0 ? "We are in ListView" : (i == 1 ? "SpringView支持ListView\n\n你可以轻易定制个性化的头部和尾部并在任何控件中使用它" : "")); } } - public void onClick(View v){ - switch (v.getId()){ + public void onClick(View v) { + switch (v.getId()) { case R.id.add: { mDatas.add("add item"); listAdapter.notifyDataSetChanged(); break; } case R.id.sub: - if (mDatas.size()>0) { + if (mDatas.size() > 0) { int position = mDatas.size() - 1; mDatas.remove(position); listAdapter.notifyDataSetChanged(); @@ -101,14 +81,16 @@ 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; } + @Override public long getItemId(int position) { return position; @@ -127,18 +109,17 @@ public int getCount() { @Override 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); + if (convertView == null) { + convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); + item_text = convertView.findViewById(R.id.item_text); convertView.setTag(item_text); - }else { + } else { item_text = (TextView) convertView.getTag(); } - if (position%2==1) { + if (position % 2 == 1) { item_text.setBackgroundColor(Color.parseColor("#e3f1fc")); item_text.setTextColor(Color.parseColor("#9dd2fc")); - } - else { + } else { item_text.setBackgroundColor(Color.parseColor("#ffffff")); item_text.setTextColor(Color.parseColor("#cccccc")); } 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 b91d96b..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,30 +1,29 @@ 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 com.bartoszlipinski.recyclerviewheader2.RecyclerViewHeader; +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; import java.util.List; -public class Demo3Activity extends AppCompatActivity{ +public class Demo3Activity extends AppCompatActivity { private List mDatas = new ArrayList(); private RecyclerView recyclerView; @@ -35,63 +34,48 @@ 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图片资源,是否显示文字 - springView.setFooter(new AliFooter(this,false)); + springView.setHeader(new AliHeader(this, R.drawable.ali, true)); //参数为:logo图片资源,是否显示文字 + springView.setFooter(new AliFooter(this, false)); } - 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可以图片可自行替换":"")); + private void initData() { + for (int i = 0; i < 14; i++) { + mDatas.add(i == 0 ? "We are in RecyclerView" : (i == 3 ? "SpringView支持RecyclerView\n\n这是一个仿阿里旅行的header\n\nlogo可以图片可自行替换" : "")); } } - public void onClick(View v){ - switch (v.getId()){ + public void onClick(View v) { + switch (v.getId()) { case R.id.add: { mDatas.add("add item"); - recyclerViewAdapter.notifyItemInserted(mDatas.size()-1); + recyclerViewAdapter.notifyItemInserted(mDatas.size() - 1); break; } case R.id.sub: - if (mDatas.size()>0) { + if (mDatas.size() > 0) { int position = mDatas.size() - 1; mDatas.remove(position); recyclerViewAdapter.notifyItemRemoved(position); @@ -101,37 +85,46 @@ 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 { + } else { holder.text_item.setBackgroundColor(Color.parseColor("#ffffff")); holder.text_item.setTextColor(Color.parseColor("#cccccc")); } } + @Override public int getItemCount() { return results.size(); } - public class SampleViewHolder extends RecyclerView.ViewHolder { - public TextView text_item; - public SampleViewHolder(View view) { + + class SampleViewHolder extends RecyclerView.ViewHolder { + TextView text_item; + + 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 92988c8..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,29 +3,29 @@ 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; import com.liaoinstan.demospring.R; -public class Demo4Activity extends AppCompatActivity{ +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 09cc1cd..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 @@ -33,7 +30,7 @@ public void onRefresh() { public void onLoadmore() { } }); - springView.setHeader(new AcFunHeader(this,R.drawable.acfun_header)); - springView.setFooter(new AcFunFooter(this,R.drawable.acfun_footer)); + springView.setHeader(new AcFunHeader(this, R.drawable.acfun_header)); + springView.setFooter(new AcFunFooter(this, R.drawable.acfun_footer)); } } 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 879519c..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,19 +1,18 @@ 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; import com.liaoinstan.springview.widget.SpringView; -public class Demo6Activity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener{ +public class Demo6Activity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener { private SpringView springView; @@ -21,52 +20,36 @@ public class Demo6Activity extends AppCompatActivity implements RadioGroup.OnCh 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); + ((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.setFooter(new DefaultFooter(this,R.drawable.progress_small)); + springView.setHeader(new QQHeader().setMovePara(1.5f)); //设置拖拽系数(值越大,移动越慢) + springView.setFooter(new DefaultFooter(this, R.drawable.progress_small)); } @Override public void onCheckedChanged(RadioGroup group, int checkedId) { - switch (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 a639939..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,20 +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 Administrator on 2016/3/23. + * 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; } @@ -35,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 @@ -52,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 e4cb298..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,59 +1,47 @@ 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 android.util.Log; -import android.view.View; + +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{ +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}; + //下拉过程动画 + 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)); - springView.setFooter(new MeituanFooter(this,loadingAnimSrcs)); + springView.setHeader(new MeituanHeader(this, pullAnimSrcs, refreshAnimSrcs)); + springView.setFooter(new MeituanFooter(this, loadingAnimSrcs)); } } 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 d6b0cae..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.Handler; -import android.support.v7.app.AppCompatActivity; import android.os.Bundle; -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 android.os.Handler; + +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)); @@ -70,32 +60,31 @@ public void run() { itemTouchHelper.attachToRecyclerView(recyclerView); } - private void initData(){ + 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 09bd969..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,20 +1,21 @@ package com.liaoinstan.demospring.demo8; import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.drawable.Drawable; -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 { private ItemTouchAdapter itemTouchAdapter; - public MyItemTouchCallback(ItemTouchAdapter itemTouchAdapter){ + + public MyItemTouchCallback(ItemTouchAdapter itemTouchAdapter) { this.itemTouchAdapter = itemTouchAdapter; } @@ -30,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; @@ -43,21 +44,21 @@ 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); + itemTouchAdapter.onMove(fromPosition, toPosition); return true; } @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(); @@ -70,6 +71,7 @@ public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHo public interface ItemTouchAdapter { void onMove(int fromPosition, int toPosition); + void onSwiped(int position); } } diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9Activity.java b/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9Activity.java new file mode 100644 index 0000000..aa55166 --- /dev/null +++ b/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9Activity.java @@ -0,0 +1,72 @@ +package com.liaoinstan.demospring.demo9; + +import android.os.Bundle; +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; + private PagerAdapter adapterPager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_demo9); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + 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; + + PagerAdapter(FragmentManager fm, String[] titles) { + super(fm); + this.titles = titles; + } + + @Override + public CharSequence getPageTitle(int position) { + return titles[position]; + } + + @Override + public int getCount() { + return titles.length; + } + + @Override + public Fragment getItem(int position) { + switch (position) { + case 0: + return Demo9FragmentScrollView.newInstance(position); + case 1: + return Demo9FragmentRecyclerView.newInstance(position); + case 2: + return Demo9FragmentNote.newInstance(position); + default: + return null; + } + } + } +} diff --git a/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentNote.java b/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentNote.java new file mode 100644 index 0000000..fcf14de --- /dev/null +++ b/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentNote.java @@ -0,0 +1,73 @@ +package com.liaoinstan.demospring.demo9; + +import android.os.Bundle; +import android.os.Handler; +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.rotationheader.RotationFooter; +import com.liaoinstan.springview.rotationheader.RotationHeader; +import com.liaoinstan.springview.widget.SpringView; + + +/** + * Created by liaoinstan + */ +public class Demo9FragmentNote extends Fragment { + + private int position; + private View rootView; + + private SpringView springView; + + public static Fragment newInstance(int position) { + Demo9FragmentNote fragment = new Demo9FragmentNote(); + Bundle bundle = new Bundle(); + bundle.putInt("position", position); + fragment.setArguments(bundle); + return fragment; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + this.position = getArguments().getInt("position"); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + rootView = inflater.inflate(R.layout.fragment_demo9_note, container, false); + return rootView; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + initView(); + } + + private void initView() { + //初始化SpringView + 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(() -> springView.onFinishFreshAndLoad(), 1000); + } + + @Override + public void onLoadmore() { + 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 new file mode 100644 index 0000000..b0aeeea --- /dev/null +++ b/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentRecyclerView.java @@ -0,0 +1,143 @@ +package com.liaoinstan.demospring.demo9; + +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 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.aliheader.AliFooter; +import com.liaoinstan.springview.aliheader.AliHeader; +import com.liaoinstan.springview.widget.SpringView; + +import java.util.ArrayList; +import java.util.List; + + +/** + * Created by liaoinstan + */ +public class Demo9FragmentRecyclerView extends Fragment { + + private int position; + private View rootView; + + private RecyclerView recyclerView; + private RecyclerViewAdapter recyclerViewAdapter; + private SpringView springView; + private List mDatas = new ArrayList(); + + public static Fragment newInstance(int position) { + Demo9FragmentRecyclerView fragment = new Demo9FragmentRecyclerView(); + Bundle bundle = new Bundle(); + bundle.putInt("position", position); + fragment.setArguments(bundle); + return fragment; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + this.position = getArguments().getInt("position"); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + rootView = inflater.inflate(R.layout.fragment_demo9_recyclerview, container, false); + return rootView; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + initData(); + initView(); + } + + private void initView() { + //初始化recyclerView + recyclerView = rootView.findViewById(R.id.recycle); + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + recyclerViewAdapter = new RecyclerViewAdapter(mDatas); + recyclerView.setAdapter(recyclerViewAdapter); + //初始化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(() -> springView.onFinishFreshAndLoad(), 1000); + } + + @Override + public void onLoadmore() { + new Handler().postDelayed(() -> { + mDatas.add("add item"); + recyclerViewAdapter.notifyItemInserted(mDatas.size() - 1); + springView.onFinishFreshAndLoad(); + }, 1000); + } + }); + } + + private void initData() { + for (int i = 0; i < 9; i++) { + mDatas.add(i == 0 ? "We are in RecyclerView" : (i == 1 ? "单个拖拽事件能够在AppBarLayout、SpringView\n和RecyclerView中自由地传递和切换\n\n按住RecyclerView不断上下拖拽试试" : "")); + } + } + + /** + * Adapter for RecyclerView + */ + private class RecyclerViewAdapter extends RecyclerView.Adapter { + private List results; + + RecyclerViewAdapter(List results) { + this.results = results; + } + + @NonNull + @Override + 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(@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")); + holder.text_item.setTextColor(Color.parseColor("#cccccc")); + } else { + holder.text_item.setBackgroundColor(Color.parseColor("#bce1d8")); + holder.text_item.setTextColor(Color.parseColor("#ffffff")); + } + } + + @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/demo9/Demo9FragmentScrollView.java b/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentScrollView.java new file mode 100644 index 0000000..839d15a --- /dev/null +++ b/demo/src/main/java/com/liaoinstan/demospring/demo9/Demo9FragmentScrollView.java @@ -0,0 +1,73 @@ +package com.liaoinstan.demospring.demo9; + +import android.os.Bundle; +import android.os.Handler; + +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.aliheader.AliFooter; +import com.liaoinstan.springview.aliheader.AliHeader; +import com.liaoinstan.springview.widget.SpringView; + + +/** + * Created by liaoinstan + */ +public class Demo9FragmentScrollView extends Fragment { + + private int position; + private View rootView; + + private SpringView springView; + + public static Fragment newInstance(int position) { + Demo9FragmentScrollView fragment = new Demo9FragmentScrollView(); + Bundle bundle = new Bundle(); + bundle.putInt("position", position); + fragment.setArguments(bundle); + return fragment; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + this.position = getArguments().getInt("position"); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + rootView = inflater.inflate(R.layout.fragment_demo9_scrollview, container, false); + return rootView; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + initView(); + } + + private void initView() { + //初始化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(() -> springView.onFinishFreshAndLoad(), 1000); + } + + @Override + public void onLoadmore() { + 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 cdfb9fb..9b62cd7 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/test/TestActivity.java +++ b/demo/src/main/java/com/liaoinstan/demospring/test/TestActivity.java @@ -4,14 +4,15 @@ import android.os.Bundle; import android.os.Handler; import android.view.View; +import android.widget.CheckBox; +import android.widget.CompoundButton; import android.widget.RadioGroup; import android.widget.Toast; - import com.liaoinstan.demospring.R; import com.liaoinstan.springview.widget.SpringView; -public class TestActivity extends Activity implements RadioGroup.OnCheckedChangeListener{ +public class TestActivity extends Activity implements RadioGroup.OnCheckedChangeListener, CompoundButton.OnCheckedChangeListener { private SpringView springView; @Override @@ -19,44 +20,43 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); - ((RadioGroup)findViewById(R.id.group_type)).setOnCheckedChangeListener(this); - ((RadioGroup)findViewById(R.id.group_give)).setOnCheckedChangeListener(this); + ((RadioGroup) findViewById(R.id.group_type)).setOnCheckedChangeListener(this); + ((RadioGroup) findViewById(R.id.group_give)).setOnCheckedChangeListener(this); + ((CheckBox) findViewById(R.id.check_enableheader)).setOnCheckedChangeListener(this); + ((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); } }); } @Override public void onCheckedChanged(RadioGroup group, int checkedId) { - switch (checkedId){ + switch (checkedId) { case R.id.overlap: springView.setType(SpringView.Type.OVERLAP); break; 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; @@ -71,5 +71,25 @@ public void onCheckedChanged(RadioGroup group, int checkedId) { break; } } + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + switch (buttonView.getId()) { + case R.id.check_enableheader: + springView.setEnableHeader(!isChecked); + break; + case R.id.check_enableFooter: + springView.setEnableFooter(!isChecked); + break; + } + } + + 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 1db6157..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,69 +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.demospring.demo6.QQHeader; -import com.liaoinstan.springview.container.DefaultFooter; -import com.liaoinstan.springview.container.DefaultHeader; -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.dip2px(this,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 6171012..64ca40f 100644 --- a/demo/src/main/java/com/liaoinstan/demospring/warning/WarningHeader.java +++ b/demo/src/main/java/com/liaoinstan/demospring/warning/WarningHeader.java @@ -9,17 +9,17 @@ import com.liaoinstan.springview.container.BaseHeader; /** - * Created by Administrator on 2016/3/28. + * Created by liaoinstan on 2016/3/28. */ -public class WarningHeader extends BaseHeader{ +public class WarningHeader extends BaseHeader { private TextView textView; private int i = 0; @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; } @@ -36,7 +36,7 @@ public void onDropAnim(View rootView, int dy) { @Override public void onLimitDes(View rootView, boolean upORdown) { i++; - textView.setText("this is TextView "+i); + textView.setText("this is TextView " + i); } @Override 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-hdpi/bk_test.jpg b/demo/src/main/res/drawable-hdpi/bk_test.jpg new file mode 100644 index 0000000..4021125 Binary files /dev/null and b/demo/src/main/res/drawable-hdpi/bk_test.jpg differ 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 f562d1f..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 3266158..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="#f9f9f9" + android:divider="@null" /> + android:layout_gravity="bottom|right" + android:layout_marginBottom="90dp" + android:layout_marginRight="20dp" + android:orientation="vertical"> +