diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..1f8ff36e --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +custom: ['https://www.paypal.me/scwang90'] diff --git a/.github/ISSUE_TEMPLATE/------.md b/.github/ISSUE_TEMPLATE/------.md new file mode 100644 index 00000000..c7ec1ee5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/------.md @@ -0,0 +1,94 @@ +--- +name: 提交错误报告 +about: 提交一份详细错误报告,方便我们更好到改进 +title: '' +labels: '' +assignees: '' + +--- + +**详细描述** +对问题进行清晰而简明的描述,把握问题的关键点。 + +**使用版本** +```gradle +implementation 'com.scwang.smartrefresh:SmartRefreshLayout:x.x.x' +implementation 'com.scwang.smartrefresh:SmartRefreshHeader:x.x.x' +``` +**使用代码** +```java +SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() { + @Override + public RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) { + return new ClassicsHeader(context).setSpinnerStyle(SpinnerStyle.Translate); + } + }); + SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() { + @Override + public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) { + return new ClassicsFooter(context).setSpinnerStyle(SpinnerStyle.Translate); + } + }); +RefreshLayout refreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout); +refreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(RefreshLayout refreshlayout) { + refreshlayout.finishRefresh(2000); + } +}); +refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(RefreshLayout refreshlayout) { + refreshlayout.finishLoadMore(2000); + } +}); +``` + +**布局代码** +```xml + + + + + +``` + +**问题重现** +问题重现操作不走: +1. 进入主页 '...' +2.点击按钮 '....' +3.滚动列表 '....' +4.发现问题 + +**预期行为** +对你期望发生的事情的清晰而简明的描述。 + +**屏幕截图** +如果适用,添加屏幕截图以帮助解释您的问题。 + +**设备信息** +请填写一下你运行设备的信息,信息越全越有助于我理解问题 + - 设备名: [e.g. 华为P20] + - Android版本: [e.g. Android 7.0] + - 设备型号 [e.g. ] + - 系统版本(手机厂商定制rom) + +**附加信息** +在此处添加任何有关该问题的任何其他说明。 diff --git a/.github/ISSUE_TEMPLATE/-----.md b/.github/ISSUE_TEMPLATE/-----.md new file mode 100644 index 00000000..e7889b77 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/-----.md @@ -0,0 +1,14 @@ +--- +name: 自定义提交 +about: 自定义没有固定的格式,不过希望提供足够多的信息 +title: "[提问不要在这里请加群,有疑问请先查看常见问题、提问历史、阅读源码。]" +labels: invalid +assignees: '' + +--- + +**具体说下** +... + +**为什么** +... diff --git a/.github/ISSUE_TEMPLATE/--bug--.md b/.github/ISSUE_TEMPLATE/--bug--.md new file mode 100644 index 00000000..b65fbf2c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/--bug--.md @@ -0,0 +1,94 @@ +--- +name: 提交BUG报告 +about: 创建一个bug详情报告,以方便我们更好地改进 +title: "[不是bug或者不确定是bug,请使用错误报告模板]" +labels: bug +assignees: '' + +--- + +**详细描述** +对问题进行清晰而简明的描述,把握问题的关键点。 + +**使用版本** +```gradle +implementation 'com.scwang.smartrefresh:SmartRefreshLayout:x.x.x' +implementation 'com.scwang.smartrefresh:SmartRefreshHeader:x.x.x' +``` +**使用代码** +```java +SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() { + @Override + public RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) { + return new ClassicsHeader(context).setSpinnerStyle(SpinnerStyle.Translate); + } + }); + SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() { + @Override + public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) { + return new ClassicsFooter(context).setSpinnerStyle(SpinnerStyle.Translate); + } + }); +RefreshLayout refreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout); +refreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(RefreshLayout refreshlayout) { + refreshlayout.finishRefresh(2000); + } +}); +refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(RefreshLayout refreshlayout) { + refreshlayout.finishLoadMore(2000); + } +}); +``` + +**布局代码** +```xml + + + + + +``` + +**问题重现** +问题重现操作不走: +1. 进入主页 '...' +2.点击按钮 '....' +3.滚动列表 '....' +4.发现问题 + +**预期行为** +对你期望发生的事情的清晰而简明的描述。 + +**屏幕截图** +如果适用,添加屏幕截图以帮助解释您的问题。 + +**设备信息** +请填写一下你运行设备的信息,信息越全越有助于我理解问题 + - 设备名: [e.g. 华为P20] + - Android版本: [e.g. Android 7.0] + - 设备型号 [e.g. ] + - 系统版本(手机厂商定制rom) + +**附加信息** +在此处添加任何有关该问题的任何其他说明。 diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..c8afd174 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,89 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: help wanted +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**Version** +```gradle +implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' +implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0' //If you use the special Header +``` + +**Layout** +```xml + + + + +``` + +**Config** +```java +SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() { + @Override + public RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) { + return new ClassicsHeader(context).setSpinnerStyle(SpinnerStyle.Translate); + } + }); + SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() { + @Override + public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) { + return new ClassicsFooter(context).setSpinnerStyle(SpinnerStyle.Translate); + } + }); +RefreshLayout refreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout); +refreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(RefreshLayout refreshlayout) { + refreshlayout.finishRefresh(2000); + } +}); +refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(RefreshLayout refreshlayout) { + refreshlayout.finishLoadMore(2000); + } +}); +``` + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 00000000..3071e5de --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,17 @@ +name: Android CI + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Build with Gradle + run: ./gradlew build diff --git a/.gitignore b/.gitignore index 4909f7d0..4cd31e44 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,10 @@ *.iml -.gradle -gradle +*.txt +.* +build +release +/art +/repo /local.properties -/.idea -/build -/gradlew -/gradlew.bat -/gradle.properties /bintrayUpload-key.bat + diff --git a/.idea/dictionaries/Administrator.xml b/.idea/dictionaries/Administrator.xml new file mode 100644 index 00000000..a6d1a3bc --- /dev/null +++ b/.idea/dictionaries/Administrator.xml @@ -0,0 +1,7 @@ + + + + footerke + + + \ No newline at end of file diff --git a/.idea/dictionaries/SCWANG.xml b/.idea/dictionaries/SCWANG.xml new file mode 100644 index 00000000..0e048c25 --- /dev/null +++ b/.idea/dictionaries/SCWANG.xml @@ -0,0 +1,7 @@ + + + + scwang + + + \ No newline at end of file diff --git a/.idea/dictionaries/mi.xml b/.idea/dictionaries/mi.xml new file mode 100644 index 00000000..0e51291e --- /dev/null +++ b/.idea/dictionaries/mi.xml @@ -0,0 +1,9 @@ + + + + clinit + refreshlayout + smartrefresh + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 00000000..92f6ef2d --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..8e44652c --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 6f898f5f..7542ad29 100644 --- a/README.md +++ b/README.md @@ -2,32 +2,48 @@ [![License](https://img.shields.io/badge/License%20-Apache%202-337ab7.svg)](https://www.apache.org/licenses/LICENSE-2.0) [![Arsenal](https://img.shields.io/badge/Arsenal%20-%20SmartRefresh-4cae4c.svg)](https://android-arsenal.com/details/1/6001) -[![JCenter](https://img.shields.io/badge/%20JCenter%20-1.1.0-5bc0de.svg)](https://bintray.com/scwang90/maven/SmartRefreshLayout/_latestVersion) +[![JCenter](https://img.shields.io/badge/%20JCenter%20-1.1.2-5bc0de.svg)](https://bintray.com/scwang90/maven/SmartRefreshLayout/_latestVersion) [![MinSdk](https://img.shields.io/badge/%20MinSdk%20-%2012%2B%20-f0ad4e.svg)](https://android-arsenal.com/api?level=12) -[![Methods](https://img.shields.io/badge/Methods%20%7C%20Size%20-%20901%20%7C%20121%20KB-d9534f.svg)](http://www.methodscount.com/?lib=com.scwang.smartrefresh%3ASmartRefreshLayout%3A1.0.4) +[![Methods](https://img.shields.io/badge/Methods%20%7C%20Size%20-%20784%20%7C%20121%20KB-d9534f.svg)](http://www.methodscount.com/?lib=com.scwang.smartrefresh%3ASmartRefreshLayout%3A1.0.4) ## [English](https://github.com/scwang90/SmartRefreshLayout/blob/master/README_EN.md) | 中文 -正如名字所说,SmartRefreshLayout是一个“聪明”或者“智能”的下拉刷新布局,由于它的“智能”,它不只是支持所有的View,还支持多层嵌套的视图结构。它继承自ViewGroup 而不是FrameLayout或LinearLayout,提高了性能。 -也吸取了现在流行的各种刷新布局的优点,包括谷歌官方的 [SwipeRefreshLayout](https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html),其他第三方的 [Ultra-Pull-To-Refresh](https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh)、[TwinklingRefreshLayout](https://github.com/lcodecorex/TwinklingRefreshLayout) 。还集成了各种炫酷的 Header 和 Footer。 -SmartRefreshLayout的目标是打造一个强大,稳定,成熟的下拉刷新框架,并集成各种的炫酷、多样、实用、美观的Header和Footer。 +SmartRefreshLayout以打造一个强大,稳定,成熟的下拉刷新框架为目标,并集成各种的炫酷、多样、实用、美观的Header和Footer。 +正如名字所说,SmartRefreshLayout是一个“聪明”或者“智能”的下拉刷新布局,由于它的“智能”,它不只是支持所有的View,还支持多层嵌套的视图结构。 +它继承自ViewGroup 而不是FrameLayout或LinearLayout,提高了性能。 +也吸取了现在流行的各种刷新布局的优点,包括谷歌官方的 [SwipeRefreshLayout](https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html), +其他第三方的 [Ultra-Pull-To-Refresh](https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh)、[TwinklingRefreshLayout](https://github.com/lcodecorex/TwinklingRefreshLayout) 。 +还集成了各种炫酷的 Header 和 Footer。 + +注:本库也在开源中国上开源,如果有时候github出现下载缓慢问题可以转到[开源中国](https://gitee.com/scwang90/SmartRefreshLayout)下载或clone,记得star哦. ## 特点功能: + - 支持[横向刷新](https://github.com/scwang90/SmartRefreshHorizontal) - 支持多点触摸 - 支持淘宝二楼和二级刷新 - 支持嵌套多层的视图结构 Layout (LinearLayout,FrameLayout...) - 支持所有的 View(AbsListView、RecyclerView、WebView....View) - 支持自定义并且已经集成了很多炫酷的 Header 和 Footer. - - 支持和ListView的无缝同步滚动 和 CoordinatorLayout 的嵌套滚动 . + - 支持和 ListView 的无缝同步滚动 和 CoordinatorLayout 的嵌套滚动 . - 支持自动刷新、自动上拉加载(自动检测列表惯性滚动到底部,而不用手动上拉). - 支持自定义回弹动画的插值器,实现各种炫酷的动画效果. - - 支持设置主题来适配任何场景的App,不会出现炫酷但很尴尬的情况. + - 支持设置主题来适配任何场景的 App,不会出现炫酷但很尴尬的情况. - 支持设多种滑动方式:平移、拉伸、背后固定、顶层固定、全屏 - 支持所有可滚动视图的越界回弹 + - 支持 Header 和 Footer 交换混用 + - 支持AndroidX + +## 每天领红包 + +最近开通了支付宝商家,生成了个红包二维码,经常用支付宝的童鞋可有扫码领优惠红包,扫码只会拿红包,不会有任何损失,每天都可以扫码哦! + +![支付宝红包](https://github.com/scwang90/MultiWaveHeader/blob/master/art/pay_alipay_red_packet.png?raw=true) + +> 你也可以在支付宝中直接搜索 **553866294** 来获取红包。如果得到的是花呗红包,也不用失望。如果你经常使用信用卡的话那么使用花呗红包非常适合你,它也和信用卡一样先消费后还款,关键是每天都能扫红包省钱! ## 传送门 @@ -102,17 +118,20 @@ SmartRefreshLayout的目标是打造一个强大,稳定,成熟的下拉刷 ## 简单用例 #### 1.在 build.gradle 中添加依赖 + +[【V2.0.0】](https://github.com/scwang90/SmartRefreshLayout/tree/master#%E7%AE%80%E5%8D%95%E7%94%A8%E4%BE%8B) 版本已经在开发,主要是对各个功能类进行分包,比如不用二级刷新就不依赖,避免代码冗余,欢迎大家来体验 + +``` +implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.3' //1.0.5及以前版本的老用户升级需谨慎,API改动过大 +implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.3' //没有使用特殊Header,可以不加这行 + ``` -//1.1.0 API改动过大,老用户升级需谨慎 -compile 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-14' -compile 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0-alpha-14'//没有使用特殊Header,可以不加这行 -compile 'com.android.support:appcompat-v7:25.3.1'//版本 23以上(必须) - -//1.0.5 当1.1.0出现问题可以回退到1.0.5.1 -compile 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.5.1' -compile 'com.scwang.smartrefresh:SmartRefreshHeader:1.0.5.1'//没有使用特殊Header,可以不加这行 -compile 'com.android.support:appcompat-v7:25.3.1'//版本 23以上(必须) -compile 'com.android.support:design:25.3.1'//版本随意(非必须,引用可以解决无法预览问题) +如果使用 AndroidX 在 gradle.properties 中添加 + +``` +android.useAndroidX=true +android.enableJetifier=true + ``` #### 2.在XML布局文件中添加 SmartRefreshLayout @@ -197,7 +216,7 @@ public class App extends Application { 如果希望捐赠之后能获得相关的帮助,可以选择加入下面的付费群来取代普通捐赠,付费群可以直接获得作者的直接帮助,与问题反馈。 如果在捐赠留言中备注名称,将会被记录到列表中~ 如果你也是github开源作者,捐赠时可以留下github项目地址或者个人主页地址,链接将会被添加到列表中起到互相推广的作用 [捐赠列表](https://github.com/scwang90/SmartRefreshLayout/blob/master/art/md_donationlist.md) #### 友情链接 +[github/Loror](https://github.com/Loror) +[github/faith-hb/WidgetCase](https://github.com/faith-hb/WidgetCase) +[github/Bamboy120315/Freedom](https://github.com/Bamboy120315/Freedom) +[github/TommyLemon/APIJSON](https://github.com/TommyLemon/APIJSON) +[github/dengyuhan](https://github.com/dengyuhan) [github/zrp2017](https://github.com/zrp2017) [github/fly803/BaseProject](https://github.com/fly803/BaseProject) [github/razerdp](https://github.com/razerdp) @@ -246,11 +278,11 @@ SmartRefreshLayout 没有使用到:序列化、反序列化、JNI、反射, [github/addappcn](https://github.com/addappcn) [github/RainliFu](https://github.com/RainliFu) [github/sugarya](https://github.com/sugarya) -[github/stormzhang](https://github.com/stormzhang) +[github/stormzhang](https://github.com/stormzhang) ## 讨论 -### QQ解决群 - 602537182 (付费) +### QQ解决群 - 602537182 (付费) #### 进群须知 自开群以来,还是有很多的朋友提出了很多问题,我也解决了很多问题,其中有大半问题是本库的Bug导致,也有些是使用者项目本 身的环境问题,这花费了我大量的时间,经过我的观察和测试,到目前为止,本库的bug已经越来越少,当然不能说完全没有,但是 @@ -259,7 +291,7 @@ SmartRefreshLayout 没有使用到:序列化、反序列化、JNI、反射, 我也有自己的工作和娱乐时间,只有大家理解和支持我,我才能专心的为大家解决问题。不过用担心,我已经建立了另一个可以免费 进入的QQ讨论群。 -### QQ讨论群 - 477963933 (新) 538979188 (满) +### QQ讨论群 - 914275312 (新) 477963933 (满) 538979188 (满) #### 进群须知 这个群,免费进入,大家可以相互讨论本库的相关使用和出现的问题,群主也会在里面解决问题,如果提出的问题,群成员不能帮助 解决,需要群主解决,但是要花费群主五分钟以上的时间(本库Bug除外),群主将不会解决这个问题,如果项目紧急,请付费进入解 diff --git a/README_EN.md b/README_EN.md index 363ca196..17cfdf55 100644 --- a/README_EN.md +++ b/README_EN.md @@ -2,14 +2,12 @@ [![License](https://img.shields.io/badge/License%20-Apache%202-337ab7.svg)](https://www.apache.org/licenses/LICENSE-2.0) [![Arsenal](https://img.shields.io/badge/Arsenal%20-%20SmartRefresh-4cae4c.svg)](https://android-arsenal.com/details/1/6001) -[![JCenter](https://img.shields.io/badge/%20Jcenter%20-1.1.0-5bc0de.svg)](https://bintray.com/scwang90/maven/SmartRefreshLayout/_latestVersion) +[![JCenter](https://img.shields.io/badge/%20Jcenter%20-1.1.2-5bc0de.svg)](https://bintray.com/scwang90/maven/SmartRefreshLayout/_latestVersion) [![MinSdk](https://img.shields.io/badge/%20MinSdk%20-%2012%2B%20-f0ad4e.svg)](https://android-arsenal.com/api?level=12) -[![Methods](https://img.shields.io/badge/Methods%20%7C%20Size%20-%20901%20%7C%20122%20KB-d9534f.svg)](http://www.methodscount.com/?lib=com.scwang.smartrefresh%3ASmartRefreshLayout%3A1.1.0) +[![Methods](https://img.shields.io/badge/Methods%20%7C%20Size%20-%20784%20%7C%20122%20KB-d9534f.svg)](http://www.methodscount.com/?lib=com.scwang.smartrefresh%3ASmartRefreshLayout%3A1.1.0) ## English | [中文](README.md) -As the name says, SmartRefreshLayout is a "smart" or "intelligent" pull-down refresh layout,because of its "smart", it does not just support all the Views , but also support multi-layered nested view structures. -It extends from ViewGroup rather than FrameLayout or LinearLayout, this not only improves its performance, but also enables it to absorb the advantages of various refresh layouts in fashion now,Including Google official [SwipeRefreshLayout](https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html)、[TwinklingRefreshLayout](https://github.com/lcodecorex/TwinklingRefreshLayout) 、[Ultra-Pull-To-Refresh](https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh). Also it integrates various cool Headers and Footers. SmartRefreshLayout's goal is to build a strong, stable and mature pull-down refresh layout framework, and to integrate all kinds of cool, diverse, practical and beautiful Headers and Footers. ## Features @@ -25,6 +23,9 @@ SmartRefreshLayout's goal is to build a strong, stable and mature pull-down refr - Support setting a variety of transformations (Translation, stretching, behind fixed, top fixed, full screen view) for Headers and Footers. - Support rewrite and extension, internal implementation without private methods and fields. - Support automatically cross-border rebound for all rolling Views (Listview、RecyclerView、ScrollView、WebView...View). + - Support the interchange of Header and Footer + - Support AndroidX + - Support [HorizontalRefresh](https://github.com/scwang90/SmartRefreshHorizontal) ## Gateway @@ -97,12 +98,20 @@ Please rest assured that I have divided it into three packages, when used to ref ## Usage #### 1.Add a gradle dependency. -``` -compile 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-14' -compile 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0-alpha-14'//If you use the special Header -compile 'com.android.support:appcompat-v7:25.3.1' +[【V2.0.0】](https://github.com/scwang90/SmartRefreshLayout/blob/master/README_EN.md#1add-a-gradle-dependency) +main change is to subcontract SmartRefreshLayout to reduce unnecessary dependencies and avoid code redundancy. +welcome to experience. +``` +implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.3' +implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.3' //If you use the special Header +``` +If you use AndroidX, add it to gradle.properties + +``` +android.useAndroidX=true +android.enableJetifier=true ``` #### 2.Add SmartRefreshLayout in the layout xml. @@ -183,7 +192,7 @@ Note: this method is the lowest priority. - + @@ -150,6 +150,9 @@ + \ No newline at end of file diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png index f34d7e7f..9af9a7a2 100644 Binary files a/app/src/main/ic_launcher-web.png and b/app/src/main/ic_launcher-web.png differ diff --git a/app/src/main/java/com/scwang/refreshlayout/App.java b/app/src/main/java/com/scwang/refreshlayout/App.java index 2f6beb97..c01f1c5b 100644 --- a/app/src/main/java/com/scwang/refreshlayout/App.java +++ b/app/src/main/java/com/scwang/refreshlayout/App.java @@ -1,51 +1,36 @@ package com.scwang.refreshlayout; import android.app.Application; -import android.content.Context; -import android.support.annotation.NonNull; import android.support.v7.app.AppCompatDelegate; import com.scwang.refreshlayout.util.DynamicTimeFormat; import com.scwang.smartrefresh.layout.SmartRefreshLayout; -import com.scwang.smartrefresh.layout.api.DefaultRefreshHeaderCreator; -import com.scwang.smartrefresh.layout.api.DefaultRefreshInitializer; -import com.scwang.smartrefresh.layout.api.RefreshHeader; -import com.scwang.smartrefresh.layout.api.RefreshLayout; import com.scwang.smartrefresh.layout.header.ClassicsHeader; import com.squareup.leakcanary.LeakCanary; /** * - * Created by SCWANG on 2017/6/11. + * Created by scwang on 2017/6/11. */ - public class App extends Application { static { //启用矢量图兼容 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); //设置全局默认配置(优先级最低,会被其他设置覆盖) - SmartRefreshLayout.setDefaultRefreshInitializer(new DefaultRefreshInitializer() { - @Override - public void initialize(@NonNull Context context, @NonNull RefreshLayout layout) { - //全局设置(优先级最低) - layout.setEnableLoadMore(false); - layout.setEnableAutoLoadMore(true); - layout.setEnableOverScrollDrag(false); - layout.setEnableOverScrollBounce(true); - layout.setEnableLoadMoreWhenContentNotFull(true); - layout.setEnableScrollContentWhenRefreshed(true); - } + SmartRefreshLayout.setDefaultRefreshInitializer((context, layout) -> { + //全局设置(优先级最低) + layout.setEnableAutoLoadMore(true); + layout.setEnableOverScrollDrag(false); + layout.setEnableOverScrollBounce(true); + layout.setEnableLoadMoreWhenContentNotFull(true); + layout.setEnableScrollContentWhenRefreshed(true); + layout.setPrimaryColorsId(R.color.colorPrimary, android.R.color.white); + layout.getLayout().setTag("close egg"); }); - SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() { - @NonNull - @Override - public RefreshHeader createRefreshHeader(@NonNull Context context, @NonNull RefreshLayout layout) { - //全局设置主题颜色(优先级第二低,可以覆盖 DefaultRefreshInitializer 的配置,与下面的ClassicsHeader绑定) - layout.setPrimaryColorsId(R.color.colorPrimary, android.R.color.white); - - return new ClassicsHeader(context).setTimeFormat(new DynamicTimeFormat("更新于 %s")); - } + SmartRefreshLayout.setDefaultRefreshHeaderCreator((context, layout) -> { + //全局设置主题颜色(优先级第二低,可以覆盖 DefaultRefreshInitializer 的配置,与下面的ClassicsHeader绑定) + return new ClassicsHeader(context).setTimeFormat(new DynamicTimeFormat("更新于 %s")); }); } @@ -59,4 +44,5 @@ public void onCreate() { } LeakCanary.install(this); } + } diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/FragmentActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/FragmentActivity.java index 7ff43e72..2a5346c9 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/FragmentActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/FragmentActivity.java @@ -18,9 +18,8 @@ /** * Fragment 容器页面 - * Created by SCWANG on 2017/10/10. + * Created by scwang on 2017/10/10. */ - @SuppressWarnings({"UnusedParameters", "unused"}) public class FragmentActivity extends AppCompatActivity { @@ -93,7 +92,6 @@ private Class getFragmentClass() throws ClassNotFoundException { public Fragment getFragment() { return mFragment; } - // diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/IndexMainActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/IndexMainActivity.java index 331f7308..0f984df3 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/IndexMainActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/IndexMainActivity.java @@ -68,10 +68,10 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_index_main); - final BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); + final BottomNavigationView navigation = findViewById(R.id.navigation); navigation.setOnNavigationItemSelectedListener(this); - ViewPager viewPager = (ViewPager) findViewById(R.id.content); + ViewPager viewPager = findViewById(R.id.content); viewPager.setAdapter(new FragmentStatePagerAdapter(getSupportFragmentManager()) { @Override public int getCount() { @@ -101,7 +101,7 @@ protected void onDestroy() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { - ((ViewPager) findViewById(R.id.content)).setCurrentItem(TabFragment.from(item.getItemId()).ordinal()); + ((ViewPager)findViewById(R.id.content)).setCurrentItem(TabFragment.from(item.getItemId()).ordinal()); // getSupportFragmentManager() // .beginTransaction() // .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/example/AssignCodeExampleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/example/AssignCodeExampleActivity.java index 72d0d186..26144f84 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/example/AssignCodeExampleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/example/AssignCodeExampleActivity.java @@ -26,7 +26,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_example_assign_code); - final Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); + final Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -35,11 +35,11 @@ public void onClick(View v) { }); - final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout); + final RefreshLayout refreshLayout = findViewById(R.id.refreshLayout); //设置 Header 为 Material风格 refreshLayout.setRefreshHeader(new MaterialHeader(this).setShowBezierWave(true)); //设置 Footer 为 球脉冲 - refreshLayout.setRefreshFooter(new BallPulseFooter(this).setSpinnerStyle(SpinnerStyle.Scale)); + refreshLayout.setRefreshFooter(new BallPulseFooter(this).setSpinnerStyle(SpinnerStyle.FixedBehind)); /* * 以下代码仅仅为了演示效果而已,不是必须的 @@ -50,7 +50,7 @@ public void onClick(View v) { if (isFirstEnter) { isFirstEnter = false; // //触发上拉加载 -// refreshLayout.autoLoadMore(250, 250, 1.5f); +// mRefreshLayout.autoLoadMore(250, 250, 1.5f); //通过多功能监听接口实现 在第一次加载完成之后 自动刷新 refreshLayout.setOnMultiPurposeListener(new SimpleMultiPurposeListener(){ @Override diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/example/AssignDefaultExampleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/example/AssignDefaultExampleActivity.java index 247e9845..6df3964c 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/example/AssignDefaultExampleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/example/AssignDefaultExampleActivity.java @@ -35,7 +35,7 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_example_assign_default); - final Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); + final Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -47,11 +47,11 @@ public void onClick(View v) { * 以下代码仅仅为了演示效果而已,不是必须的 * 关键代码在构造函数中 */ - final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout); + final RefreshLayout refreshLayout = findViewById(R.id.refreshLayout); if (isFirstEnter) { isFirstEnter = false; // //触发上拉加载 -// refreshLayout.autoLoadMore(); +// mRefreshLayout.autoLoadMore(); //通过多功能监听接口实现 在第一次加载完成之后 自动刷新 refreshLayout.setOnMultiPurposeListener(new SimpleMultiPurposeListener(){ @Override @@ -103,7 +103,7 @@ public RefreshFooter createRefreshFooter(@NonNull Context context, @NonNull Refr layout.setEnableLoadMoreWhenContentNotFull(true);//内容不满一页时候启用加载更多 ClassicsFooter footer = new ClassicsFooter(context); footer.setBackgroundResource(android.R.color.white); - footer.setSpinnerStyle(SpinnerStyle.Scale);//设置为拉伸模式 + footer.setSpinnerStyle(SpinnerStyle.FixedBehind);//设置为拉伸模式 return footer;//指定为经典Footer,默认是 BallPulseFooter } }); diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/example/AssignXmlExampleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/example/AssignXmlExampleActivity.java index 05b507e3..f7b70e71 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/example/AssignXmlExampleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/example/AssignXmlExampleActivity.java @@ -23,7 +23,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_example_assign_xml); - final Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); + final Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -35,11 +35,11 @@ public void onClick(View v) { * 以下代码仅仅为了演示效果而已,不是必须的 * 关键代码在 activity_example_assign_xml 中 */ - final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout); + final RefreshLayout refreshLayout = findViewById(R.id.refreshLayout); if (isFirstEnter) { isFirstEnter = false; // //触发上拉加载 -// refreshLayout.autoLoadMore(250, 250, 1.5f); +// mRefreshLayout.autoLoadMore(250, 250, 1.5f); //通过多功能监听接口实现 在第一次加载完成之后 自动刷新 refreshLayout.setOnMultiPurposeListener(new SimpleMultiPurposeListener(){ @Override diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/example/BasicExampleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/example/BasicExampleActivity.java index c45c40d8..77daa6ad 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/example/BasicExampleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/example/BasicExampleActivity.java @@ -1,7 +1,6 @@ package com.scwang.refreshlayout.activity.example; import android.os.Bundle; -import android.support.annotation.NonNull; import android.support.design.widget.BottomSheetDialog; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; @@ -9,7 +8,7 @@ import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.AbsListView; -import android.widget.AdapterView; +import android.widget.ListView; import android.widget.Toast; import com.scwang.refreshlayout.R; @@ -18,11 +17,12 @@ import com.scwang.smartrefresh.layout.api.RefreshFooter; import com.scwang.smartrefresh.layout.api.RefreshLayout; import com.scwang.smartrefresh.layout.footer.ClassicsFooter; -import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; -import com.scwang.smartrefresh.layout.listener.OnRefreshListener; import java.util.Arrays; import java.util.Collection; +import java.util.Random; + +import ezy.ui.layout.LoadingLayout; import static android.R.layout.simple_list_item_2; @@ -31,22 +31,20 @@ */ public class BasicExampleActivity extends AppCompatActivity { + private Random random = new Random(); private BaseRecyclerAdapter mAdapter; + private LoadingLayout mLoadingLayout; + private RefreshLayout mRefreshLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_example_basic); - final Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); - toolbar.setNavigationOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); + final Toolbar toolbar = findViewById(R.id.toolbar); + toolbar.setNavigationOnClickListener(v -> finish()); - AbsListView listView = (AbsListView) findViewById(R.id.listView); + ListView listView = findViewById(R.id.listView); listView.setAdapter(mAdapter = new BaseRecyclerAdapter(simple_list_item_2) { @Override protected void onBindViewHolder(SmartViewHolder holder, Void model, int position) { @@ -55,64 +53,69 @@ protected void onBindViewHolder(SmartViewHolder holder, Void model, int position holder.textColorId(android.R.id.text2, R.color.colorTextAssistant); } }); - - final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout); - refreshLayout.setEnableAutoLoadMore(true);//开启自动加载功能(非必须) - refreshLayout.setOnRefreshListener(new OnRefreshListener() { + //todo SCROLL_STATE_IDLE + listView.setOnScrollListener(new AbsListView.OnScrollListener() { + int SCROLL_STATE_IDLE = 0; + int SCROLL_STATE_TOUCH_SCROLL = 1; + int SCROLL_STATE_FLING = 2; @Override - public void onRefresh(@NonNull final RefreshLayout refreshLayout) { - refreshLayout.getLayout().postDelayed(new Runnable() { - @Override - public void run() { - mAdapter.refresh(initData()); - refreshLayout.finishRefresh(); - refreshLayout.setNoMoreData(false); - } - }, 2000); + public void onScrollStateChanged(AbsListView view, int scrollState) { + if (scrollState == SCROLL_STATE_IDLE) { + System.out.println("SCROLL_STATE_IDLE"); + } else if (scrollState == SCROLL_STATE_TOUCH_SCROLL) { + System.out.println("SCROLL_STATE_TOUCH_SCROLL"); + } else if (scrollState == SCROLL_STATE_FLING) { + System.out.println("SCROLL_STATE_FLING"); + } } - }); - refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { @Override - public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { - refreshLayout.getLayout().postDelayed(new Runnable() { - @Override - public void run() { - if (mAdapter.getItemCount() > 30) { - Toast.makeText(getApplication(), "数据全部加载完毕", Toast.LENGTH_SHORT).show(); - refreshLayout.finishLoadMoreWithNoMoreData();//将不会再次触发加载更多事件 - } else { - mAdapter.loadMore(initData()); - refreshLayout.finishLoadMore(); - } - } - }, 2000); + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + } }); + mLoadingLayout = findViewById(R.id.loading); + mRefreshLayout = findViewById(R.id.refreshLayout); + mRefreshLayout.setEnableAutoLoadMore(true);//开启自动加载功能(非必须) + mRefreshLayout.setOnRefreshListener(this::refresh); + mRefreshLayout.setOnLoadMoreListener(this::loadMore); + mLoadingLayout.setRetryListener(v -> { + mLoadingLayout.showContent(); + mRefreshLayout.autoRefresh(); + }); + + toolbar.setOnClickListener(v->{ + boolean ret = mRefreshLayout.autoRefresh(); + System.out.println("auto-autoRefresh="+ret); + mRefreshLayout.getLayout().postDelayed(()->{ + System.out.println("auto-1-finishRefresh-"+mRefreshLayout.getState()); + mRefreshLayout.finishRefresh(); + System.out.println("auto-2-finishRefresh-"+mRefreshLayout.getState()); + },600); + }); + //触发自动刷新 - refreshLayout.autoRefresh(); + mLoadingLayout.showContent(); + mRefreshLayout.autoRefresh(); //item 点击测试 - mAdapter.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - BottomSheetDialog dialog=new BottomSheetDialog(BasicExampleActivity.this); - View dialogView = View.inflate(getBaseContext(), R.layout.activity_example_basic, null); - RefreshLayout refreshLayout = (RefreshLayout) dialogView.findViewById(R.id.refreshLayout); - RecyclerView recyclerView = new RecyclerView(getBaseContext()); - recyclerView.setLayoutManager(new LinearLayoutManager(getBaseContext())); - recyclerView.setAdapter(mAdapter); - refreshLayout.setEnableRefresh(false); - refreshLayout.setEnableNestedScroll(false); - refreshLayout.setRefreshContent(recyclerView); - dialog.setContentView(dialogView); - dialog.show(); - } + mAdapter.setOnItemClickListener((parent, view, position, id) -> { + BottomSheetDialog dialog=new BottomSheetDialog(BasicExampleActivity.this); + View dialogView = View.inflate(getBaseContext(), R.layout.activity_example_basic, null); + RefreshLayout refreshLayout1 = dialogView.findViewById(R.id.refreshLayout); + RecyclerView recyclerView = new RecyclerView(getBaseContext()); + recyclerView.setLayoutManager(new LinearLayoutManager(getBaseContext())); + recyclerView.setAdapter(mAdapter); + refreshLayout1.setEnableRefresh(false); + refreshLayout1.setEnableNestedScroll(false); + refreshLayout1.setRefreshContent(recyclerView); + dialog.setContentView(dialogView); + dialog.show(); }); //点击测试 - RefreshFooter footer = refreshLayout.getRefreshFooter(); - if (footer != null) { - refreshLayout.getRefreshFooter().getView().findViewById(ClassicsFooter.ID_TEXT_TITLE).setOnClickListener(new View.OnClickListener() { + RefreshFooter footer = mRefreshLayout.getRefreshFooter(); + if (footer instanceof ClassicsFooter) { + mRefreshLayout.getRefreshFooter().getView().findViewById(ClassicsFooter.ID_TEXT_TITLE).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getBaseContext(), "点击测试", Toast.LENGTH_SHORT).show(); @@ -121,7 +124,56 @@ public void onClick(View v) { } } - private Collection initData() { - return Arrays.asList(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null); + private void loadMore(RefreshLayout layout) { + layout.getLayout().postDelayed(() -> { + if (random.nextBoolean()) { + //如果刷新成功 + mAdapter.loadMore(initData(10)); + if (mAdapter.getItemCount() <= 30) { + //还有多的数据 + layout.finishLoadMore(); + } else { + //没有更多数据(上拉加载功能将显示没有更多数据) + Toast.makeText(getApplication(), "数据全部加载完毕", Toast.LENGTH_SHORT).show(); + layout.finishLoadMoreWithNoMoreData();//将不会再次触发加载更多事件 + } + } else { + //刷新失败 + layout.finishLoadMore(false); + } + }, 2000); + } + + private void refresh(RefreshLayout refresh) { + refresh.getLayout().postDelayed(() -> { +// if (random.nextBoolean()) { + //如果刷新成功 + mAdapter.refresh(initData(40)); + if (mAdapter.getItemCount() <= 30) { + //还有多的数据 + refresh.finishRefresh(); + } else { + //没有更多数据(上拉加载功能将显示没有更多数据) + refresh.finishRefreshWithNoMoreData(); + } +// } else { +// //刷新失败 +// refresh.finishRefresh(false); +// if (mAdapter.isEmpty()) { +// mLoadingLayout.showError(); +// mLoadingLayout.setErrorText("随机触发刷新失败演示!"); +// } +// } + }, 2000); + } + + private Collection initData(int max) { + int min = Math.min(10, max); + max = Math.max(0, max); + if (max > min) { + return Arrays.asList(new Void[min + random.nextInt(max - min)]); + } else { + return Arrays.asList(new Void[min]); + } } } diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/example/CustomExampleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/example/CustomExampleActivity.java index 3128e48f..2a5a8fcb 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/example/CustomExampleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/example/CustomExampleActivity.java @@ -25,7 +25,7 @@ import com.scwang.smartrefresh.layout.internal.ArrowDrawable; import com.scwang.smartrefresh.layout.internal.ProgressDrawable; import com.scwang.smartrefresh.layout.listener.OnRefreshListener; -import com.scwang.smartrefresh.layout.util.DensityUtil; +import com.scwang.smartrefresh.layout.util.SmartUtil; import java.util.Arrays; import java.util.Collection; @@ -46,7 +46,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_example_custom); - final Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); + final Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -54,7 +54,7 @@ public void onClick(View v) { } }); - ListView listView = (ListView) findViewById(R.id.listView); + ListView listView = findViewById(R.id.listView); listView.setAdapter(mAdapter = new BaseRecyclerAdapter(simple_list_item_2) { @Override protected void onBindViewHolder(SmartViewHolder holder, Void model, int position) { @@ -64,7 +64,7 @@ protected void onBindViewHolder(SmartViewHolder holder, Void model, int position } }); - final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout); + final RefreshLayout refreshLayout = findViewById(R.id.refreshLayout); refreshLayout.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh(@NonNull final RefreshLayout refreshLayout) { @@ -114,11 +114,11 @@ public ClassicsHeader(Context context, AttributeSet attrs) { mProgressView = new ImageView(context); mProgressView.setImageDrawable(mProgressDrawable); mArrowView.setImageDrawable(new ArrowDrawable()); - addView(mProgressView, DensityUtil.dp2px(20), DensityUtil.dp2px(20)); - addView(mArrowView, DensityUtil.dp2px(20), DensityUtil.dp2px(20)); - addView(new Space(context), DensityUtil.dp2px(20), DensityUtil.dp2px(20)); + addView(mProgressView, SmartUtil.dp2px(20), SmartUtil.dp2px(20)); + addView(mArrowView, SmartUtil.dp2px(20), SmartUtil.dp2px(20)); + addView(new Space(context), SmartUtil.dp2px(20), SmartUtil.dp2px(20)); addView(mHeaderText, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); - setMinimumHeight(DensityUtil.dp2px(60)); + setMinimumHeight(SmartUtil.dp2px(60)); } @NonNull public View getView() { diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/example/I18nExampleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/example/I18nExampleActivity.java new file mode 100644 index 00000000..8ea8550e --- /dev/null +++ b/app/src/main/java/com/scwang/refreshlayout/activity/example/I18nExampleActivity.java @@ -0,0 +1,105 @@ +package com.scwang.refreshlayout.activity.example; + +import android.content.Intent; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.annotation.StringRes; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.util.DisplayMetrics; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ListView; + +import com.scwang.refreshlayout.R; +import com.scwang.refreshlayout.adapter.BaseRecyclerAdapter; +import com.scwang.refreshlayout.adapter.SmartViewHolder; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.header.ClassicsHeader; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; + +import static android.R.layout.simple_list_item_2; + +public class I18nExampleActivity extends AppCompatActivity implements AdapterView.OnItemClickListener { + + private enum Item { + i1(R.string.item_example_i18n_system), + i2(R.string.item_example_i18n_chinese), + i3(R.string.item_example_i18n_english), + ; + public int nameId; + Item(@StringRes int nameId) { + this.nameId = nameId; + } + } + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_example_i18n); + + Toolbar toolbar = findViewById(R.id.toolbar); + toolbar.setNavigationOnClickListener(v -> finish()); + + RefreshLayout refreshLayout = findViewById(R.id.refreshLayout); + if (refreshLayout != null) { + refreshLayout.autoRefresh();//第一次进入触发自动刷新,演示效果 + refreshLayout.setRefreshHeader(new ClassicsHeader(this)); + refreshLayout.setOnRefreshListener(layout -> layout.finishRefresh(1000)); + } + + View view = findViewById(R.id.listView); + if (view instanceof ListView) { + ListView listView = ((ListView) view); + List items = new ArrayList<>(); + items.addAll(Arrays.asList(Item.values())); + items.addAll(Arrays.asList(Item.values())); + listView.setAdapter(new BaseRecyclerAdapter(items, simple_list_item_2, this) { + @Override + protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { + holder.text(android.R.id.text1, model.nameId); + holder.text(android.R.id.text2, getString(R.string.item_example_i18n_click, getString(model.nameId))); + holder.textColorId(android.R.id.text2, R.color.colorTextAssistant); + } + }); + } + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + switch (Item.values()[position % Item.values().length].nameId) { + case R.string.item_example_i18n_system: + changeAppLanguage(Locale.getDefault()); + break; + case R.string.item_example_i18n_chinese: + changeAppLanguage(Locale.CHINESE); + break; + case R.string.item_example_i18n_english: + changeAppLanguage(Locale.ENGLISH); + break; + } + } + + private void changeAppLanguage(Locale locale) { + Resources res = getResources(); + DisplayMetrics dm = res.getDisplayMetrics(); + Configuration conf = res.getConfiguration(); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { + conf.locale = locale; + } else { + conf.setLocale(locale); + } + res.updateConfiguration(conf, dm); + startActivity(new Intent(this, getClass())); + overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); + finish(); + } +} diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/example/ListenerExampleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/example/ListenerExampleActivity.java index 09ec5c6a..def013dd 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/example/ListenerExampleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/example/ListenerExampleActivity.java @@ -49,7 +49,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_example_listener); - final Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); + final Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -57,10 +57,10 @@ public void onClick(View v) { } }); - mTvContent = (TextView) findViewById(R.id.content); + mTvContent = findViewById(R.id.content); mTvContent.setMovementMethod(ScrollingMovementMethod.getInstance()); - final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout); + final RefreshLayout refreshLayout = findViewById(R.id.refreshLayout); refreshLayout.setOnMultiPurposeListener(new SimpleMultiPurposeListener() { @Override diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/example/NestedLayoutExampleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/example/NestedLayoutExampleActivity.java index a1dca948..e0da5429 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/example/NestedLayoutExampleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/example/NestedLayoutExampleActivity.java @@ -21,6 +21,7 @@ import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; +import java.util.Locale; public class NestedLayoutExampleActivity extends AppCompatActivity implements AdapterView.OnItemClickListener { @@ -38,7 +39,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_example_region); - final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + final Toolbar toolbar = findViewById(R.id.toolbar); if (toolbar != null) { toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override @@ -61,7 +62,7 @@ protected void onBindViewHolder(SmartViewHolder holder, String model, int positi } }.setOnItemClickListener(this)); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { - DateFormat dateFormat = new SimpleDateFormat("hh:mm:ss SSS"); + DateFormat dateFormat = new SimpleDateFormat("hh:mm:ss SSS", Locale.CHINA); @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { Log.e("recyclerView", dateFormat.format(new Date()) + " - onScrollStateChanged - " + newState); @@ -78,7 +79,7 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { * 以下代码仅仅为了演示效果而已,不是必须的 * 关键代码在 activity_example_assign_xml 中 */ - final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout); + final RefreshLayout refreshLayout = findViewById(R.id.refreshLayout); if (isFirstEnter && refreshLayout != null) { isFirstEnter = false; //触发上拉加载 diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/example/OverScrollExampleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/example/OverScrollExampleActivity.java index 6eb3d692..0870bde9 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/example/OverScrollExampleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/example/OverScrollExampleActivity.java @@ -22,7 +22,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_example_overscroll); - final Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); + final Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -30,8 +30,8 @@ public void onClick(View v) { } }); - final WebView webView = (WebView) findViewById(R.id.webView); - final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout); + final WebView webView = findViewById(R.id.webView); + final RefreshLayout refreshLayout = findViewById(R.id.refreshLayout); refreshLayout.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh(@NonNull RefreshLayout refreshLayout) { @@ -43,16 +43,18 @@ public void onRefresh(@NonNull RefreshLayout refreshLayout) { webView.setWebViewClient(new WebViewClient(){ @Override + @SuppressWarnings("deprecation") public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } + @Override public void onPageCommitVisible(WebView view, String url) { refreshLayout.finishRefresh(); } }); -// TextView textView = (TextView) findViewById(R.id.textView); +// TextView textView = findViewById(R.id.textView); // textView.setMovementMethod(new ScrollingMovementMethod()); } diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/example/SnapHelperExampleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/example/SnapHelperExampleActivity.java index 5f03f386..a35c1649 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/example/SnapHelperExampleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/example/SnapHelperExampleActivity.java @@ -1,6 +1,7 @@ package com.scwang.refreshlayout.activity.example; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; @@ -9,33 +10,32 @@ import android.support.v7.widget.SnapHelper; import android.support.v7.widget.Toolbar; import android.view.View; +import android.widget.Switch; import com.scwang.refreshlayout.R; import com.scwang.refreshlayout.adapter.BaseRecyclerAdapter; import com.scwang.refreshlayout.adapter.SmartViewHolder; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener; import java.util.Arrays; import java.util.Collection; /** * 结合 SnapHelper 使用 - * Created by SCWANG on 2017/8/4. + * Created by scwang on 2017/8/4. */ - public class SnapHelperExampleActivity extends AppCompatActivity { + private BaseRecyclerAdapter mAdapter; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_example_snaphelper); - final Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); - toolbar.setNavigationOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); + final Toolbar toolbar = findViewById(R.id.toolbar); + toolbar.setNavigationOnClickListener(v -> finish()); //初始化列表和监听 View view = findViewById(R.id.recyclerView); @@ -43,7 +43,7 @@ public void onClick(View v) { RecyclerView recyclerView = (RecyclerView) view; recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); recyclerView.setItemAnimator(new DefaultItemAnimator()); - recyclerView.setAdapter(new BaseRecyclerAdapter(loadModels(), R.layout.listitem_example_snaphelper) { + recyclerView.setAdapter(mAdapter = new BaseRecyclerAdapter(loadModels(), R.layout.item_example_snap_helper) { @Override protected void onBindViewHolder(SmartViewHolder holder, Integer model, int position) { holder.image(R.id.imageView, model); @@ -53,16 +53,34 @@ protected void onBindViewHolder(SmartViewHolder holder, Integer model, int posit snapHelper.attachToRecyclerView(recyclerView); } + RefreshLayout refreshLayout = findViewById(R.id.refreshLayout); + refreshLayout.setOnRefreshLoadMoreListener(new OnRefreshLoadMoreListener() { + @Override + public void onRefresh(@NonNull RefreshLayout refreshLayout) { + refreshLayout.getLayout().postDelayed(() -> { + mAdapter.refresh(loadModels()); + refreshLayout.finishRefresh(); + }, 2000); + } + + @Override + public void onLoadMore(@NonNull RefreshLayout refreshLayout) { + refreshLayout.getLayout().postDelayed(() -> { + mAdapter.loadMore(loadModels()); + refreshLayout.finishLoadMore(); + }, 2000); + } + }); + + Switch switcher = findViewById(R.id.switch_scroll_content); + if (switcher != null) { + refreshLayout.setEnableScrollContentWhenLoaded(switcher.isChecked()); + switcher.setOnCheckedChangeListener((buttonView, isChecked) -> refreshLayout.setEnableScrollContentWhenLoaded(isChecked)); + } } private Collection loadModels() { - return Arrays.asList( - R.mipmap.image_weibo_home_1, - R.mipmap.image_weibo_home_2, - R.mipmap.image_weibo_home_1, - R.mipmap.image_weibo_home_2, - R.mipmap.image_weibo_home_1, - R.mipmap.image_weibo_home_2); + return Arrays.asList( R.mipmap.image_weibo_home_1, R.mipmap.image_weibo_home_2); } } diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/practice/BannerPracticeActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/practice/BannerPracticeActivity.java index ce32920f..752b3f5a 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/practice/BannerPracticeActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/practice/BannerPracticeActivity.java @@ -1,6 +1,7 @@ package com.scwang.refreshlayout.activity.practice; import android.content.Context; +import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; @@ -11,6 +12,7 @@ import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; +import android.widget.Toast; import com.bumptech.glide.Glide; import com.chad.library.adapter.base.BaseQuickAdapter; @@ -23,10 +25,15 @@ import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; import com.scwang.smartrefresh.layout.listener.OnRefreshListener; import com.youth.banner.Banner; +import com.youth.banner.BannerConfig; +import com.youth.banner.listener.OnBannerListener; import com.youth.banner.loader.ImageLoader; import java.util.ArrayList; import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static android.support.v7.widget.DividerItemDecoration.VERTICAL; @@ -43,7 +50,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_practice_banner); - final Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); + final Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -51,8 +58,8 @@ public void onClick(View v) { } }); - final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView); - final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout); + final RecyclerView recyclerView = findViewById(R.id.recyclerView); + final RefreshLayout refreshLayout = findViewById(R.id.refreshLayout); mAdapter = new QuickAdapter(); recyclerView.addItemDecoration(new DividerItemDecoration(this, VERTICAL)); @@ -75,20 +82,43 @@ public void run() { },2000); } }); +// refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { +// @Override +// public void onLoadMore(@NonNull RefreshLayout refreshLayout) { +// mAdapter.addData(movies); +// refreshLayout.finishLoadMoreWithNoMoreData(); +// } +// }); refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { @Override - public void onLoadMore(@NonNull RefreshLayout refreshLayout) { + public void onLoadMore(@NonNull RefreshLayout rl) { mAdapter.addData(movies); - refreshLayout.finishLoadMoreWithNoMoreData(); + rl.finishLoadMoreWithNoMoreData(); } }); //添加Header - View header = LayoutInflater.from(this).inflate(R.layout.listitem_movie_header, recyclerView, false); + View header = LayoutInflater.from(this).inflate(R.layout.item_movie_header, recyclerView, false); Banner banner = (Banner) header; banner.setImageLoader(new GlideImageLoader()); banner.setImages(BANNER_ITEMS); + banner.setOnBannerListener(new OnBannerListener() { + @Override + public void OnBannerClick(int i) { + Toast.makeText(BannerPracticeActivity.this, "点击了第" + i + "页", Toast.LENGTH_SHORT).show(); + } + }); + if (Build.VERSION.SDK_INT > 26) { + Stream stream = BANNER_ITEMS.stream().map(new Function() { + @Override + public String apply(BannerItem bannerItem) { + return bannerItem.title; + } + }); + banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR_TITLE_INSIDE); + banner.setBannerTitles(stream.collect(Collectors.toList())); + } banner.start(); mAdapter.addHeaderView(banner); mAdapter.openLoadAnimation(); @@ -103,7 +133,7 @@ public void onLoadMore(@NonNull RefreshLayout refreshLayout) { public class QuickAdapter extends BaseQuickAdapter { public QuickAdapter() { - super(R.layout.listitem_movie_item); + super(R.layout.item_movie_item); } @Override diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/practice/FeedListPracticeActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/practice/FeedListPracticeActivity.java index 1f10efa1..75af3dc6 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/practice/FeedListPracticeActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/practice/FeedListPracticeActivity.java @@ -7,6 +7,7 @@ import com.scwang.refreshlayout.R; import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.header.BezierRadarHeader; /** * 微博列表 @@ -20,7 +21,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_practice_feedlist); - final Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); + final Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -28,11 +29,12 @@ public void onClick(View v) { } }); - final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout); + final RefreshLayout refreshLayout = findViewById(R.id.refreshLayout); if (isFirstEnter) { isFirstEnter = false; refreshLayout.autoRefresh(); } + refreshLayout.setRefreshHeader(new BezierRadarHeader(this)); } diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/practice/ProfilePracticeActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/practice/ProfilePracticeActivity.java index 6e9f0832..e9e23ef9 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/practice/ProfilePracticeActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/practice/ProfilePracticeActivity.java @@ -19,7 +19,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_practice_profile); - final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + final Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/practice/QQBrowserPracticeActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/practice/QQBrowserPracticeActivity.java index 1c9be233..3b9a6f2d 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/practice/QQBrowserPracticeActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/practice/QQBrowserPracticeActivity.java @@ -24,7 +24,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_practice_qqbrowser); - final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + final Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -32,13 +32,14 @@ public void onClick(View v) { } }); - final LoadingLayout loading = (LoadingLayout) findViewById(R.id.loading); + final LoadingLayout loading = findViewById(R.id.loading); - final WebView webView = (WebView) findViewById(R.id.webView); + final WebView webView = findViewById(R.id.webView); webView.loadUrl("https://github.com/scwang90/SmartRefreshLayout"); webView.getSettings().setJavaScriptEnabled(true); webView.setWebViewClient(new WebViewClient(){ @Override + @SuppressWarnings("deprecation") public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/practice/RepastPracticeActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/practice/RepastPracticeActivity.java index 679caa27..0654c550 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/practice/RepastPracticeActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/practice/RepastPracticeActivity.java @@ -16,7 +16,7 @@ import com.scwang.refreshlayout.util.StatusBarUtil; import com.scwang.smartrefresh.layout.api.RefreshLayout; import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener; -import com.scwang.smartrefresh.layout.util.DensityUtil; +import com.scwang.smartrefresh.layout.util.SmartUtil; import java.util.Arrays; import java.util.Collection; @@ -41,7 +41,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_practice_repast); - final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + final Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -49,8 +49,8 @@ public void onClick(View v) { } }); - final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout); - refreshLayout.setEnableFooterFollowWhenLoadFinished(true); + final RefreshLayout refreshLayout = findViewById(R.id.refreshLayout); + refreshLayout.setEnableFooterFollowWhenNoMoreData(true); //第一次进入演示刷新 if (isFirstEnter) { @@ -64,7 +64,7 @@ public void onClick(View v) { RecyclerView recyclerView = (RecyclerView) view; recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setItemAnimator(new DefaultItemAnimator()); - recyclerView.setAdapter(mAdapter = new BaseRecyclerAdapter(loadModels(), R.layout.listitem_practice_repast) { + recyclerView.setAdapter(mAdapter = new BaseRecyclerAdapter(loadModels(), R.layout.item_practice_repast) { @Override protected void onBindViewHolder(SmartViewHolder holder, Model model, int position) { holder.text(R.id.name, model.name); @@ -81,7 +81,7 @@ public void onRefresh(@NonNull final RefreshLayout refreshLayout) { @Override public void run() { refreshLayout.finishRefresh(); - refreshLayout.setNoMoreData(false);//恢复上拉状态 + refreshLayout.resetNoMoreData();//setNoMoreData(false);//恢复上拉状态 } }, 2000); } @@ -105,7 +105,7 @@ public void run() { refreshLayout.getLayout().postDelayed(new Runnable() { @Override public void run() { - refreshLayout.setHeaderInsetStart(DensityUtil.px2dp(toolbar.getHeight())); + refreshLayout.setHeaderInsetStart(SmartUtil.px2dp(toolbar.getHeight())); } }, 500); } diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/practice/WebViewPracticeActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/practice/WebViewPracticeActivity.java index a0714f65..45b07f16 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/practice/WebViewPracticeActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/practice/WebViewPracticeActivity.java @@ -13,7 +13,7 @@ import com.scwang.refreshlayout.util.StatusBarUtil; import com.scwang.smartrefresh.layout.api.RefreshLayout; import com.scwang.smartrefresh.layout.listener.OnRefreshListener; -import com.scwang.smartrefresh.layout.util.DensityUtil; +import com.scwang.smartrefresh.layout.util.SmartUtil; import java.util.Locale; @@ -28,7 +28,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_practice_webview); - final Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); + final Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -36,8 +36,8 @@ public void onClick(View v) { } }); - final WebView webView = (WebView) findViewById(R.id.webView); - final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout); + final WebView webView = findViewById(R.id.webView); + final RefreshLayout refreshLayout = findViewById(R.id.refreshLayout); refreshLayout.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh(@NonNull RefreshLayout refreshLayout) { @@ -50,6 +50,7 @@ public void onRefresh(@NonNull RefreshLayout refreshLayout) { webView.getSettings().setJavaScriptEnabled(true); webView.setWebViewClient(new WebViewClient(){ @Override + @SuppressWarnings("deprecation") public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; @@ -59,7 +60,7 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); refreshLayout.finishRefresh(); - view.loadUrl(String.format(Locale.CHINA, "javascript:document.body.style.paddingTop='%fpx'; void 0", DensityUtil.px2dp(webView.getPaddingTop()))); + view.loadUrl(String.format(Locale.CHINA, "javascript:document.body.style.paddingTop='%fpx'; void 0", SmartUtil.px2dp(webView.getPaddingTop()))); } }); diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/practice/WeiboPracticeActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/practice/WeiboPracticeActivity.java index 609f222e..cc295ef4 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/practice/WeiboPracticeActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/practice/WeiboPracticeActivity.java @@ -14,7 +14,7 @@ import com.scwang.smartrefresh.layout.api.RefreshHeader; import com.scwang.smartrefresh.layout.api.RefreshLayout; import com.scwang.smartrefresh.layout.listener.SimpleMultiPurposeListener; -import com.scwang.smartrefresh.layout.util.DensityUtil; +import com.scwang.smartrefresh.layout.util.SmartUtil; /** * 微博主页 @@ -29,7 +29,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_practice_weibo); - final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + final Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -40,11 +40,12 @@ public void onClick(View v) { //状态栏透明和间距处理 StatusBarUtil.immersive(this); StatusBarUtil.setPaddingSmart(this, toolbar); + StatusBarUtil.setMargin(this, findViewById(R.id.header)); final View parallax = findViewById(R.id.parallax); final View buttonBar = findViewById(R.id.buttonBarLayout); - final NestedScrollView scrollView = (NestedScrollView)findViewById(R.id.scrollView); - final RefreshLayout refreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout); + final NestedScrollView scrollView = findViewById(R.id.scrollView); + final RefreshLayout refreshLayout = findViewById(R.id.refreshLayout); findViewById(R.id.attention).setOnClickListener(new View.OnClickListener() { @Override @@ -90,7 +91,7 @@ public void onHeaderMoving(RefreshHeader header, boolean isDragging, float perce }); scrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() { private int lastScrollY = 0; - private int h = DensityUtil.dp2px(170); + private int h = SmartUtil.dp2px(170); private int color = ContextCompat.getColor(getApplicationContext(), R.color.colorPrimary)&0x00ffffff; @Override public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/style/BezierCircleStyleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/style/BezierCircleStyleActivity.java index 05528d25..9b2bd813 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/style/BezierCircleStyleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/style/BezierCircleStyleActivity.java @@ -18,7 +18,9 @@ import com.scwang.refreshlayout.adapter.SmartViewHolder; import com.scwang.smartrefresh.layout.api.RefreshLayout; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import static android.R.layout.simple_list_item_2; import static android.support.v7.widget.DividerItemDecoration.VERTICAL; @@ -48,7 +50,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_style_circle); - mToolbar = (Toolbar)findViewById(R.id.toolbar); + mToolbar = findViewById(R.id.toolbar); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -56,7 +58,7 @@ public void onClick(View v) { } }); - mRefreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout); + mRefreshLayout = findViewById(R.id.refreshLayout); if (isFirstEnter) { isFirstEnter = false; mRefreshLayout.autoRefresh();//第一次进入触发自动刷新,演示效果 @@ -68,7 +70,10 @@ public void onClick(View v) { recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.addItemDecoration(new DividerItemDecoration(this, VERTICAL)); recyclerView.setItemAnimator(new DefaultItemAnimator()); - recyclerView.setAdapter(new BaseRecyclerAdapter(Arrays.asList(Item.values()), simple_list_item_2,this) { + List items = new ArrayList<>(); + items.addAll(Arrays.asList(Item.values())); + items.addAll(Arrays.asList(Item.values())); + recyclerView.setAdapter(new BaseRecyclerAdapter(items, simple_list_item_2,this) { @Override protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { holder.text(android.R.id.text1, model.name()); @@ -81,7 +86,7 @@ protected void onBindViewHolder(SmartViewHolder holder, Item model, int position @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - switch (Item.values()[position]) { + switch (Item.values()[position % Item.values().length]) { case 内容不偏移: mRefreshLayout.setEnableHeaderTranslationContent(false); break; diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/style/BezierRadarStyleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/style/BezierRadarStyleActivity.java index 03a715df..400452ce 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/style/BezierRadarStyleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/style/BezierRadarStyleActivity.java @@ -19,7 +19,9 @@ import com.scwang.smartrefresh.layout.api.RefreshLayout; import com.scwang.smartrefresh.layout.header.BezierRadarHeader; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import static android.R.layout.simple_list_item_2; import static android.support.v7.widget.DividerItemDecoration.VERTICAL; @@ -52,7 +54,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_style_bezier); - mToolbar = (Toolbar)findViewById(R.id.toolbar); + mToolbar = findViewById(R.id.toolbar); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -60,8 +62,8 @@ public void onClick(View v) { } }); - mRefreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout); - mRefreshHeader = (BezierRadarHeader) findViewById(R.id.header); + mRefreshLayout = findViewById(R.id.refreshLayout); + mRefreshHeader = findViewById(R.id.header); if (isFirstEnter) { isFirstEnter = false; mRefreshLayout.autoRefresh();//第一次进入触发自动刷新,演示效果 @@ -73,7 +75,10 @@ public void onClick(View v) { recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.addItemDecoration(new DividerItemDecoration(this, VERTICAL)); recyclerView.setItemAnimator(new DefaultItemAnimator()); - recyclerView.setAdapter(new BaseRecyclerAdapter(Arrays.asList(Item.values()), simple_list_item_2,this) { + List items = new ArrayList<>(); + items.addAll(Arrays.asList(Item.values())); + items.addAll(Arrays.asList(Item.values())); + recyclerView.setAdapter(new BaseRecyclerAdapter(items, simple_list_item_2,this) { @Override protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { holder.text(android.R.id.text1, model.name()); @@ -86,7 +91,7 @@ protected void onBindViewHolder(SmartViewHolder holder, Item model, int position @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - switch (Item.values()[position]) { + switch (Item.values()[position % Item.values().length]) { case 内容不偏移: mRefreshLayout.setEnableHeaderTranslationContent(false); break; diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/style/ClassicsStyleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/style/ClassicsStyleActivity.java index 9b42589d..b274bf98 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/style/ClassicsStyleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/style/ClassicsStyleActivity.java @@ -26,8 +26,10 @@ import com.scwang.smartrefresh.layout.header.ClassicsHeader; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Arrays; import java.util.Date; +import java.util.List; import java.util.Locale; import java.util.Random; @@ -69,7 +71,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_style_classics); - mToolbar = (Toolbar)findViewById(R.id.toolbar); + mToolbar = findViewById(R.id.toolbar); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -77,7 +79,7 @@ public void onClick(View v) { } }); - mRefreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout); + mRefreshLayout = findViewById(R.id.refreshLayout); int delta = new Random().nextInt(7 * 24 * 60 * 60 * 1000); mClassicsHeader = (ClassicsHeader)mRefreshLayout.getRefreshHeader(); @@ -97,7 +99,10 @@ public void onClick(View v) { recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.addItemDecoration(new DividerItemDecoration(this, VERTICAL)); recyclerView.setItemAnimator(new DefaultItemAnimator()); - recyclerView.setAdapter(mAdpater = new BaseRecyclerAdapter(Arrays.asList(Item.values()), simple_list_item_2,this) { + List items = new ArrayList<>(); + items.addAll(Arrays.asList(Item.values())); + items.addAll(Arrays.asList(Item.values())); + recyclerView.setAdapter(mAdpater = new BaseRecyclerAdapter(items, simple_list_item_2,this) { @Override protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { holder.text(android.R.id.text1, model.name()); @@ -118,7 +123,7 @@ protected void onBindViewHolder(SmartViewHolder holder, Item model, int position @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - switch (Item.values()[position]) { + switch (Item.values()[position % Item.values().length]) { case 背后固定: mClassicsHeader.setSpinnerStyle(SpinnerStyle.FixedBehind); mRefreshLayout.setPrimaryColors(0xff444444, 0xffffffff); @@ -134,7 +139,7 @@ public void onItemClick(AdapterView parent, View view, int position, long id) mRefreshLayout.getLayout().bringChildToFront(mRecyclerView); break; case 尺寸拉伸: - mClassicsHeader.setSpinnerStyle(SpinnerStyle.Scale); + mClassicsHeader.setSpinnerStyle(SpinnerStyle.values[1]); break; case 位置平移: mClassicsHeader.setSpinnerStyle(SpinnerStyle.Translate); diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/style/DeliveryStyleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/style/DeliveryStyleActivity.java index 70b78865..64688c34 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/style/DeliveryStyleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/style/DeliveryStyleActivity.java @@ -18,9 +18,11 @@ import com.scwang.refreshlayout.adapter.SmartViewHolder; import com.scwang.smartrefresh.layout.api.RefreshLayout; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; -import static com.scwang.refreshlayout.R.layout.listitem_style_delivery; +import static com.scwang.refreshlayout.R.layout.item_style_delivery; public class DeliveryStyleActivity extends AppCompatActivity implements AdapterView.OnItemClickListener { @@ -55,7 +57,7 @@ protected void onCreate(Bundle savedInstanceState) { window.getDecorView().setSystemUiVisibility(systemUiVisibility); } - mToolbar = (Toolbar)findViewById(R.id.toolbar); + mToolbar = findViewById(R.id.toolbar); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -63,7 +65,7 @@ public void onClick(View v) { } }); - mRefreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout); + mRefreshLayout = findViewById(R.id.refreshLayout); if (isFirstEnter) { isFirstEnter = false; mRefreshLayout.autoRefresh();//第一次进入触发自动刷新,演示效果 @@ -74,7 +76,10 @@ public void onClick(View v) { RecyclerView recyclerView = (RecyclerView) view; recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setItemAnimator(new DefaultItemAnimator()); - recyclerView.setAdapter(new BaseRecyclerAdapter(Arrays.asList(Item.values()), listitem_style_delivery,this) { + List items = new ArrayList<>(); + items.addAll(Arrays.asList(Item.values())); + items.addAll(Arrays.asList(Item.values())); + recyclerView.setAdapter(new BaseRecyclerAdapter(items, item_style_delivery,this) { @Override protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { } @@ -84,7 +89,7 @@ protected void onBindViewHolder(SmartViewHolder holder, Item model, int position @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - switch (Item.values()[position]) { + switch (Item.values()[position % Item.values().length]) { case 默认主题: mToolbar.setBackgroundResource(android.R.color.white); mToolbar.setTitleTextColor(0xffbbbbbb); diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/style/DropBoxStyleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/style/DropBoxStyleActivity.java index 75418f0b..2f718ada 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/style/DropBoxStyleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/style/DropBoxStyleActivity.java @@ -31,6 +31,20 @@ private enum Item { 红色主题(R.string.item_style_theme_red_abstract), 绿色主题(R.string.item_style_theme_green_abstract), 蓝色主题(R.string.item_style_theme_blue_abstract), + + + 默认1主题(R.string.item_style_theme_default_abstract), + 橙色1主题(R.string.item_style_theme_orange_abstract), + 红色1主题(R.string.item_style_theme_red_abstract), + 绿色1主题(R.string.item_style_theme_green_abstract), + 蓝色1主题(R.string.item_style_theme_blue_abstract), + + + 默认2主题(R.string.item_style_theme_default_abstract), + 橙色2主题(R.string.item_style_theme_orange_abstract), + 红色2主题(R.string.item_style_theme_red_abstract), + 绿色2主题(R.string.item_style_theme_green_abstract), + 蓝色2主题(R.string.item_style_theme_blue_abstract), ; public int nameId; Item(@StringRes int nameId) { @@ -47,7 +61,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_style_dropbox); - mToolbar = (Toolbar)findViewById(R.id.toolbar); + mToolbar = findViewById(R.id.toolbar); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -55,7 +69,7 @@ public void onClick(View v) { } }); - mRefreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout); + mRefreshLayout = findViewById(R.id.refreshLayout); if (isFirstEnter) { isFirstEnter = false; mRefreshLayout.autoRefresh();//第一次进入触发自动刷新,演示效果 @@ -80,7 +94,7 @@ protected void onBindViewHolder(SmartViewHolder holder, Item model, int position @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - switch (Item.values()[position]) { + switch (Item.values()[position % Item.values().length]) { case 默认主题: setThemeColor(R.color.colorPrimary, R.color.colorPrimaryDark); mRefreshLayout.setPrimaryColors(0xff283645, 0xff6ea9ff); diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/style/FlyRefreshStyleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/style/FlyRefreshStyleActivity.java index bb43a0d1..cb14ef30 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/style/FlyRefreshStyleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/style/FlyRefreshStyleActivity.java @@ -39,9 +39,10 @@ import com.scwang.smartrefresh.layout.api.RefreshLayout; import com.scwang.smartrefresh.layout.listener.OnRefreshListener; import com.scwang.smartrefresh.layout.listener.SimpleMultiPurposeListener; -import com.scwang.smartrefresh.layout.util.DensityUtil; +import com.scwang.smartrefresh.layout.util.SmartUtil; import java.text.DateFormat; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -69,7 +70,7 @@ public class FlyRefreshStyleActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fly_refresh); - final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + final Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override @@ -82,11 +83,11 @@ public void onClick(View v) { * 关键代码-开始 *----------------------------------------------------------*/ - MountainSceneView mSceneView = (MountainSceneView) findViewById(R.id.mountain); - mFlyView = (FlyView) findViewById(R.id.flyView); - mFlyRefreshHeader = (FlyRefreshHeader)findViewById(R.id.flyRefresh); + MountainSceneView mSceneView = findViewById(R.id.mountain); + mFlyView = findViewById(R.id.flyView); + mFlyRefreshHeader = findViewById(R.id.flyRefresh); mFlyRefreshHeader.setUp(mSceneView, mFlyView);//绑定场景和纸飞机 - mRefreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout); + mRefreshLayout = findViewById(R.id.refreshLayout); mRefreshLayout.setReboundInterpolator(new ElasticOutInterpolator());//设置回弹插值器,会带有弹簧震动效果 mRefreshLayout.setReboundDuration(800);//设置回弹动画时长 mRefreshLayout.setOnRefreshListener(new OnRefreshListener() { @@ -112,7 +113,7 @@ public void onAnimationEnd(Animator animation) { } }); //设置 让 AppBarLayout 和 RefreshLayout 的滚动同步 并不保持 toolbar 位置不变 - final AppBarLayout appBar = (AppBarLayout) findViewById(R.id.appbar); + final AppBarLayout appBar = findViewById(R.id.appbar); mRefreshLayout.setOnMultiPurposeListener(new SimpleMultiPurposeListener() { @Override public void onHeaderMoving(RefreshHeader header, boolean isDragging, float percent, int offset, int headerHeight, int maxDragHeight) { @@ -145,12 +146,12 @@ public void onHeaderMoving(RefreshHeader header, boolean isDragging, float perce initDataSet(); mAdapter = new ItemAdapter(this); mLayoutManager = new LinearLayoutManager(this); - mListView = (RecyclerView) findViewById(R.id.recyclerView); + mListView = findViewById(R.id.recyclerView); mListView.setLayoutManager(mLayoutManager); mListView.setAdapter(mAdapter); mListView.setItemAnimator(new SampleItemAnimator()); - mToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.toolbarLayout); - mActionButton = (FloatingActionButton) findViewById(R.id.fab); + mToolbarLayout = findViewById(R.id.toolbarLayout); + mActionButton = findViewById(R.id.fab); /* * 设置点击 ActionButton 时候触发自动刷新 并改变主题颜色 */ @@ -188,7 +189,7 @@ public void onAnimationUpdate(ValueAnimator animation) { misAppbarExpand = true; mActionButton.animate().scaleX(1).scaleY(1); mFlyView.animate().scaleX(1).scaleY(1); - ValueAnimator animator = ValueAnimator.ofInt(mListView.getPaddingTop(), DensityUtil.dp2px(25)); + ValueAnimator animator = ValueAnimator.ofInt(mListView.getPaddingTop(), SmartUtil.dp2px(25)); animator.setDuration(300); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override @@ -233,13 +234,18 @@ public void onClick(View v) { } private void initDataSet() { - mDataSet.add(new ItemData(0xFF76A9FC, R.drawable.ic_fly_refresh_poll, "Meeting Minutes", new Date(2014 - 1900, 2, 9))); - mDataSet.add(new ItemData(Color.GRAY, R.drawable.ic_fly_refresh_folder, "Favorites Photos", new Date(2014 - 1900, 1, 3))); - mDataSet.add(new ItemData(Color.GRAY, R.drawable.ic_fly_refresh_folder, "Photos", new Date(2014 - 1900, 0, 9))); + try { + DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA); + mDataSet.add(new ItemData(0xFF76A9FC, R.drawable.ic_fly_refresh_poll, "Meeting Minutes", format.parse("2014-03-09"))); + mDataSet.add(new ItemData(Color.GRAY, R.drawable.ic_fly_refresh_folder, "Favorites Photos", format.parse("2014-02-03"))); + mDataSet.add(new ItemData(Color.GRAY, R.drawable.ic_fly_refresh_folder, "Photos", format.parse("2014-01-09"))); + } catch (ParseException e) { + e.printStackTrace(); + } } private void addItemData() { - ItemData itemData = new ItemData(0xFFFFC970, R.drawable.ic_fly_refresh_smartphone, "Magic Cube Show", new Date()); + ItemData itemData = new ItemData(0xFFFFC970, R.drawable.ic_fly_refresh_phone, "Magic Cube Show", new Date()); mDataSet.add(0, itemData); mAdapter.notifyItemInserted(0); mLayoutManager.scrollToPosition(0); @@ -272,18 +278,19 @@ private class ItemAdapter extends RecyclerView.Adapter { dateFormat = SimpleDateFormat.getDateInstance(DateFormat.DEFAULT, Locale.ENGLISH); } + @NonNull @Override - public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View view = mInflater.inflate(R.layout.activity_fly_refresh_item, viewGroup, false); return new ItemViewHolder(view); } @Override - public void onBindViewHolder(ItemViewHolder itemViewHolder, int i) { + public void onBindViewHolder(@NonNull ItemViewHolder itemViewHolder, int i) { final ItemData data = mDataSet.get(i); ShapeDrawable drawable = new ShapeDrawable(new OvalShape()); drawable.getPaint().setColor(data.color); - itemViewHolder.icon.setBackgroundDrawable(drawable); + itemViewHolder.icon.setBackground(drawable); itemViewHolder.icon.setImageResource(data.icon); itemViewHolder.title.setText(data.title); itemViewHolder.subTitle.setText(dateFormat.format(data.time)); diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/style/FunGameBattleCityStyleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/style/FunGameBattleCityStyleActivity.java index e5118a9c..2694e8e6 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/style/FunGameBattleCityStyleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/style/FunGameBattleCityStyleActivity.java @@ -18,7 +18,9 @@ import com.scwang.refreshlayout.adapter.SmartViewHolder; import com.scwang.smartrefresh.layout.api.RefreshLayout; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import static android.R.layout.simple_list_item_2; import static android.support.v7.widget.DividerItemDecoration.VERTICAL; @@ -47,7 +49,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_style_fungame_battlecity); - mToolbar = (Toolbar)findViewById(R.id.toolbar); + mToolbar = findViewById(R.id.toolbar); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -55,7 +57,7 @@ public void onClick(View v) { } }); - mRefreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout); + mRefreshLayout = findViewById(R.id.refreshLayout); if (isFirstEnter) { isFirstEnter = false; mRefreshLayout.autoRefresh();//第一次进入触发自动刷新,演示效果 @@ -67,7 +69,11 @@ public void onClick(View v) { recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.addItemDecoration(new DividerItemDecoration(this, VERTICAL)); recyclerView.setItemAnimator(new DefaultItemAnimator()); - recyclerView.setAdapter(new BaseRecyclerAdapter(Arrays.asList(Item.values()), simple_list_item_2,this) { + List items = new ArrayList<>(); + items.addAll(Arrays.asList(Item.values())); + items.addAll(Arrays.asList(Item.values())); + items.addAll(Arrays.asList(Item.values())); + recyclerView.setAdapter(new BaseRecyclerAdapter(items, simple_list_item_2,this) { @Override protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { holder.text(android.R.id.text1, model.name()); @@ -80,7 +86,7 @@ protected void onBindViewHolder(SmartViewHolder holder, Item model, int position @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - switch (Item.values()[position]) { + switch (Item.values()[position % Item.values().length]) { case 默认主题: mRefreshLayout.setPrimaryColorsId(android.R.color.white, android.R.color.black); break; diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/style/FunGameHitBlockStyleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/style/FunGameHitBlockStyleActivity.java index ae0094ec..32591b5c 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/style/FunGameHitBlockStyleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/style/FunGameHitBlockStyleActivity.java @@ -18,7 +18,9 @@ import com.scwang.refreshlayout.adapter.SmartViewHolder; import com.scwang.smartrefresh.layout.api.RefreshLayout; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import static android.R.layout.simple_list_item_2; import static android.support.v7.widget.DividerItemDecoration.VERTICAL; @@ -47,7 +49,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_style_fungame_hitblock); - mToolbar = (Toolbar)findViewById(R.id.toolbar); + mToolbar = findViewById(R.id.toolbar); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -55,7 +57,7 @@ public void onClick(View v) { } }); - mRefreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout); + mRefreshLayout = findViewById(R.id.refreshLayout); if (isFirstEnter) { isFirstEnter = false; mRefreshLayout.autoRefresh();//第一次进入触发自动刷新,演示效果 @@ -67,7 +69,11 @@ public void onClick(View v) { recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.addItemDecoration(new DividerItemDecoration(this, VERTICAL)); recyclerView.setItemAnimator(new DefaultItemAnimator()); - recyclerView.setAdapter(new BaseRecyclerAdapter(Arrays.asList(Item.values()), simple_list_item_2,this) { + List items = new ArrayList<>(); + items.addAll(Arrays.asList(Item.values())); + items.addAll(Arrays.asList(Item.values())); + items.addAll(Arrays.asList(Item.values())); + recyclerView.setAdapter(new BaseRecyclerAdapter(items, simple_list_item_2,this) { @Override protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { holder.text(android.R.id.text1, model.name()); @@ -81,7 +87,7 @@ protected void onBindViewHolder(SmartViewHolder holder, Item model, int position @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - switch (Item.values()[position]) { + switch (Item.values()[position % Item.values().length]) { case 默认主题: mRefreshLayout.setPrimaryColorsId(android.R.color.white, android.R.color.black); break; diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/style/MaterialStyleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/style/MaterialStyleActivity.java index 7b94c86b..8c22e813 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/style/MaterialStyleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/style/MaterialStyleActivity.java @@ -19,7 +19,9 @@ import com.scwang.smartrefresh.header.MaterialHeader; import com.scwang.smartrefresh.layout.api.RefreshLayout; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import static android.R.layout.simple_list_item_2; import static android.support.v7.widget.DividerItemDecoration.VERTICAL; @@ -52,20 +54,22 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_style_material); - mToolbar = (Toolbar)findViewById(R.id.toolbar); - mToolbar.setNavigationOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); + mToolbar = findViewById(R.id.toolbar); + mToolbar.setNavigationOnClickListener(v -> finish()); - mRefreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout); + mRefreshLayout = findViewById(R.id.refreshLayout); if (isFirstEnter) { isFirstEnter = false; mRefreshLayout.autoRefresh();//第一次进入触发自动刷新,演示效果 } + mToolbar.setOnLongClickListener(v -> { + mRefreshLayout.autoRefreshAnimationOnly(); + mRefreshLayout.autoRefreshAnimationOnly(); + mRefreshLayout.autoRefreshAnimationOnly(); + return true; + }); + mMaterialHeader = (MaterialHeader)mRefreshLayout.getRefreshHeader(); View view = findViewById(R.id.recyclerView); @@ -74,7 +78,10 @@ public void onClick(View v) { recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.addItemDecoration(new DividerItemDecoration(this, VERTICAL)); recyclerView.setItemAnimator(new DefaultItemAnimator()); - recyclerView.setAdapter(new BaseRecyclerAdapter(Arrays.asList(Item.values()), simple_list_item_2,this) { + List items = new ArrayList<>(); + items.addAll(Arrays.asList(Item.values())); + items.addAll(Arrays.asList(Item.values())); + recyclerView.setAdapter(new BaseRecyclerAdapter(items, simple_list_item_2,this) { @Override protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { holder.text(android.R.id.text1, model.name()); @@ -87,7 +94,7 @@ protected void onBindViewHolder(SmartViewHolder holder, Item model, int position @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - switch (Item.values()[position]) { + switch (Item.values()[position % Item.values().length]) { case 内容不偏移: mRefreshLayout.setEnableHeaderTranslationContent(false); break; @@ -119,6 +126,8 @@ public void onItemClick(AdapterView parent, View view, int position, long id) private void setThemeColor(int colorPrimary, int colorPrimaryDark) { mToolbar.setBackgroundResource(colorPrimary); mRefreshLayout.setPrimaryColorsId(colorPrimary, android.R.color.white); + mMaterialHeader.setProgressBackgroundColorSchemeResource(colorPrimary); + mMaterialHeader.setColorSchemeResources(android.R.color.white); if (Build.VERSION.SDK_INT >= 21) { getWindow().setStatusBarColor(ContextCompat.getColor(this, colorPrimaryDark)); } diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/style/PhoenixStyleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/style/PhoenixStyleActivity.java index 426f9f85..96989fdd 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/style/PhoenixStyleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/style/PhoenixStyleActivity.java @@ -22,7 +22,9 @@ import com.scwang.refreshlayout.adapter.SmartViewHolder; import com.scwang.smartrefresh.layout.api.RefreshLayout; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import static android.R.layout.simple_list_item_2; import static android.support.v7.widget.DividerItemDecoration.VERTICAL; @@ -56,7 +58,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_style_phoenix); - mToolbar = (Toolbar)findViewById(R.id.toolbar); + mToolbar = findViewById(R.id.toolbar); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -64,14 +66,14 @@ public void onClick(View v) { } }); - mRefreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout); + mRefreshLayout = findViewById(R.id.refreshLayout); if (isFirstEnter) { isFirstEnter = false; mRefreshLayout.autoRefresh();//第一次进入触发自动刷新,演示效果 } - mAppBarLayout = (AppBarLayout) findViewById(R.id.appbar); - mToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.toolbarLayout); + mAppBarLayout = findViewById(R.id.appbar); + mToolbarLayout = findViewById(R.id.toolbarLayout); View view = findViewById(R.id.recyclerView); if (view instanceof RecyclerView) { @@ -79,7 +81,10 @@ public void onClick(View v) { recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.addItemDecoration(new DividerItemDecoration(this, VERTICAL)); recyclerView.setItemAnimator(new DefaultItemAnimator()); - recyclerView.setAdapter(new BaseRecyclerAdapter(Arrays.asList(Item.values()), simple_list_item_2,this) { + List items = new ArrayList<>(); + items.addAll(Arrays.asList(Item.values())); + items.addAll(Arrays.asList(Item.values())); + recyclerView.setAdapter(new BaseRecyclerAdapter(items, simple_list_item_2,this) { @Override protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { holder.text(android.R.id.text1, model.name()); @@ -93,7 +98,7 @@ protected void onBindViewHolder(SmartViewHolder holder, Item model, int position /* * 监听 AppBarLayout 的关闭和开启 ActionButton 设置关闭隐藏动画 */ - mActionButton = (FloatingActionButton) findViewById(R.id.fab); + mActionButton = findViewById(R.id.fab); mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { boolean misAppbarExpand = true; View fab = findViewById(R.id.fab); @@ -115,7 +120,7 @@ public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - switch (Item.values()[position]) { + switch (Item.values()[position % Item.values().length]) { case 折叠: mAppBarLayout.setExpanded(false, true); mAppBarLayout.setEnabled(false); diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/style/StoreHouseStyleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/style/StoreHouseStyleActivity.java index 208ff99d..74a1814b 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/style/StoreHouseStyleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/style/StoreHouseStyleActivity.java @@ -55,7 +55,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_style_storehouse); - mToolbar = (Toolbar)findViewById(R.id.toolbar); + mToolbar = findViewById(R.id.toolbar); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -63,7 +63,7 @@ public void onClick(View v) { } }); - mRefreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout); + mRefreshLayout = findViewById(R.id.refreshLayout); if (isFirstEnter) { isFirstEnter = false; mRefreshLayout.autoRefresh();//第一次进入触发自动刷新,演示效果 @@ -75,7 +75,10 @@ public void onClick(View v) { recyclerView.addItemDecoration(new DividerItemDecoration(this, VERTICAL)); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setItemAnimator(new DefaultItemAnimator()); - recyclerView.setAdapter(new BaseRecyclerAdapter(Arrays.asList(Item.values()), simple_list_item_2,this) { + List items = new ArrayList<>(); + items.addAll(Arrays.asList(Item.values())); + items.addAll(Arrays.asList(Item.values())); + recyclerView.setAdapter(new BaseRecyclerAdapter(items, simple_list_item_2,this) { @Override protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { holder.text(android.R.id.text1, model.name()); @@ -88,7 +91,7 @@ protected void onBindViewHolder(SmartViewHolder holder, Item model, int position @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - switch (Item.values()[position]) { + switch (Item.values()[position % Item.values().length]) { case 显示中文: { RefreshHeader refreshHeader = mRefreshLayout.getRefreshHeader(); if (refreshHeader instanceof StoreHouseHeader) { diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/style/TaurusStyleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/style/TaurusStyleActivity.java index b500a43f..e3026a1b 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/style/TaurusStyleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/style/TaurusStyleActivity.java @@ -22,7 +22,9 @@ import com.scwang.refreshlayout.adapter.SmartViewHolder; import com.scwang.smartrefresh.layout.api.RefreshLayout; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import static android.R.layout.simple_list_item_2; import static android.support.v7.widget.DividerItemDecoration.VERTICAL; @@ -56,7 +58,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_style_taurus); - mToolbar = (Toolbar)findViewById(R.id.toolbar); + mToolbar = findViewById(R.id.toolbar); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -64,14 +66,14 @@ public void onClick(View v) { } }); - mRefreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout); + mRefreshLayout = findViewById(R.id.refreshLayout); if (isFirstEnter) { isFirstEnter = false; mRefreshLayout.autoRefresh();//第一次进入触发自动刷新,演示效果 } - mAppBarLayout = (AppBarLayout) findViewById(R.id.appbar); - mToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.toolbarLayout); + mAppBarLayout = findViewById(R.id.appbar); + mToolbarLayout = findViewById(R.id.toolbarLayout); View view = findViewById(R.id.recyclerView); if (view instanceof RecyclerView) { @@ -79,7 +81,10 @@ public void onClick(View v) { recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.addItemDecoration(new DividerItemDecoration(this, VERTICAL)); recyclerView.setItemAnimator(new DefaultItemAnimator()); - recyclerView.setAdapter(new BaseRecyclerAdapter(Arrays.asList(Item.values()), simple_list_item_2,this) { + List items = new ArrayList<>(); + items.addAll(Arrays.asList(Item.values())); + items.addAll(Arrays.asList(Item.values())); + recyclerView.setAdapter(new BaseRecyclerAdapter(items, simple_list_item_2,this) { @Override protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { holder.text(android.R.id.text1, model.name()); @@ -93,7 +98,7 @@ protected void onBindViewHolder(SmartViewHolder holder, Item model, int position /* * 监听 AppBarLayout 的关闭和开启 给 ActionButton 设置关闭隐藏动画 */ - mActionButton = (FloatingActionButton) findViewById(R.id.fab); + mActionButton = findViewById(R.id.fab); mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { boolean misAppbarExpand = true; View fab = findViewById(R.id.fab); @@ -115,7 +120,7 @@ public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - switch (Item.values()[position]) { + switch (Item.values()[position % Item.values().length]) { case 折叠: mAppBarLayout.setExpanded(false, true); mAppBarLayout.setEnabled(false); diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/style/WaterDropStyleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/style/WaterDropStyleActivity.java index 9e3c3609..01be31fd 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/style/WaterDropStyleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/style/WaterDropStyleActivity.java @@ -18,7 +18,9 @@ import com.scwang.refreshlayout.adapter.SmartViewHolder; import com.scwang.smartrefresh.layout.api.RefreshLayout; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import static android.R.layout.simple_list_item_2; import static android.support.v7.widget.DividerItemDecoration.VERTICAL; @@ -49,7 +51,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_style_water_drop); - mToolbar = (Toolbar)findViewById(R.id.toolbar); + mToolbar = findViewById(R.id.toolbar); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -57,7 +59,7 @@ public void onClick(View v) { } }); - mRefreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout); + mRefreshLayout = findViewById(R.id.refreshLayout); if (isFirstEnter) { isFirstEnter = false; mRefreshLayout.autoRefresh();//第一次进入触发自动刷新,演示效果 @@ -69,7 +71,10 @@ public void onClick(View v) { recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.addItemDecoration(new DividerItemDecoration(this, VERTICAL)); recyclerView.setItemAnimator(new DefaultItemAnimator()); - recyclerView.setAdapter(new BaseRecyclerAdapter(Arrays.asList(Item.values()), simple_list_item_2,this) { + List items = new ArrayList<>(); + items.addAll(Arrays.asList(Item.values())); + items.addAll(Arrays.asList(Item.values())); + recyclerView.setAdapter(new BaseRecyclerAdapter(items, simple_list_item_2,this) { @Override protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { holder.text(android.R.id.text1, model.name()); @@ -82,7 +87,7 @@ protected void onBindViewHolder(SmartViewHolder holder, Item model, int position @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - switch (Item.values()[position]) { + switch (Item.values()[position % Item.values().length]) { case 内容不偏移: mRefreshLayout.setEnableHeaderTranslationContent(false); break; diff --git a/app/src/main/java/com/scwang/refreshlayout/activity/style/WaveSwipeStyleActivity.java b/app/src/main/java/com/scwang/refreshlayout/activity/style/WaveSwipeStyleActivity.java index e77e3c73..a0825f0f 100644 --- a/app/src/main/java/com/scwang/refreshlayout/activity/style/WaveSwipeStyleActivity.java +++ b/app/src/main/java/com/scwang/refreshlayout/activity/style/WaveSwipeStyleActivity.java @@ -18,7 +18,9 @@ import com.scwang.refreshlayout.adapter.SmartViewHolder; import com.scwang.smartrefresh.layout.api.RefreshLayout; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import static android.R.layout.simple_list_item_2; import static android.support.v7.widget.DividerItemDecoration.VERTICAL; @@ -48,7 +50,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_style_wave_swipe); - mToolbar = (Toolbar)findViewById(R.id.toolbar); + mToolbar = findViewById(R.id.toolbar); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -56,7 +58,7 @@ public void onClick(View v) { } }); - mRefreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout); + mRefreshLayout = findViewById(R.id.refreshLayout); if (isFirstEnter) { isFirstEnter = false; mRefreshLayout.autoRefresh();//第一次进入触发自动刷新,演示效果 @@ -68,7 +70,11 @@ public void onClick(View v) { recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.addItemDecoration(new DividerItemDecoration(this, VERTICAL)); recyclerView.setItemAnimator(new DefaultItemAnimator()); - recyclerView.setAdapter(new BaseRecyclerAdapter(Arrays.asList(Item.values()), simple_list_item_2,this) { + List items = new ArrayList<>(); + items.addAll(Arrays.asList(Item.values())); + items.addAll(Arrays.asList(Item.values())); + items.addAll(Arrays.asList(Item.values())); + recyclerView.setAdapter(new BaseRecyclerAdapter(items, simple_list_item_2,this) { @Override protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { holder.text(android.R.id.text1, model.name()); @@ -81,7 +87,7 @@ protected void onBindViewHolder(SmartViewHolder holder, Item model, int position @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - switch (Item.values()[position]) { + switch (Item.values()[position % Item.values().length]) { case 内容不偏移: mRefreshLayout.setEnableHeaderTranslationContent(false); break; diff --git a/app/src/main/java/com/scwang/refreshlayout/adapter/BaseRecyclerAdapter.java b/app/src/main/java/com/scwang/refreshlayout/adapter/BaseRecyclerAdapter.java index 36d86f8e..85e83a7a 100644 --- a/app/src/main/java/com/scwang/refreshlayout/adapter/BaseRecyclerAdapter.java +++ b/app/src/main/java/com/scwang/refreshlayout/adapter/BaseRecyclerAdapter.java @@ -16,20 +16,18 @@ /** * - * Created by SCWANG on 2017/6/11. + * Created by scwang on 2017/6/11. */ - @SuppressWarnings({"UnusedReturnValue", "unused"}) public abstract class BaseRecyclerAdapter extends RecyclerView.Adapter implements ListAdapter { // - private final int mLayoutId; private final List mList; private int mLastPosition = -1; private boolean mOpenAnimationEnable = true; - private AdapterView.OnItemClickListener mListener; + protected AdapterView.OnItemClickListener mListener; public BaseRecyclerAdapter(@LayoutRes int layoutId) { setHasStableIds(false); @@ -51,7 +49,6 @@ public BaseRecyclerAdapter(Collection collection, @LayoutRes int layoutId, Ad } // - private void addAnimate(SmartViewHolder holder, int postion) { if (mOpenAnimationEnable && mLastPosition < postion) { holder.itemView.setAlpha(0); @@ -87,31 +84,6 @@ public void onViewAttachedToWindow(SmartViewHolder holder) { public void setOpenAnimationEnable(boolean enabled) { this.mOpenAnimationEnable = enabled; } - - // - - // - - public BaseRecyclerAdapter setOnItemClickListener(AdapterView.OnItemClickListener listener) { - mListener = listener; - return this; - } - - public BaseRecyclerAdapter refresh(Collection collection) { - mList.clear(); - mList.addAll(collection); - notifyDataSetChanged(); - notifyListDataSetChanged(); - mLastPosition = -1; - return this; - } - - public BaseRecyclerAdapter loadMore(Collection collection) { - mList.addAll(collection); - notifyDataSetChanged(); - notifyListDataSetChanged(); - return this; - } // // @@ -191,6 +163,40 @@ public Object getItem(int position) { public int getCount() { return mList.size(); } + // + // + public T get(int index) { + return mList.get(index); + } + + public BaseRecyclerAdapter setOnItemClickListener(AdapterView.OnItemClickListener listener) { + mListener = listener; + return this; + } + + public BaseRecyclerAdapter refresh(Collection collection) { + mList.clear(); + mList.addAll(collection); + notifyDataSetChanged(); + notifyListDataSetChanged(); + mLastPosition = -1; + return this; + } + + public BaseRecyclerAdapter loadMore(Collection collection) { + mList.addAll(collection); + notifyDataSetChanged(); + notifyListDataSetChanged(); + return this; + } + + public BaseRecyclerAdapter insert(Collection collection) { + mList.addAll(0, collection); + notifyItemRangeInserted(0, collection.size()); + notifyListDataSetChanged(); + return this; + } // + } diff --git a/app/src/main/java/com/scwang/refreshlayout/adapter/SmartViewHolder.java b/app/src/main/java/com/scwang/refreshlayout/adapter/SmartViewHolder.java index 3d5b7ef2..57cb17f2 100644 --- a/app/src/main/java/com/scwang/refreshlayout/adapter/SmartViewHolder.java +++ b/app/src/main/java/com/scwang/refreshlayout/adapter/SmartViewHolder.java @@ -88,4 +88,20 @@ public SmartViewHolder image(int id, int imageId) { } return this; } + + public SmartViewHolder gone(int id) { + View view = findViewById(id); + if (view != null) { + view.setVisibility(View.GONE); + } + return this; + } + + public SmartViewHolder visible(int id) { + View view = findViewById(id); + if (view != null) { + view.setVisibility(View.VISIBLE); + } + return this; + } } \ No newline at end of file diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/BottomSheetExampleFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/BottomSheetExampleFragment.java index 889c1f0a..01ca93f0 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/example/BottomSheetExampleFragment.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/BottomSheetExampleFragment.java @@ -47,7 +47,9 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceState) { super.onViewCreated(root, savedInstanceState); - final Toolbar toolbar = (Toolbar)root.findViewById(R.id.toolbar); + root = onCreateView(LayoutInflater.from(getContext()), null, null); + + final Toolbar toolbar = root.findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -55,7 +57,7 @@ public void onClick(View v) { } }); - RefreshLayout refreshLayout = (RefreshLayout) root.findViewById(R.id.refreshLayout); + RefreshLayout refreshLayout = root.findViewById(R.id.refreshLayout); refreshLayout.setRefreshHeader(new ClassicsHeader(getContext()).setSpinnerStyle(SpinnerStyle.FixedBehind).setPrimaryColorId(R.color.colorPrimary).setAccentColorId(android.R.color.white)); refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { @Override @@ -70,13 +72,7 @@ public void run() { } }); - /* - * 重点:设置 srlEnableNestedScrolling 为 false 才可以兼容 BottomSheet - * notice:Set srlEnableNestedScrolling to false to be compatible with BottomSheet - */ - refreshLayout.setEnableNestedScroll(false); - - RecyclerView recyclerView = (RecyclerView) root.findViewById(R.id.recyclerView); + RecyclerView recyclerView = root.findViewById(R.id.recyclerView); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), VERTICAL)); @@ -90,15 +86,15 @@ protected void onBindViewHolder(SmartViewHolder holder, Void model, int position } }); - ((ViewGroup)refreshLayout.getLayout().getParent()).removeView(refreshLayout.getLayout()); - BottomSheetDialog dialog=new BottomSheetDialog(getContext()); + BottomSheetDialog dialog = new BottomSheetDialog(getContext()); dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { getActivity().finish(); } }); - dialog.setContentView(refreshLayout.getLayout()); + dialog.setContentView(root); + dialog.setCancelable(false); dialog.show(); } diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/DisallowInterceptExampleFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/DisallowInterceptExampleFragment.java new file mode 100644 index 00000000..edecd057 --- /dev/null +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/DisallowInterceptExampleFragment.java @@ -0,0 +1,112 @@ +package com.scwang.refreshlayout.fragment.example; + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.widget.*; +import android.util.AttributeSet; +import android.view.*; +import com.scwang.refreshlayout.R; + +/** + * A simple {@link Fragment} subclass. + */ +public class DisallowInterceptExampleFragment extends Fragment { + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_example_disallow_intercept, container, false); + } + + @Override + public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceState) { + super.onViewCreated(root, savedInstanceState); + + final Toolbar toolbar = root.findViewById(R.id.toolbar); + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + getActivity().finish(); + } + }); + } + + public static class MoveView extends AppCompatTextView { + + + //移动的阈值 + private static final int TOUCH_SLOP = 20; + /** + * 点击按下事件 X坐标记录 + */ + private float mLastMotionX; + /** + * 点击按下事件 Y坐标记录 + */ + private float mLastMotionY; + + private boolean mDelay; + + /** + * 长按模式的标记位 + */ + private boolean isLongPress; + + /** + * 长按的runnable + */ + private Runnable mLongPressRunnable = new Runnable() { + @Override + public void run() { + isLongPress = true; + mDelay = false; + getParent().requestDisallowInterceptTouchEvent(true); + } + }; + + public MoveView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + float x = event.getX(); + float y = event.getY(); + + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + mLastMotionX = x; + mLastMotionY = y; + postDelayed(mLongPressRunnable, ViewConfiguration.getLongPressTimeout()); + mDelay = true; + break; + case MotionEvent.ACTION_MOVE: + if (isLongPress) { + //长按状态下.绘制时间和轴线 + setText("x=" + x + ";y=" + y); + } else if (mDelay && (Math.abs(mLastMotionX - x) > TOUCH_SLOP + || Math.abs(mLastMotionY - y) > TOUCH_SLOP)) { + //移动超过阈值,则表示移动了 + removeCallbacks(mLongPressRunnable); + mDelay = false; + } + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + default: + //释放了 + removeCallbacks(mLongPressRunnable); + isLongPress = false; + mDelay = false; + invalidate(); + break; + } + return true; + } + + } +} diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/EmptyLayoutExampleFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/EmptyLayoutExampleFragment.java index 208b92a2..35bd1e13 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/example/EmptyLayoutExampleFragment.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/EmptyLayoutExampleFragment.java @@ -70,7 +70,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceState) { super.onViewCreated(root, savedInstanceState); - final Toolbar toolbar = (Toolbar)root.findViewById(R.id.toolbar); + final Toolbar toolbar = root.findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -78,16 +78,16 @@ public void onClick(View v) { } }); - mRefreshLayout = (RefreshLayout) root.findViewById(refreshLayout); + mRefreshLayout = root.findViewById(refreshLayout); mRefreshLayout.setRefreshHeader(new ClassicsHeader(getContext()).setSpinnerStyle(SpinnerStyle.FixedBehind).setPrimaryColorId(R.color.colorPrimary).setAccentColorId(android.R.color.white)); mRefreshLayout.setOnRefreshListener(this); - mRecyclerView = (RecyclerView) root.findViewById(recyclerView); + mRecyclerView = root.findViewById(recyclerView); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), VERTICAL)); - mLoadingLayout = (LoadingLayout) root.findViewById(R.id.loading); + mLoadingLayout = root.findViewById(R.id.loading); mLoadingLayout.showEmpty(); /*主动演示刷新*/ diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/EmptyLayoutExampleFragmentInner.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/EmptyLayoutExampleFragmentInner.java index f8ae9861..17d114e2 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/example/EmptyLayoutExampleFragmentInner.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/EmptyLayoutExampleFragmentInner.java @@ -31,6 +31,7 @@ import com.scwang.smartrefresh.layout.listener.OnRefreshListener; import com.scwang.smartrefresh.layout.listener.SimpleMultiPurposeListener; +import java.util.ArrayList; import java.util.Arrays; import static android.R.layout.simple_list_item_2; @@ -48,6 +49,7 @@ public class EmptyLayoutExampleFragmentInner extends Fragment implements Adapter private RecyclerView mRecyclerView; private RefreshLayout mRefreshLayout; private static boolean mIsNeedDemo = true; + private BaseRecyclerAdapter mAdapter; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -58,7 +60,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceState) { super.onViewCreated(root, savedInstanceState); - final Toolbar toolbar = (Toolbar)root.findViewById(R.id.toolbar); + final Toolbar toolbar = root.findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -66,21 +68,29 @@ public void onClick(View v) { } }); - mRefreshLayout = (RefreshLayout) root.findViewById(refreshLayout); + mRefreshLayout = root.findViewById(refreshLayout); mRefreshLayout.setRefreshHeader(new ClassicsHeader(getContext()).setSpinnerStyle(SpinnerStyle.FixedBehind).setPrimaryColorId(R.color.colorPrimary).setAccentColorId(android.R.color.white)); mRefreshLayout.setOnRefreshListener(this); - mRecyclerView = (RecyclerView) root.findViewById(recyclerView); + mRecyclerView = root.findViewById(recyclerView); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), VERTICAL)); + mRecyclerView.setAdapter(mAdapter = new BaseRecyclerAdapter(new ArrayList(), simple_list_item_2,EmptyLayoutExampleFragmentInner.this) { + @Override + protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { + holder.text(android.R.id.text1, model.name()); + holder.text(android.R.id.text2, model.name); + holder.textColorId(android.R.id.text2, R.color.colorTextAssistant); + } + }); mEmptyLayout = root.findViewById(R.id.empty); - ImageView image = (ImageView) root.findViewById(R.id.empty_image); + ImageView image = root.findViewById(R.id.empty_image); image.setImageResource(R.drawable.ic_empty); - TextView empty = (TextView) root.findViewById(R.id.empty_text); + TextView empty = root.findViewById(R.id.empty_text); empty.setText("暂无数据下拉刷新"); /*主动演示刷新*/ @@ -111,14 +121,7 @@ public void onRefresh(@NonNull RefreshLayout refreshLayout) { mRefreshLayout.getLayout().postDelayed(new Runnable() { @Override public void run() { - mRecyclerView.setAdapter(new BaseRecyclerAdapter(Arrays.asList(Item.values()), simple_list_item_2,EmptyLayoutExampleFragmentInner.this) { - @Override - protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { - holder.text(android.R.id.text1, model.name()); - holder.text(android.R.id.text2, model.name); - holder.textColorId(android.R.id.text2, R.color.colorTextAssistant); - } - }); + mAdapter.refresh(Arrays.asList(Item.values())); mRefreshLayout.finishRefresh(); mEmptyLayout.setVisibility(View.GONE); } diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/EmptyLayoutExampleFragmentOuter.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/EmptyLayoutExampleFragmentOuter.java index 04e2d3c3..8a6ed357 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/example/EmptyLayoutExampleFragmentOuter.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/EmptyLayoutExampleFragmentOuter.java @@ -55,7 +55,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceState) { super.onViewCreated(root, savedInstanceState); - final Toolbar toolbar = (Toolbar)root.findViewById(R.id.toolbar); + final Toolbar toolbar = root.findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -63,21 +63,21 @@ public void onClick(View v) { } }); - mRefreshLayout = (RefreshLayout) root.findViewById(refreshLayout); + mRefreshLayout = root.findViewById(refreshLayout); mRefreshLayout.setRefreshHeader(new ClassicsHeader(getContext()).setSpinnerStyle(SpinnerStyle.FixedBehind).setPrimaryColorId(R.color.colorPrimary).setAccentColorId(android.R.color.white)); mRefreshLayout.setOnRefreshListener(this); - mRecyclerView = (RecyclerView) root.findViewById(recyclerView); + mRecyclerView = root.findViewById(recyclerView); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), VERTICAL)); mEmptyLayout = root.findViewById(R.id.empty); - ImageView image = (ImageView) root.findViewById(R.id.empty_image); + ImageView image = root.findViewById(R.id.empty_image); image.setImageResource(R.drawable.ic_empty); - TextView empty = (TextView) root.findViewById(R.id.empty_text); + TextView empty = root.findViewById(R.id.empty_text); empty.setText("暂无数据点击刷新"); ((View)empty.getParent()).setOnClickListener(new View.OnClickListener() { diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/FlexBoxLayoutManagerFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/FlexBoxLayoutManagerFragment.java new file mode 100644 index 00000000..d3c68e66 --- /dev/null +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/FlexBoxLayoutManagerFragment.java @@ -0,0 +1,98 @@ +package com.scwang.refreshlayout.fragment.example; + + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +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.ImageView; + +import com.google.android.flexbox.AlignItems; +import com.google.android.flexbox.FlexDirection; +import com.google.android.flexbox.FlexWrap; +import com.google.android.flexbox.FlexboxLayoutManager; +import com.scwang.refreshlayout.R; +import com.scwang.refreshlayout.adapter.BaseRecyclerAdapter; +import com.scwang.refreshlayout.adapter.SmartViewHolder; +import com.scwang.smartrefresh.layout.util.SmartUtil; + +import java.util.Arrays; +import java.util.Random; + +/** + * A simple {@link Fragment} subclass. + */ +public class FlexBoxLayoutManagerFragment extends Fragment { + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_flexbox_layout_manager, container, false); + } + + @Override + public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceState) { + super.onViewCreated(root, savedInstanceState); + + + final Toolbar toolbar = root.findViewById(R.id.toolbar); + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + getActivity().finish(); + } + }); + + FlexboxLayoutManager manager = new FlexboxLayoutManager(root.getContext()); + //设置主轴排列方式 + manager.setFlexDirection(FlexDirection.ROW); + //设置是否换行 + manager.setFlexWrap(FlexWrap.WRAP); + manager.setAlignItems(AlignItems.STRETCH); + + RecyclerView recyclerView = root.findViewById(R.id.recyclerView); + recyclerView.setLayoutManager(manager); + recyclerView.setClipToPadding(false); + recyclerView.setPadding(SmartUtil.dp2px(2.5f),SmartUtil.dp2px(2.5f),SmartUtil.dp2px(2.5f),SmartUtil.dp2px(2.5f)); + + recyclerView.setAdapter(new BaseRecyclerAdapter(Arrays.asList(new Object[100]),0) { + + Random random = new Random(); + + @Override + protected void onBindViewHolder(SmartViewHolder holder, Object model, int position) { + + int[] colorIds = { + R.color.colorPrimaryDark, + android.R.color.holo_green_dark, + android.R.color.holo_red_dark, + android.R.color.holo_orange_dark, + }; + + holder.itemView.setBackgroundResource(colorIds[random.nextInt(colorIds.length)]); + holder.itemView.setMinimumWidth(SmartUtil.dp2px(70f + random.nextInt(70))); + } + @NonNull + @Override + public SmartViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + FlexboxLayoutManager.LayoutParams lp = new FlexboxLayoutManager.LayoutParams(-2,-2); + lp.setFlexGrow(1); + lp.bottomMargin = SmartUtil.dp2px(2.5f); + lp.topMargin = SmartUtil.dp2px(2.5f); + lp.leftMargin = SmartUtil.dp2px(2.5f); + lp.rightMargin = SmartUtil.dp2px(2.5f); + ImageView imageVIew = new ImageView(parent.getContext()); + imageVIew.setMinimumWidth(SmartUtil.dp2px(90f)); + imageVIew.setMinimumHeight(SmartUtil.dp2px(90f)); + imageVIew.setLayoutParams(lp); + return new SmartViewHolder(imageVIew, mListener); + } + }); + } + + +} diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/HorizontalExampleFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/HorizontalExampleFragment.java new file mode 100644 index 00000000..a3b516c4 --- /dev/null +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/HorizontalExampleFragment.java @@ -0,0 +1,111 @@ +package com.scwang.refreshlayout.fragment.example; + + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +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 com.scwang.refreshlayout.R; +import com.scwang.refreshlayout.adapter.BaseRecyclerAdapter; +import com.scwang.refreshlayout.adapter.SmartViewHolder; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener; + +import java.util.Arrays; +import java.util.Collection; + +import static android.R.layout.simple_list_item_2; + +/** + * A simple {@link Fragment} subclass. + */ +public class HorizontalExampleFragment extends Fragment { + + private BaseRecyclerAdapter mAdapter; + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_example_horizontal, container, false); + } + + @Override + public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceState) { + super.onViewCreated(root, savedInstanceState); + + final Toolbar toolbar = root.findViewById(R.id.toolbar); + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + getActivity().finish(); + } + }); + + final RecyclerView recyclerView = root.findViewById(R.id.recyclerView); + + recyclerView.setAdapter(mAdapter = new BaseRecyclerAdapter(simple_list_item_2) { + + int[] colorIds = { + android.R.color.holo_blue_dark, + android.R.color.holo_green_dark, + android.R.color.holo_red_dark, + android.R.color.holo_orange_dark, + }; + + @Override + protected void onBindViewHolder(SmartViewHolder holder, Void model, int position) { + holder.itemView.getLayoutParams().width = -2;//SmartUtil.dp2px(100); + holder.itemView.getLayoutParams().height = -1; + holder.itemView.setBackgroundResource(colorIds[position%colorIds.length]); + holder.text(android.R.id.text1, getString(R.string.item_example_number_title, position)); + holder.textColorId(android.R.id.text1, android.R.color.white); + + } + }); + + mAdapter.refresh(initData()); + + RefreshLayout refreshLayout = root.findViewById(R.id.refreshLayout); +//// refreshLayout.setRefreshHeader(new MaterialHeader(root.getContext())); +// refreshLayout.setRefreshFooter(new RefreshFooterWrapper(new MaterialHeader(root.getContext())), -1, -2); +//// refreshLayout.setEnableHeaderTranslationContent(true); +// refreshLayout.setEnableFooterTranslationContent(true); +// refreshLayout.setEnableAutoLoadMore(false); + + refreshLayout.setOnRefreshLoadMoreListener(new OnRefreshLoadMoreListener() { + @Override + public void onRefresh(@NonNull final RefreshLayout refreshLayout) { + refreshLayout.getLayout().postDelayed(new Runnable() { + @Override + public void run() { + mAdapter.refresh(initData()); + refreshLayout.finishRefresh(); + } + }, 2000); + } + + @Override + public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { + recyclerView.stopScroll(); + recyclerView.stopNestedScroll(); + refreshLayout.getLayout().postDelayed(new Runnable() { + @Override + public void run() { + mAdapter.loadMore(initData()); + refreshLayout.finishLoadMore(); + } + }, 2000); + } + }); + } + + private Collection initData() { + return Arrays.asList(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null); + } +} diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/NestedScrollExampleFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/NestedScrollExampleFragment.java index 7d4d23f0..66f9f358 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/example/NestedScrollExampleFragment.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/NestedScrollExampleFragment.java @@ -67,7 +67,7 @@ public void onDestroy() { public void onViewCreated(@NonNull final View root, @Nullable Bundle savedInstanceState) { super.onViewCreated(root, savedInstanceState); - Toolbar toolbar = (Toolbar) root.findViewById(R.id.toolbar); + Toolbar toolbar = root.findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -76,7 +76,7 @@ public void onClick(View v) { }); final BaseRecyclerAdapter adapter; - RecyclerView recyclerView = (RecyclerView) root.findViewById(R.id.recyclerView); + RecyclerView recyclerView = root.findViewById(R.id.recyclerView); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), VERTICAL)); @@ -101,15 +101,20 @@ public void run() { adapter.loadMore(Arrays.asList(Item.values())); } }; - final RefreshLayout refreshLayout = (RefreshLayout) root.findViewById(R.id.refreshLayout); - refreshLayout.setEnableFooterFollowWhenLoadFinished(true); + final RefreshLayout refreshLayout = root.findViewById(R.id.refreshLayout); + refreshLayout.setEnableFooterFollowWhenNoMoreData(true); refreshLayout.setRefreshFooter(new ClassicsFooter(getContext())); refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { @Override - public void onLoadMore(@NonNull RefreshLayout refreshLayout) { - if (adapter.getItemCount() < 20) { - loadMore.run(); - refreshLayout.finishLoadMore(2000); + public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { + if (adapter.getItemCount() < 100) { + refreshLayout.getLayout().postDelayed(new Runnable() { + @Override + public void run() { + loadMore.run(); + refreshLayout.finishLoadMore(); + } + }, 2000); } else { refreshLayout.finishLoadMoreWithNoMoreData(); } @@ -121,7 +126,7 @@ public void onLoadMore(@NonNull RefreshLayout refreshLayout) { /* * 监听 AppBarLayout 的关闭和开启 ActionButton 设置关闭隐藏动画 */ - AppBarLayout appBarLayout = (AppBarLayout) root.findViewById(R.id.appbar); + AppBarLayout appBarLayout = root.findViewById(R.id.appbar); appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { boolean misAppbarExpand = true; View fab = root.findViewById(R.id.fab); diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/NestedScrollExampleFragmentIntegral.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/NestedScrollExampleFragmentIntegral.java index 665bb91d..284451a3 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/example/NestedScrollExampleFragmentIntegral.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/NestedScrollExampleFragmentIntegral.java @@ -6,6 +6,9 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentStatePagerAdapter; +import android.support.v4.view.ViewPager; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; @@ -16,13 +19,18 @@ import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; import com.scwang.refreshlayout.R; import com.scwang.refreshlayout.adapter.BaseRecyclerAdapter; import com.scwang.refreshlayout.adapter.SmartViewHolder; import com.scwang.refreshlayout.fragment.example.NestedScrollExampleFragment.Item; +import com.scwang.smartrefresh.header.PhoenixHeader; +import com.scwang.smartrefresh.layout.SmartRefreshLayout; import com.scwang.smartrefresh.layout.api.RefreshLayout; import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener; import com.youth.banner.Banner; import com.youth.banner.loader.ImageLoader; @@ -32,7 +40,6 @@ import java.util.List; import static android.R.layout.simple_list_item_2; -import static android.support.v7.widget.DividerItemDecoration.VERTICAL; import static com.scwang.refreshlayout.R.mipmap.gif_header_repast; import static com.scwang.refreshlayout.R.mipmap.image_weibo_home_2; @@ -40,9 +47,12 @@ * 使用示例-嵌套滚动-整体 * A simple {@link Fragment} subclass. */ -public class NestedScrollExampleFragmentIntegral extends Fragment implements AdapterView.OnItemClickListener { +public class NestedScrollExampleFragmentIntegral extends Fragment implements AdapterView.OnItemClickListener, OnRefreshLoadMoreListener { - private BaseRecyclerAdapter mAdapter; + private ViewPager mViewPager; + private SmartPagerAdapter mAdapter; + +// private BaseRecyclerAdapter mAdapter; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -53,7 +63,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, public void onViewCreated(@NonNull final View root, @Nullable Bundle savedInstanceState) { super.onViewCreated(root, savedInstanceState); - Toolbar toolbar = (Toolbar) root.findViewById(R.id.toolbar); + Toolbar toolbar = root.findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -61,45 +71,58 @@ public void onClick(View v) { } }); - Banner banner = (Banner) root.findViewById(R.id.banner); + Banner banner = root.findViewById(R.id.banner); banner.setImageLoader(new BannerImageLoader()); banner.setImages(Arrays.asList(image_weibo_home_2,gif_header_repast)); banner.start(); - RecyclerView recyclerView = (RecyclerView) root.findViewById(R.id.recyclerView); - recyclerView.setItemAnimator(new DefaultItemAnimator()); - recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), VERTICAL)); - recyclerView.setAdapter(mAdapter = new BaseRecyclerAdapter(buildItems(), simple_list_item_2, NestedScrollExampleFragmentIntegral.this) { + mViewPager = root.findViewById(R.id.viewPager); + mViewPager.setAdapter(mAdapter = new SmartPagerAdapter(getChildFragmentManager())); +// RecyclerView recyclerView = root.findViewById(R.id.recyclerView); +// recyclerView.setItemAnimator(new DefaultItemAnimator()); +// recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); +// recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), VERTICAL)); +// recyclerView.setAdapter(mAdapter = new BaseRecyclerAdapter(buildItems(), simple_list_item_2, NestedScrollExampleFragmentIntegral.this) { +// @Override +// protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { +// holder.text(android.R.id.text1, model.name()); +// holder.text(android.R.id.text2, model.name); +// holder.textColorId(android.R.id.text2, R.color.colorTextAssistant); +// } +// }); + + RefreshLayout refreshLayout = root.findViewById(R.id.refreshLayout); + refreshLayout.setOnRefreshLoadMoreListener(this); +// refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { +// @Override +// public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { +// refreshLayout.getLayout().postDelayed(new Runnable() { +// @Override +// public void run() { +// mAdapter.loadMore(buildItems()); +// refreshLayout.finishLoadMore(); +// } +// }, 2000); +// } +// }); + + TextView textView = root.findViewById(R.id.target); + textView.setOnClickListener(new View.OnClickListener() { @Override - protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { - holder.text(android.R.id.text1, model.name()); - holder.text(android.R.id.text2, model.name); - holder.textColorId(android.R.id.text2, R.color.colorTextAssistant); + public void onClick(View v) { + Toast.makeText(getContext(), "点击测试", Toast.LENGTH_SHORT).show(); } }); + } - RefreshLayout refreshLayout = (RefreshLayout) root.findViewById(R.id.refreshLayout); - refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { - @Override - public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { - refreshLayout.getLayout().postDelayed(new Runnable() { - @Override - public void run() { - mAdapter.loadMore(buildItems()); - refreshLayout.finishLoadMore(); - } - }, 2000); - } - }); + @Override + public void onRefresh(@NonNull RefreshLayout refreshLayout) { + mAdapter.fragments[mViewPager.getCurrentItem()].onRefresh(refreshLayout); } - private Collection buildItems() { - List items = new ArrayList<>(); - for (int i = 0; i < 10; i++) { - items.addAll(Arrays.asList(Item.values())); - } - return items; + @Override + public void onLoadMore(@NonNull RefreshLayout refreshLayout) { + mAdapter.fragments[mViewPager.getCurrentItem()].onLoadMore(refreshLayout); } @Override @@ -113,4 +136,89 @@ public void displayImage(Context context, Object path, ImageView imageView) { imageView.setImageResource((Integer)path); } } + + + public static class SmartPagerAdapter extends FragmentStatePagerAdapter { + + private final SmartFragment[] fragments; + + SmartPagerAdapter(FragmentManager fm) { + super(fm); + this.fragments = new SmartFragment[]{ + new SmartFragment(),new SmartFragment() + }; + } + + @Override + public int getCount() { + return fragments.length; + } + + @Override + public Fragment getItem(int position) { + return fragments[position]; + } + } + + public static class SmartFragment extends Fragment { + + private RecyclerView mRecyclerView; + private BaseRecyclerAdapter mAdapter; + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return mRecyclerView = new RecyclerView(inflater.getContext()); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mRecyclerView.setItemAnimator(new DefaultItemAnimator()); + mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(),DividerItemDecoration.VERTICAL)); + mRecyclerView.setAdapter(mAdapter = new BaseRecyclerAdapter(buildItems(), simple_list_item_2) { + @Override + protected void onBindViewHolder(SmartViewHolder holder, Item model, int position) { + holder.text(android.R.id.text1, model.name()); + holder.text(android.R.id.text2, model.name); + holder.textColorId(android.R.id.text2, R.color.colorTextAssistant); + } + }); + } + + private Collection buildItems() { + List items = new ArrayList<>(); + for (int i = 0; i < 10; i++) { + items.addAll(Arrays.asList(Item.values())); + } + return items; + } + + + public void onRefresh(final RefreshLayout refreshLayout) { + refreshLayout.getLayout().postDelayed(new Runnable() { + @Override + public void run() { + mAdapter.refresh(buildItems()); + refreshLayout.finishRefresh(); + refreshLayout.resetNoMoreData();//setNoMoreData(false); + } + }, 2000); + } + + public void onLoadMore(final RefreshLayout refreshLayout) { + refreshLayout.getLayout().postDelayed(new Runnable() { + @Override + public void run() { + mAdapter.loadMore(buildItems()); + if (mAdapter.getItemCount() > 60) { + Toast.makeText(getContext(), "数据全部加载完毕", Toast.LENGTH_SHORT).show(); + refreshLayout.finishLoadMoreWithNoMoreData();//将不会再次触发加载更多事件 + } else { + refreshLayout.finishLoadMore(); + } + } + }, 2000); + } + } } diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/NestedScrollExampleFragmentViewPager.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/NestedScrollExampleFragmentViewPager.java index 27b1f0ee..19efcbfd 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/example/NestedScrollExampleFragmentViewPager.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/NestedScrollExampleFragmentViewPager.java @@ -6,6 +6,7 @@ import android.support.annotation.Nullable; import android.support.design.widget.AppBarLayout; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.widget.DefaultItemAnimator; @@ -45,7 +46,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, public void onViewCreated(@NonNull final View root, @Nullable Bundle savedInstanceState) { super.onViewCreated(root, savedInstanceState); - Toolbar toolbar = (Toolbar) root.findViewById(R.id.toolbar); + Toolbar toolbar = root.findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -53,13 +54,13 @@ public void onClick(View v) { } }); - ViewPager viewPager = (ViewPager) root.findViewById(R.id.viewPager); - viewPager.setAdapter(new SmartPagerAdapter()); + ViewPager viewPager = root.findViewById(R.id.viewPager); + viewPager.setAdapter(new SmartPagerAdapter(getChildFragmentManager())); /* * 监听 AppBarLayout 的关闭和开启 ActionButton 设置关闭隐藏动画 */ - AppBarLayout appBarLayout = (AppBarLayout) root.findViewById(R.id.appbar); + AppBarLayout appBarLayout = root.findViewById(R.id.appbar); appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { boolean misAppbarExpand = true; View fab = root.findViewById(R.id.fab); @@ -80,12 +81,12 @@ public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { } - private class SmartPagerAdapter extends FragmentStatePagerAdapter { + public static class SmartPagerAdapter extends FragmentStatePagerAdapter { private final SmartFragment[] fragments; - SmartPagerAdapter() { - super(getChildFragmentManager()); + SmartPagerAdapter(FragmentManager fm) { + super(fm); this.fragments = new SmartFragment[]{ new SmartFragment(),new SmartFragment() }; @@ -143,7 +144,7 @@ public void onRefresh(final RefreshLayout refreshLayout) { public void run() { mAdapter.refresh(initData()); refreshLayout.finishRefresh(); - refreshLayout.setNoMoreData(false); + refreshLayout.resetNoMoreData();//setNoMoreData(false); } }, 2000); } diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/NoMoreDataExampleFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/NoMoreDataExampleFragment.java new file mode 100644 index 00000000..3dafc1ae --- /dev/null +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/NoMoreDataExampleFragment.java @@ -0,0 +1,125 @@ +package com.scwang.refreshlayout.fragment.example; + + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.widget.DividerItemDecoration; +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 com.scwang.refreshlayout.R; +import com.scwang.refreshlayout.adapter.BaseRecyclerAdapter; +import com.scwang.refreshlayout.adapter.SmartViewHolder; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Random; + +import static android.R.layout.simple_list_item_2; +import static android.support.v7.widget.DividerItemDecoration.VERTICAL; + +/** + * A simple {@link Fragment} subclass. + */ +public class NoMoreDataExampleFragment extends Fragment { + + private BaseRecyclerAdapter mAdapter; + + public NoMoreDataExampleFragment() { + // Required empty public constructor + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_no_more_data_example, container, false); + } + + @Override + public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceState) { + super.onViewCreated(root, savedInstanceState); + + final Toolbar toolbar = root.findViewById(R.id.toolbar); + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + getActivity().finish(); + } + }); + + RecyclerView recyclerView = root.findViewById(R.id.recyclerView); + if (recyclerView != null) { + recyclerView.setNestedScrollingEnabled(false); + recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), VERTICAL)); + recyclerView.setAdapter(mAdapter = new BaseRecyclerAdapter(simple_list_item_2) { + @Override + protected void onBindViewHolder(SmartViewHolder holder, Void model, int position) { + holder.text(android.R.id.text1, getString(R.string.item_example_number_title, position)); + holder.text(android.R.id.text2, getString(R.string.item_example_number_abstract, position)); + holder.textColorId(android.R.id.text2, R.color.colorTextAssistant); + } + }); + } + + RefreshLayout refreshLayout = root.findViewById(R.id.refreshLayout); + if (refreshLayout != null) { + refreshLayout.autoRefresh(); + refreshLayout.setEnableLoadMoreWhenContentNotFull(false); + refreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(@NonNull final RefreshLayout refreshLayout) { + refreshLayout.getLayout().postDelayed(new Runnable() { + @Override + public void run() { + Collection data = loadData(); + mAdapter.refresh(data); + if (data.size() < 9) { + refreshLayout.finishRefreshWithNoMoreData(); + } else { + refreshLayout.finishRefresh(); + } + } + }, 1000); + } + }); + refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { + refreshLayout.getLayout().postDelayed(new Runnable() { + @Override + public void run() { + Collection list = loadData(); + mAdapter.loadMore(list); + if (list.size() < 10) { + refreshLayout.finishLoadMoreWithNoMoreData(); + } else { + refreshLayout.finishLoadMore(); + } + } + }, 1000); + } + }); + } + } + + private Random random = new Random(); + + private Collection loadData() { + int count = 3 + random.nextInt(10); + List list = new ArrayList<>(count); + for (int i = 0; i < count; i++) { + list.add(null); + } + return list; + } +} diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/PureScrollExampleFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/PureScrollExampleFragment.java index 612a06cf..408745ca 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/example/PureScrollExampleFragment.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/PureScrollExampleFragment.java @@ -55,7 +55,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceState) { super.onViewCreated(root, savedInstanceState); - final Toolbar toolbar = (Toolbar)root.findViewById(R.id.toolbar); + final Toolbar toolbar = root.findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/PureScrollExampleFragmentFooter.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/PureScrollExampleFragmentFooter.java index 38b70989..8bcd7528 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/example/PureScrollExampleFragmentFooter.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/PureScrollExampleFragmentFooter.java @@ -23,7 +23,6 @@ import com.scwang.refreshlayout.adapter.SmartViewHolder; import com.scwang.refreshlayout.fragment.example.PureScrollExampleFragment.Item; import com.scwang.smartrefresh.layout.api.RefreshLayout; -import com.scwang.smartrefresh.layout.footer.FalsifyFooter; import java.util.Arrays; @@ -45,7 +44,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceState) { super.onViewCreated(root, savedInstanceState); - Toolbar toolbar = (Toolbar) root.findViewById(R.id.toolbar); + Toolbar toolbar = root.findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -54,9 +53,11 @@ public void onClick(View v) { }); toolbar.setTitle("Footer单独使用"); - RefreshLayout refreshLayout = (RefreshLayout) root.findViewById(R.id.refreshLayout); - refreshLayout.setEnablePureScrollMode(false); - refreshLayout.setRefreshFooter(new FalsifyFooter(getContext())); + RefreshLayout refreshLayout = root.findViewById(R.id.refreshLayout); + refreshLayout.setEnablePureScrollMode(true); + refreshLayout.setEnableRefresh(false); + refreshLayout.setEnableLoadMore(true); +// refreshLayout.setRefreshFooter(new FalsifyFooter(getContext())); View view = root.findViewById(R.id.recyclerView); if (view instanceof RecyclerView) { diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/PureScrollExampleFragmentHeader.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/PureScrollExampleFragmentHeader.java index a58e222c..a0b5a050 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/example/PureScrollExampleFragmentHeader.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/PureScrollExampleFragmentHeader.java @@ -45,7 +45,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceState) { super.onViewCreated(root, savedInstanceState); - final Toolbar toolbar = (Toolbar)root.findViewById(R.id.toolbar); + final Toolbar toolbar = root.findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -53,7 +53,7 @@ public void onClick(View v) { } }); - RefreshLayout refreshLayout = (RefreshLayout) root.findViewById(R.id.refreshLayout); + RefreshLayout refreshLayout = root.findViewById(R.id.refreshLayout); refreshLayout.setRefreshHeader(new FalsifyHeader(getContext()));//也可以在 XML 中添加 FalsifyHeader View view = root.findViewById(R.id.recyclerView); diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/SpecifyStyleExampleFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/SpecifyStyleExampleFragment.java index 6861f719..11a63239 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/example/SpecifyStyleExampleFragment.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/SpecifyStyleExampleFragment.java @@ -58,7 +58,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceState) { super.onViewCreated(root, savedInstanceState); - final Toolbar toolbar = (Toolbar)root.findViewById(R.id.toolbar); + final Toolbar toolbar = root.findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/StaggeredGridExampleFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/StaggeredGridExampleFragment.java new file mode 100644 index 00000000..e78cb744 --- /dev/null +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/StaggeredGridExampleFragment.java @@ -0,0 +1,77 @@ +package com.scwang.refreshlayout.fragment.example; + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.widget.DefaultItemAnimator; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.scwang.refreshlayout.R; +import com.scwang.refreshlayout.adapter.BaseRecyclerAdapter; +import com.scwang.refreshlayout.adapter.SmartViewHolder; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener; + +import java.util.Arrays; +import java.util.Collection; + +/** + * A simple {@link Fragment} subclass. + */ +public class StaggeredGridExampleFragment extends Fragment { + + private BaseRecyclerAdapter mAdapter; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_example_staggered_grid, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState);//初始化列表和监听 + View recycler = view.findViewById(R.id.recyclerView); + if (recycler instanceof RecyclerView) { + RecyclerView recyclerView = (RecyclerView) recycler; + recyclerView.setItemAnimator(new DefaultItemAnimator()); + recyclerView.setAdapter(mAdapter = new BaseRecyclerAdapter(loadModels(), R.layout.item_example_snap_helper) { + @Override + protected void onBindViewHolder(SmartViewHolder holder, Integer model, int position) { + holder.image(R.id.imageView, model); + } + }); + } + + RefreshLayout refreshLayout = view.findViewById(R.id.refreshLayout); + refreshLayout.setOnRefreshLoadMoreListener(new OnRefreshLoadMoreListener() { + @Override + public void onRefresh(@NonNull RefreshLayout refreshLayout) { + refreshLayout.getLayout().postDelayed(() -> { + mAdapter.refresh(loadModels()); + refreshLayout.finishRefresh(); + }, 2000); + } + + @Override + public void onLoadMore(@NonNull RefreshLayout refreshLayout) { + refreshLayout.getLayout().postDelayed(() -> { + mAdapter.loadMore(loadModels()); + refreshLayout.finishLoadMore(); + }, 2000); + } + }); + + } + + private Collection loadModels() { + return Arrays.asList(R.mipmap.image_weibo_home_1, R.mipmap.image_weibo_home_2, R.mipmap.image_weibo_home_1, R.mipmap.image_weibo_home_2, R.mipmap.image_weibo_home_1, R.mipmap.image_weibo_home_2, R.mipmap.image_weibo_home_1, R.mipmap.image_weibo_home_2, R.mipmap.image_weibo_home_1, R.mipmap.image_weibo_home_2, R.mipmap.image_weibo_home_1, R.mipmap.image_weibo_home_2, R.mipmap.image_weibo_home_1, R.mipmap.image_weibo_home_2, R.mipmap.image_weibo_home_1, R.mipmap.image_weibo_home_2, R.mipmap.image_weibo_home_1, R.mipmap.image_weibo_home_2, R.mipmap.image_weibo_home_1, R.mipmap.image_weibo_home_2); + } + + +} diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/ThreeLevelExampleFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/ThreeLevelExampleFragment.java index 46bf342b..a1939831 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/example/ThreeLevelExampleFragment.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/ThreeLevelExampleFragment.java @@ -39,7 +39,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - final Toolbar toolbar = (Toolbar)view.findViewById(R.id.toolbar); + final Toolbar toolbar = view.findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -47,7 +47,7 @@ public void onClick(View v) { } }); - RecyclerView recyclerView = (RecyclerView)view.findViewById(R.id.recyclerView); + RecyclerView recyclerView = view.findViewById(R.id.recyclerView); if (recyclerView != null) { recyclerView.setAdapter(new BaseRecyclerAdapter(initData(), simple_list_item_2) { @Override @@ -60,7 +60,7 @@ protected void onBindViewHolder(SmartViewHolder holder, Void model, int position }); } - RefreshLayout refreshLayout1 = (RefreshLayout) view.findViewById(R.id.refreshLayout1); + RefreshLayout refreshLayout1 = view.findViewById(R.id.refreshLayout1); if (refreshLayout1 != null) { refreshLayout1.setOnRefreshListener(new OnRefreshListener() { @Override @@ -69,8 +69,9 @@ public void onRefresh(@NonNull RefreshLayout refreshLayout) { } }); } - RefreshLayout refreshLayout2 = (RefreshLayout) view.findViewById(R.id.refreshLayout2); + RefreshLayout refreshLayout2 = view.findViewById(R.id.refreshLayout2); if (refreshLayout2 != null) { + refreshLayout2.getLayout().setEnabled(false); refreshLayout2.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh(@NonNull RefreshLayout refreshLayout) { diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/example/ViewPagerExampleFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/example/ViewPagerExampleFragment.java index 3f3b2ec7..2761b9fd 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/example/ViewPagerExampleFragment.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/example/ViewPagerExampleFragment.java @@ -67,7 +67,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceState) { super.onViewCreated(root, savedInstanceState); - final Toolbar toolbar = (Toolbar)root.findViewById(R.id.toolbar); + final Toolbar toolbar = root.findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -75,13 +75,13 @@ public void onClick(View v) { } }); - mRefreshLayout = (RefreshLayout) root.findViewById(refreshLayout); + mRefreshLayout = root.findViewById(refreshLayout); mRefreshLayout.setOnRefreshLoadMoreListener(this); mRefreshLayout.setRefreshHeader(new ClassicsHeader(getContext())); mRefreshLayout.setRefreshFooter(new ClassicsFooter(getContext())); - mViewPager = (ViewPager) root.findViewById(R.id.viewPager); - mTabLayout = (TabLayout) root.findViewById(R.id.tableLayout); + mViewPager = root.findViewById(R.id.viewPager); + mTabLayout = root.findViewById(R.id.tableLayout); mViewPager.setAdapter(mAdapter = new SmartPagerAdapter(Item.values())); mTabLayout.setupWithViewPager(mViewPager, true); @@ -166,7 +166,7 @@ public void onRefresh(final RefreshLayout refreshLayout) { public void run() { mAdapter.refresh(initData()); refreshLayout.finishRefresh(); - refreshLayout.setNoMoreData(false); + refreshLayout.resetNoMoreData();//setNoMoreData(false); } }, 2000); } diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/index/RefreshExampleFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/index/RefreshExampleFragment.java index b4988bea..66b740ca 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/index/RefreshExampleFragment.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/index/RefreshExampleFragment.java @@ -21,17 +21,13 @@ import com.scwang.refreshlayout.activity.FragmentActivity; import com.scwang.refreshlayout.activity.example.BasicExampleActivity; import com.scwang.refreshlayout.activity.example.CustomExampleActivity; +import com.scwang.refreshlayout.activity.example.I18nExampleActivity; import com.scwang.refreshlayout.activity.example.ListenerExampleActivity; import com.scwang.refreshlayout.activity.example.NestedLayoutExampleActivity; import com.scwang.refreshlayout.activity.example.SnapHelperExampleActivity; import com.scwang.refreshlayout.adapter.BaseRecyclerAdapter; import com.scwang.refreshlayout.adapter.SmartViewHolder; -import com.scwang.refreshlayout.fragment.example.BottomSheetExampleFragment; -import com.scwang.refreshlayout.fragment.example.EmptyLayoutExampleFragment; -import com.scwang.refreshlayout.fragment.example.NestedScrollExampleFragment; -import com.scwang.refreshlayout.fragment.example.PureScrollExampleFragment; -import com.scwang.refreshlayout.fragment.example.SpecifyStyleExampleFragment; -import com.scwang.refreshlayout.fragment.example.ViewPagerExampleFragment; +import com.scwang.refreshlayout.fragment.example.*; import com.scwang.refreshlayout.util.StatusBarUtil; import java.util.Arrays; @@ -47,6 +43,7 @@ public class RefreshExampleFragment extends Fragment implements AdapterView.OnIt private enum Item { Basic(R.string.index_example_basic, BasicExampleActivity.class), + NoMoreData(R.string.index_example_style, NoMoreDataExampleFragment.class), SpecifyStyle(R.string.index_example_style, SpecifyStyleExampleFragment.class), EmptyLayout(R.string.index_example_empty, EmptyLayoutExampleFragment.class), NestedLayout(R.string.index_example_layout, NestedLayoutExampleActivity.class), @@ -54,9 +51,14 @@ private enum Item { PureScroll(R.string.index_example_scroll, PureScrollExampleFragment.class), Listener(R.string.index_example_listener, ListenerExampleActivity.class), Custom(R.string.index_example_custom, CustomExampleActivity.class), + I18N(R.string.index_example_custom, I18nExampleActivity.class), SnapHelper(R.string.index_example_snap_helper, SnapHelperExampleActivity.class), ViewPager(R.string.index_example_pager, ViewPagerExampleFragment.class), BottomSheet(R.string.index_example_bottom_sheet,BottomSheetExampleFragment.class), + FlexBoxLayout(R.string.index_example_flex_box, FlexBoxLayoutManagerFragment.class), + Horizontal(R.string.index_example_horizontal, HorizontalExampleFragment.class), + DisallowIntercept(R.string.index_example_disallow_intercept, DisallowInterceptExampleFragment.class), + StaggeredGrid(R.string.index_example_disallow_intercept, StaggeredGridExampleFragment.class), // ThreeLevel(R.string.index_example_level, ThreeLevelExampleFragment.class), ; public int nameId; diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/index/RefreshPracticeFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/index/RefreshPracticeFragment.java index d86ad592..77aabe52 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/index/RefreshPracticeFragment.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/index/RefreshPracticeFragment.java @@ -28,8 +28,11 @@ import com.scwang.refreshlayout.activity.practice.WeiboPracticeActivity; import com.scwang.refreshlayout.adapter.BaseRecyclerAdapter; import com.scwang.refreshlayout.adapter.SmartViewHolder; +import com.scwang.refreshlayout.fragment.practice.InstantPracticeFragment; import com.scwang.refreshlayout.fragment.practice.SecondFloorPracticeFragment; import com.scwang.refreshlayout.util.StatusBarUtil; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; import java.util.Arrays; @@ -52,6 +55,7 @@ private enum Item { QQBrowser(R.string.index_practice_qq_browser, QQBrowserPracticeActivity.class), // TwoLevel("二级刷新", SecondFloorPracticeFragment.class), SecondFloor(R.string.index_practice_second_floor, SecondFloorPracticeFragment.class), + Instant(R.string.index_practice_instant, InstantPracticeFragment.class) ; @StringRes public int name; @@ -88,6 +92,16 @@ protected void onBindViewHolder(SmartViewHolder holder, Item model, int position } }); } + + View refreshLayout = root.findViewById(R.id.refreshLayout); + if (refreshLayout instanceof RefreshLayout) { + ((RefreshLayout) refreshLayout).setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(@NonNull RefreshLayout refreshLayout) { + refreshLayout.finishLoadMore(1000); + } + }); + } } @Override diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/index/RefreshStylesFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/index/RefreshStylesFragment.java index 5d33ddfe..05e40b9d 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/index/RefreshStylesFragment.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/index/RefreshStylesFragment.java @@ -34,15 +34,22 @@ import com.scwang.refreshlayout.adapter.BaseRecyclerAdapter; import com.scwang.refreshlayout.adapter.SmartViewHolder; import com.scwang.refreshlayout.util.StatusBarUtil; +import com.scwang.smartrefresh.header.BezierCircleHeader; +import com.scwang.smartrefresh.header.DeliveryHeader; import com.scwang.smartrefresh.header.DropBoxHeader; import com.scwang.smartrefresh.header.FunGameHitBlockHeader; +import com.scwang.smartrefresh.header.MaterialHeader; import com.scwang.smartrefresh.header.PhoenixHeader; +import com.scwang.smartrefresh.header.TaurusHeader; +import com.scwang.smartrefresh.layout.api.RefreshFooter; import com.scwang.smartrefresh.layout.api.RefreshHeader; import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.constant.RefreshState; import com.scwang.smartrefresh.layout.footer.BallPulseFooter; import com.scwang.smartrefresh.layout.header.ClassicsHeader; +import com.scwang.smartrefresh.layout.impl.RefreshFooterWrapper; import com.scwang.smartrefresh.layout.impl.RefreshHeaderWrapper; -import com.scwang.smartrefresh.layout.listener.OnRefreshListener; +import com.scwang.smartrefresh.layout.listener.SimpleMultiPurposeListener; import java.util.Arrays; @@ -99,6 +106,7 @@ public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceStat recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), VERTICAL)); recyclerView.setAdapter(new BaseRecyclerAdapter(Arrays.asList(Item.values()), simple_list_item_2,this) { + @NonNull @Override public SmartViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { SmartViewHolder holder = super.onCreateViewHolder(parent, viewType); @@ -129,17 +137,41 @@ protected void onBindViewHolder(SmartViewHolder holder, Item model, int position } - RefreshLayout refreshLayout = (RefreshLayout) root.findViewById(R.id.refreshLayout); + RefreshLayout refreshLayout = root.findViewById(R.id.refreshLayout); if (refreshLayout != null) { - refreshLayout.setOnRefreshListener(new OnRefreshListener() { + refreshLayout.setOnMultiPurposeListener(new SimpleMultiPurposeListener() { @Override public void onRefresh(@NonNull final RefreshLayout refreshLayout) { refreshLayout.finishRefresh(3000); - refreshLayout.getLayout().postDelayed(new Runnable() { - @Override - public void run() { + } + @Override + public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { + refreshLayout.finishLoadMore(2000); + } + @Override + public void onStateChanged(@NonNull RefreshLayout refreshLayout, @NonNull RefreshState oldState, @NonNull RefreshState newState) { + if (newState == RefreshState.None) { + if (oldState == RefreshState.LoadFinish) { + RefreshFooter refreshFooter = refreshLayout.getRefreshFooter(); + if (refreshFooter instanceof RefreshFooterWrapper) { + View footerView = refreshFooter.getView(); + if (footerView instanceof TaurusHeader) { + refreshLayout.setRefreshFooter(new RefreshFooterWrapper(new DropBoxHeader(getContext()))); + } else if (footerView instanceof DropBoxHeader) { + refreshLayout.setRefreshFooter(new RefreshFooterWrapper(new DeliveryHeader(getContext()))); + } else if (footerView instanceof DeliveryHeader) { + refreshLayout.setRefreshFooter(new RefreshFooterWrapper(new BezierCircleHeader(getContext()))); + } else { + refreshLayout.setRefreshFooter(new BallPulseFooter(getContext())); + } + } + } else if (oldState == RefreshState.RefreshFinish) { RefreshHeader refreshHeader = refreshLayout.getRefreshHeader(); if (refreshHeader instanceof RefreshHeaderWrapper) { + refreshLayout.setEnableHeaderTranslationContent(false); + refreshLayout.setRefreshHeader(new MaterialHeader(getContext())); + } else if (refreshHeader instanceof MaterialHeader) { + refreshLayout.setEnableHeaderTranslationContent(true); refreshLayout.setRefreshHeader(new PhoenixHeader(getContext())); } else if (refreshHeader instanceof PhoenixHeader) { refreshLayout.setRefreshHeader(new DropBoxHeader(getContext())); @@ -150,9 +182,8 @@ public void run() { } else { refreshLayout.setRefreshHeader(new RefreshHeaderWrapper(new BallPulseFooter(getContext()))); } - refreshLayout.setPrimaryColorsId(R.color.colorPrimary, android.R.color.white); } - },4000); + } } }); } diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/practice/InstantPracticeFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/practice/InstantPracticeFragment.java new file mode 100644 index 00000000..f0b56b5f --- /dev/null +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/practice/InstantPracticeFragment.java @@ -0,0 +1,247 @@ +package com.scwang.refreshlayout.fragment.practice; + + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +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 com.scwang.refreshlayout.R; +import com.scwang.refreshlayout.adapter.BaseRecyclerAdapter; +import com.scwang.refreshlayout.adapter.SmartViewHolder; +import com.scwang.refreshlayout.util.DynamicTimeFormat; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.footer.ClassicsFooter; +import com.scwang.smartrefresh.layout.impl.ScrollBoundaryDeciderAdapter; +import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; + +/** + * 即时聊天页面 + * A simple {@link Fragment} subclass. + */ +public class InstantPracticeFragment extends Fragment { + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_practice_instant, container, false); + } + + @Override + public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceState) { + super.onViewCreated(root, savedInstanceState); + + final Toolbar toolbar = root.findViewById(R.id.toolbar); + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + getActivity().finish(); + } + }); + + + final MessageAdapter adapter = new MessageAdapter(initData()); + + ClassicsFooter footer = root.findViewById(R.id.footer); + View arrow = footer.findViewById(ClassicsFooter.ID_IMAGE_ARROW); + arrow.setScaleY(-1);//必须设置 + + RecyclerView listView = root.findViewById(R.id.listView); + listView.setAdapter(adapter); + listView.setScaleY(-1);//必须设置 + + final RefreshLayout refreshLayout = root.findViewById(R.id.refreshLayout); + refreshLayout.setEnableRefresh(false);//必须关闭 + refreshLayout.setEnableAutoLoadMore(true);//必须关闭 + refreshLayout.setEnableNestedScroll(false);//必须关闭 + refreshLayout.setEnableScrollContentWhenLoaded(true);//必须关闭 + refreshLayout.getLayout().setScaleY(-1);//必须设置 + refreshLayout.setScrollBoundaryDecider(new ScrollBoundaryDeciderAdapter() { + @Override + public boolean canLoadMore(View content) { + return super.canRefresh(content);//必须替换 + } + }); + + //监听加载,而不是监听 刷新 + refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { + refreshLayout.getLayout().postDelayed(new Runnable() { + @Override + public void run() { + adapter.insert(initData()); + refreshLayout.finishLoadMore(); + } + }, 2000); + } + }); + + /* + * 触发测试 + */ + toolbar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + refreshLayout.autoLoadMore(); + } + }); + } + + private Collection initData() { + final User user = new User(){{ + avatarId = R.mipmap.image_avatar_1; + }}; + final User mine = new User(){{ + isMe = true; + avatarId = R.mipmap.image_avatar_4; + }}; + return Arrays.asList( + new Message(){{ + this.Time = new Date(System.currentTimeMillis() - 3600 * 1000 * 3); + this.Message = "对方测回了一条消息"; + }}, + new Message(){{ + this.User = user; + this.Time = new Date(System.currentTimeMillis() - 3600 * 1000 * 3 + 5000); + this.Message = "刚刚发错了,不好意思,下面这个才是"; + }}, + new Message(){{ + this.User = user; + this.Time = new Date(System.currentTimeMillis() - 3600 * 1000 * 3 + 10000); + this.Image = R.mipmap.image_avatar_3; + }}, + new Message(){{ + this.User = mine; + this.Time = new Date(System.currentTimeMillis() - 3600 * 1000 * 3 + 15000); + this.Message = "好的,收到了"; + }}, + new Message(){{ + this.User = mine; + this.Time = new Date(System.currentTimeMillis() - 3600 * 1000 * 3 + 15000 * 50); + this.Message = "一会你来我办公室一趟"; + }}, + new Message(){{ + this.User = user; + this.Time = new Date(System.currentTimeMillis() - 3600 * 1000 * 3 + 15000 * 50 + 5000); + this.Message = "好的,马上到。"; + }} + ); + } + + static class User { + int avatarId; + boolean isMe; + } + + static class Message { + Date Time; + User User; + int Image; + String Message; + + } + + static class MessageAdapter extends BaseRecyclerAdapter { + + DynamicTimeFormat format = new DynamicTimeFormat(); + + MessageAdapter(Collection collection) { + super(collection, R.layout.item_practice_instant); + } + + @Override + protected void onBindViewHolder(SmartViewHolder holder, Message message, int index) { + onItemBindingTime(holder, message, index); + if (message.User == null) { + onItemBindingSystem(holder, message); + } else if (message.User.isMe) { + onItemBindingMine(holder, message); + } else { + onItemBindingOther(holder, message); + } + } + + /** + * 展示对方的消息 + */ + private void onItemBindingOther(SmartViewHolder holder, Message message) { + holder.gone(R.id.chatting_right); + holder.gone(R.id.chatting_tv_sysmsg); + holder.visible(R.id.chatting_left); + + holder.image(R.id.chatting_liv_avatar, message.User.avatarId); + + if (message.Image == 0) { + holder.gone(R.id.chatting_liv_img); + holder.text(R.id.chatting_ltv_txt, message.Message).visible(R.id.chatting_ltv_txt); + } else { + holder.gone(R.id.chatting_ltv_txt); + holder.image(R.id.chatting_liv_img, message.Image).visible(R.id.chatting_liv_img); + } + } + + + /** + * 展示自己的消息 + */ + private void onItemBindingMine(SmartViewHolder holder, Message message) { + holder.gone(R.id.chatting_left); + holder.gone(R.id.chatting_tv_sysmsg); + holder.visible(R.id.chatting_right); + + holder.image(R.id.chatting_riv_avatar, message.User.avatarId); + + if (message.Image == 0) { + holder.gone(R.id.chatting_riv_img); + holder.text(R.id.chatting_rtv_txt, message.Message).visible(R.id.chatting_rtv_txt); + } else { + holder.gone(R.id.chatting_rtv_txt); + holder.image(R.id.chatting_riv_img, message.Image).visible(R.id.chatting_riv_img); + } + } + + /** + * 展示系统消息 + */ + private void onItemBindingSystem(SmartViewHolder holder, Message message) { + holder.gone(R.id.chatting_left); + holder.gone(R.id.chatting_right); + holder.gone(R.id.chatting_tv_sendtime); + holder.visible(R.id.chatting_tv_sysmsg).text(R.id.chatting_tv_sysmsg, message.Message); + } + + + /** + * 展示时间 + */ + private void onItemBindingTime(SmartViewHolder holder, Message model, int index) { + Message prev = null; + if (index > 0) { + prev = get(index - 1); + if (prev.User == null) { + if (index > 1) { + prev = get(index - 2); + } else { + prev = null; + } + } + } + if (prev != null && (model.Time.getTime() - prev.Time.getTime() < 5 * 60 * 1000)) { + holder.gone(R.id.chatting_tv_sendtime); + } else { + holder.visible(R.id.chatting_tv_sendtime); + holder.text(R.id.chatting_tv_sendtime, format.format(model.Time)); + } + } + + } +} diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/practice/SecondFloorPracticeFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/practice/SecondFloorPracticeFragment.java index 11c0a068..84bcf741 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/practice/SecondFloorPracticeFragment.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/practice/SecondFloorPracticeFragment.java @@ -4,6 +4,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.View; @@ -11,32 +12,40 @@ import android.widget.Toast; import com.scwang.refreshlayout.R; +import com.scwang.refreshlayout.adapter.BaseRecyclerAdapter; +import com.scwang.refreshlayout.adapter.SmartViewHolder; import com.scwang.refreshlayout.util.StatusBarUtil; import com.scwang.smartrefresh.layout.api.OnTwoLevelListener; import com.scwang.smartrefresh.layout.api.RefreshHeader; import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.constant.RefreshState; import com.scwang.smartrefresh.layout.header.TwoLevelHeader; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; import com.scwang.smartrefresh.layout.listener.SimpleMultiPurposeListener; +import java.util.Arrays; +import java.util.List; + +import static android.R.layout.simple_list_item_2; + /** * 淘宝二楼 - * Created by SCWANG on 2017/12/4. + * Created by scwang on 2017/12/4. */ - public class SecondFloorPracticeFragment extends Fragment { @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_practice_secondfloor, container, false); + return inflater.inflate(R.layout.fragment_practice_second_floor, container, false); } @Override public void onViewCreated(@NonNull final View root, @Nullable Bundle savedInstanceState) { super.onViewCreated(root, savedInstanceState); - final View floor = root.findViewById(R.id.secondfloor); - final Toolbar toolbar = (Toolbar)root.findViewById(R.id.toolbar); - final TwoLevelHeader header = (TwoLevelHeader)root.findViewById(R.id.header); + final View floor = root.findViewById(R.id.second_floor); + final Toolbar toolbar = root.findViewById(R.id.toolbar); + final TwoLevelHeader header = root.findViewById(R.id.header); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -44,7 +53,7 @@ public void onClick(View v) { } }); - final RefreshLayout refreshLayout = (RefreshLayout)root.findViewById(R.id.refreshLayout); + final RefreshLayout refreshLayout = root.findViewById(R.id.refreshLayout); refreshLayout.setOnMultiPurposeListener(new SimpleMultiPurposeListener() { @Override public void onLoadMore(@NonNull RefreshLayout refreshLayout) { @@ -60,41 +69,61 @@ public void onHeaderMoving(RefreshHeader header, boolean isDragging, float perce toolbar.setAlpha(1 - Math.min(percent, 1)); floor.setTranslationY(Math.min(offset - floor.getHeight() + toolbar.getHeight(), refreshLayout.getLayout().getHeight() - floor.getHeight())); } -// @Override -// public void onHeaderPulling(@NonNull RefreshHeader header, float percent, int offset, int bottomHeight, int maxDragHeight) { -// toolbar.setAlpha(1 - Math.min(percent, 1)); -// floor.setTranslationY(Math.min(offset - floor.getHeight() + toolbar.getHeight(), refreshLayout.getLayout().getHeight() - floor.getHeight())); -// } -// @Override -// public void onHeaderReleasing(@NonNull RefreshHeader header, float percent, int offset, int bottomHeight, int maxDragHeight) { -// toolbar.setAlpha(1 - Math.min(percent, 1)); -// floor.setTranslationY(Math.min(offset - floor.getHeight() + toolbar.getHeight(), refreshLayout.getLayout().getHeight() - floor.getHeight())); -// } + @Override + public void onStateChanged(@NonNull RefreshLayout refreshLayout, @NonNull RefreshState oldState, @NonNull RefreshState newState) { + if (oldState == RefreshState.TwoLevel) { + root.findViewById(R.id.second_floor_content).animate().alpha(0).setDuration(1000); + } + } + }); + + /* + * 主动打开二楼 + */ + toolbar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + header.openTwoLevel(true); + } }); header.setOnTwoLevelListener(new OnTwoLevelListener() { @Override public boolean onTwoLevel(@NonNull RefreshLayout refreshLayout) { Toast.makeText(getContext(),"触发二楼事件",Toast.LENGTH_SHORT).show(); - root.findViewById(R.id.secondfloor_content).animate().alpha(1).setDuration(2000); - refreshLayout.getLayout().postDelayed(new Runnable() { - @Override - public void run() { - header.finishTwoLevel(); - root.findViewById(R.id.secondfloor_content).animate().alpha(0).setDuration(1000); - } - },5000); + root.findViewById(R.id.second_floor_content).animate().alpha(1).setDuration(2000); +// refreshLayout.getLayout().postDelayed(new Runnable() { +// @Override +// public void run() { +// header.finishTwoLevel(); +// root.findViewById(R.id.second_floor_content).animate().alpha(0).setDuration(1000); +// } +// },5000); return true;//true 将会展开二楼状态 false 关闭刷新 } }); -// refreshLayout.setOnRefreshListener(new OnRefreshListener() { -// @Override -// public void onRefresh(@NonNull RefreshLayout refreshLayout) { -// Toast.makeText(getContext(),"触发刷新事件",Toast.LENGTH_SHORT).show(); -// refreshLayout.finishRefresh(2000); -// } -// }); + refreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(@NonNull RefreshLayout refreshLayout) { + Toast.makeText(getContext(),"触发刷新事件",Toast.LENGTH_SHORT).show(); + refreshLayout.finishRefresh(2000); + } + }); + + RecyclerView recyclerView = root.findViewById(R.id.recyclerView); + if (recyclerView != null) { + recyclerView.setNestedScrollingEnabled(false); + List voids = Arrays.asList(null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); + recyclerView.setAdapter(new BaseRecyclerAdapter(voids, simple_list_item_2) { + @Override + protected void onBindViewHolder(SmartViewHolder holder, Void model, int position) { + holder.text(android.R.id.text1, getString(R.string.item_example_number_title, position)); + holder.text(android.R.id.text2, getString(R.string.item_example_number_abstract, position)); + holder.textColorId(android.R.id.text2, R.color.colorTextAssistant); + } + }); + } //状态栏透明和间距处理 StatusBarUtil.immersive(getActivity()); diff --git a/app/src/main/java/com/scwang/refreshlayout/fragment/practice/TwoLevelPracticeFragment.java b/app/src/main/java/com/scwang/refreshlayout/fragment/practice/TwoLevelPracticeFragment.java index 4c60e3d5..cfb90f0e 100644 --- a/app/src/main/java/com/scwang/refreshlayout/fragment/practice/TwoLevelPracticeFragment.java +++ b/app/src/main/java/com/scwang/refreshlayout/fragment/practice/TwoLevelPracticeFragment.java @@ -19,9 +19,8 @@ /** * 二级刷新 - * Created by SCWANG on 2018/1/7. + * Created by scwang on 2018/1/7. */ - public class TwoLevelPracticeFragment extends Fragment { @Override @@ -33,8 +32,8 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, public void onViewCreated(@NonNull final View root, @Nullable Bundle savedInstanceState) { super.onViewCreated(root, savedInstanceState); - final Toolbar toolbar = (Toolbar)root.findViewById(R.id.toolbar); - final TwoLevelHeader header = (TwoLevelHeader)root.findViewById(R.id.header); + final Toolbar toolbar = root.findViewById(R.id.toolbar); + final TwoLevelHeader header = root.findViewById(R.id.header); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -42,7 +41,7 @@ public void onClick(View v) { } }); - final RefreshLayout refreshLayout = (RefreshLayout)root.findViewById(R.id.refreshLayout); + final RefreshLayout refreshLayout = root.findViewById(R.id.refreshLayout); header.setOnTwoLevelListener(new OnTwoLevelListener() { @Override diff --git a/app/src/main/java/com/scwang/refreshlayout/util/DynamicTimeFormat.java b/app/src/main/java/com/scwang/refreshlayout/util/DynamicTimeFormat.java index 662c02b3..e4c50423 100644 --- a/app/src/main/java/com/scwang/refreshlayout/util/DynamicTimeFormat.java +++ b/app/src/main/java/com/scwang/refreshlayout/util/DynamicTimeFormat.java @@ -10,9 +10,8 @@ /** * 动态时间格式化 - * Created by SCWANG on 2017/6/17. + * Created by scwang on 2017/6/17. */ - public class DynamicTimeFormat extends SimpleDateFormat { private static Locale locale = Locale.CHINA; diff --git a/app/src/main/java/com/scwang/refreshlayout/util/StatusBarUtil.java b/app/src/main/java/com/scwang/refreshlayout/util/StatusBarUtil.java index 86ed5f7a..8ac98658 100644 --- a/app/src/main/java/com/scwang/refreshlayout/util/StatusBarUtil.java +++ b/app/src/main/java/com/scwang/refreshlayout/util/StatusBarUtil.java @@ -19,15 +19,14 @@ /** * 状态栏透明 - * Created by SCWANG on 2016/10/26. + * Created by scwang on 2016/10/26. */ - @SuppressWarnings("unused") public class StatusBarUtil { public static int DEFAULT_COLOR = 0; public static float DEFAULT_ALPHA = 0;//Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? 0.2f : 0.3f; - public static final int MIN_API = 19; + public static final int MIN_API = 17; // public static void immersive(Activity activity) { @@ -183,11 +182,13 @@ public static boolean darkModeForMIUI6(Window window, boolean darkmode) { darkModeFlag = field.getInt(layoutParams); Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); extraFlagField.invoke(window, darkmode ? darkModeFlag : 0, darkModeFlag); - return true; } catch (Exception e) { e.printStackTrace(); - return false; } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + darkModeForM(window, darkmode); + } + return true; } /** 判断是否Flyme4以上 */ diff --git a/app/src/main/java/com/scwang/refreshlayout/widget/RefreshContentHorizontal.java b/app/src/main/java/com/scwang/refreshlayout/widget/RefreshContentHorizontal.java new file mode 100644 index 00000000..e6fa0d9a --- /dev/null +++ b/app/src/main/java/com/scwang/refreshlayout/widget/RefreshContentHorizontal.java @@ -0,0 +1,45 @@ +package com.scwang.refreshlayout.widget; + +import android.animation.ValueAnimator; +import android.support.annotation.NonNull; +import android.view.View; +import android.widget.AbsListView; + +import com.scwang.smartrefresh.layout.impl.RefreshContentWrapper; + +import static com.scwang.refreshlayout.widget.ScrollBoundaryHorizontal.canScrollLeft; +import static com.scwang.refreshlayout.widget.ScrollBoundaryHorizontal.canScrollRight; +import static com.scwang.smartrefresh.layout.util.SmartUtil.scrollListBy; + +public class RefreshContentHorizontal extends RefreshContentWrapper { + + RefreshContentHorizontal(@NonNull View view) { + super(view); + } + + @Override + public ValueAnimator.AnimatorUpdateListener scrollContentWhenFinished(final int spinner) { + if (mScrollableView != null && spinner != 0) { + if ((spinner < 0 && canScrollRight(mScrollableView)) || (spinner > 0 && canScrollLeft(mScrollableView))) { + mLastSpinner = spinner; + return this; + } + } + return null; + } + + @Override + public void onAnimationUpdate(ValueAnimator animation) { + int value = (int) animation.getAnimatedValue(); + try { + if (mScrollableView instanceof AbsListView) { + scrollListBy((AbsListView) mScrollableView, value - mLastSpinner); + } else { + mScrollableView.scrollBy(value - mLastSpinner, 0); + } + } catch (Throwable ignored) { + //根据用户反馈,此处可能会有BUG + } + mLastSpinner = value; + } +} diff --git a/refresh-layout/src/main/java/com/scwang/smartrefresh/layout/util/ScrollBoundaryUtil.java b/app/src/main/java/com/scwang/refreshlayout/widget/ScrollBoundaryHorizontal.java similarity index 84% rename from refresh-layout/src/main/java/com/scwang/smartrefresh/layout/util/ScrollBoundaryUtil.java rename to app/src/main/java/com/scwang/refreshlayout/widget/ScrollBoundaryHorizontal.java index c199730c..f1ee480c 100644 --- a/refresh-layout/src/main/java/com/scwang/smartrefresh/layout/util/ScrollBoundaryUtil.java +++ b/app/src/main/java/com/scwang/refreshlayout/widget/ScrollBoundaryHorizontal.java @@ -1,4 +1,4 @@ -package com.scwang.smartrefresh.layout.util; +package com.scwang.refreshlayout.widget; import android.graphics.PointF; import android.support.annotation.NonNull; @@ -6,16 +6,16 @@ import android.view.ViewGroup; import android.widget.AbsListView; +import com.scwang.smartrefresh.layout.util.SmartUtil; + /** * 滚动边界 - * Created by SCWANG on 2017/7/8. + * Created by scwang on 2017/7/8. */ - @SuppressWarnings("WeakerAccess") -public class ScrollBoundaryUtil { +public class ScrollBoundaryHorizontal { // - /** * 判断内容是否可以刷新 * @param targetView 内容视图 @@ -23,7 +23,7 @@ public class ScrollBoundaryUtil { * @return 是否可以刷新 */ public static boolean canRefresh(@NonNull View targetView, PointF touch) { - if (canScrollUp(targetView) && targetView.getVisibility() == View.VISIBLE) { + if (canScrollLeft(targetView) && targetView.getVisibility() == View.VISIBLE) { return false; } //touch == null 时 canRefresh 不会动态递归搜索 @@ -34,6 +34,9 @@ public static boolean canRefresh(@NonNull View targetView, PointF touch) { for (int i = childCount; i > 0; i--) { View child = viewGroup.getChildAt(i - 1); if (isTransformedTouchPointInView(viewGroup, child, touch.x, touch.y, point)) { + if ("fixed".equals(child.getTag())) { + return false; + } touch.offset(point.x, point.y); boolean can = canRefresh(child, touch); touch.offset(-point.x, -point.y); @@ -52,7 +55,7 @@ public static boolean canRefresh(@NonNull View targetView, PointF touch) { * @return 是否可以刷新 */ public static boolean canLoadMore(@NonNull View targetView, PointF touch, boolean contentFull) { - if (canScrollDown(targetView) && targetView.getVisibility() == View.VISIBLE) { + if (canScrollRight(targetView) && targetView.getVisibility() == View.VISIBLE) { return false; } //touch == null 时 canLoadMore 不会动态递归搜索 @@ -63,6 +66,9 @@ public static boolean canLoadMore(@NonNull View targetView, PointF touch, boolea for (int i = 0; i < childCount; i++) { View child = viewGroup.getChildAt(i); if (isTransformedTouchPointInView(viewGroup, child, touch.x, touch.y, point)) { + if ("fixed".equals(child.getTag())) { + return false; + } touch.offset(point.x, point.y); boolean can = canLoadMore(child, touch, contentFull); touch.offset(-point.x, -point.y); @@ -70,14 +76,14 @@ public static boolean canLoadMore(@NonNull View targetView, PointF touch, boolea } } } - return (contentFull || canScrollUp(targetView)); + return (contentFull || canScrollLeft(targetView)); } -// public static boolean canScrollDown(View targetView, MotionEvent event) { -// if (canScrollDown(targetView) && targetView.getVisibility() == View.VISIBLE) { +// public static boolean canScrollRight(View targetView, MotionEvent event) { +// if (canScrollRight(targetView) && targetView.getVisibility() == View.VISIBLE) { // return true; // } -// //event == null 时 canScrollDown 不会动态递归搜索 +// //event == null 时 canScrollRight 不会动态递归搜索 // if (targetView instanceof ViewGroup && event != null) { // ViewGroup viewGroup = (ViewGroup) targetView; // final int childCount = viewGroup.getChildCount(); @@ -87,14 +93,14 @@ public static boolean canLoadMore(@NonNull View targetView, PointF touch, boolea // if (isTransformedTouchPointInView(viewGroup, child, event.getX(), event.getY(), point)) { // event = MotionEvent.obtain(event); // event.offsetLocation(point.x, point.y); -// return canScrollDown(child, event); +// return canScrollRight(child, event); // } // } // } // return false; // } - public static boolean canScrollUp(@NonNull View targetView) { + public static boolean canScrollLeft(@NonNull View targetView) { if (android.os.Build.VERSION.SDK_INT < 14) { if (targetView instanceof AbsListView) { final ViewGroup viewGroup = (ViewGroup) targetView; @@ -106,11 +112,11 @@ public static boolean canScrollUp(@NonNull View targetView) { return targetView.getScrollY() > 0; } } else { - return targetView.canScrollVertically(-1); + return targetView.canScrollHorizontally(-1); } } - public static boolean canScrollDown(@NonNull View targetView) { + public static boolean canScrollRight(@NonNull View targetView) { if (android.os.Build.VERSION.SDK_INT < 14) { if (targetView instanceof AbsListView) { final ViewGroup viewGroup = (ViewGroup) targetView; @@ -122,14 +128,12 @@ public static boolean canScrollDown(@NonNull View targetView) { return targetView.getScrollY() < 0; } } else { - return targetView.canScrollVertically(1); + return targetView.canScrollHorizontally(1); } } - // // - public static boolean isTransformedTouchPointInView(@NonNull View group,@NonNull View child, float x, float y,PointF outLocalPoint) { if (child.getVisibility() != View.VISIBLE) { return false; diff --git a/app/src/main/java/com/scwang/refreshlayout/widget/SmartRefreshContent.java b/app/src/main/java/com/scwang/refreshlayout/widget/SmartRefreshContent.java new file mode 100644 index 00000000..c598703f --- /dev/null +++ b/app/src/main/java/com/scwang/refreshlayout/widget/SmartRefreshContent.java @@ -0,0 +1,29 @@ +package com.scwang.refreshlayout.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; + +import com.scwang.smartrefresh.layout.SmartRefreshLayout; + +public class SmartRefreshContent extends SmartRefreshLayout { + + public SmartRefreshContent(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + if (mRefreshContent != null && !(mRefreshContent instanceof RefreshContentHorizontal)) { + mRefreshContent = new RefreshContentHorizontal(mRefreshContent.getView()); + View fixedHeaderView = mFixedHeaderViewId > 0 ? findViewById(mFixedHeaderViewId) : null; + View fixedFooterView = mFixedFooterViewId > 0 ? findViewById(mFixedFooterViewId) : null; + + mRefreshContent.setScrollBoundaryDecider(mScrollBoundaryDecider); + mRefreshContent.setEnableLoadMoreWhenContentNotFull(mEnableLoadMoreWhenContentNotFull); + mRefreshContent.setUpComponent(mKernel, fixedHeaderView, fixedFooterView); + } + } + +} diff --git a/app/src/main/java/com/scwang/refreshlayout/widget/SmartRefreshHorizontal.java b/app/src/main/java/com/scwang/refreshlayout/widget/SmartRefreshHorizontal.java new file mode 100644 index 00000000..2f921fc1 --- /dev/null +++ b/app/src/main/java/com/scwang/refreshlayout/widget/SmartRefreshHorizontal.java @@ -0,0 +1,468 @@ +package com.scwang.refreshlayout.widget; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Interpolator; +import android.widget.FrameLayout; + +import com.scwang.refreshlayout.R; +import com.scwang.smartrefresh.layout.api.RefreshFooter; +import com.scwang.smartrefresh.layout.api.RefreshHeader; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.api.ScrollBoundaryDecider; +import com.scwang.smartrefresh.layout.constant.RefreshState; +import com.scwang.smartrefresh.layout.impl.ScrollBoundaryDeciderAdapter; +import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; +import com.scwang.smartrefresh.layout.listener.OnMultiPurposeListener; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener; + +public class SmartRefreshHorizontal extends FrameLayout implements RefreshLayout { + + protected SmartRefreshContent mRefreshLayout; + + public SmartRefreshHorizontal(Context context) { + this(context, null); + } + + public SmartRefreshHorizontal(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public SmartRefreshHorizontal(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mRefreshLayout = new SmartRefreshContent(context, attrs); + mRefreshLayout.setEnableAutoLoadMore(false); + mRefreshLayout.setScrollBoundaryDecider(new ScrollBoundaryDeciderAdapter(){ + @Override + public boolean canRefresh(View content) { + return ScrollBoundaryHorizontal.canRefresh(content, mActionEvent); + } + @Override + public boolean canLoadMore(View content) { + return ScrollBoundaryHorizontal.canLoadMore(content, mActionEvent, mEnableLoadMoreWhenContentNotFull); + } + }); + } + + // + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + while (getChildCount() > 0) { + View child = getChildAt(0); + removeViewAt(0); + mRefreshLayout.addView(child); + } + mRefreshLayout.onFinishInflate(); + addView(mRefreshLayout); + mRefreshLayout.setRotation(-90); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + if (mRefreshLayout.getParent() == null) { + mRefreshLayout.setRotation(-90); + addView(mRefreshLayout); + } + } + + @Override + @SuppressWarnings("SuspiciousNameCombination") + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + mRefreshLayout.measure(heightMeasureSpec, widthMeasureSpec); +// RefreshHeader header = mRefreshLayout.getRefreshHeader(); +// RefreshFooter footer = mRefreshLayout.getRefreshFooter(); +// +// for (int i = 0, len = mRefreshLayout.getChildCount(); i < len; i++) { +// View child = mRefreshLayout.getChildAt(i); +// if ((header == null || child != header.getView()) && (footer == null || child != footer.getView())) { +// if (child.getVisibility() != GONE) { +// child.measure(MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.EXACTLY), +// MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.EXACTLY)); +// } +// } +// } + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { +// super.onLayout(changed, left, top, right, bottom); + + int width = right - left; + int height = bottom - top; + int div = (height - width) / 2; + top = div; + left = -div; + + RefreshHeader header = mRefreshLayout.getRefreshHeader(); + RefreshFooter footer = mRefreshLayout.getRefreshFooter(); + + for (int i = 0, len = mRefreshLayout.getChildCount(); i < len; i++) { + View child = mRefreshLayout.getChildAt(i); + if ((header == null || child != header.getView()) && (footer == null || child != footer.getView())) { + if (child.getVisibility() != GONE) { + child.setTag(R.string.srl_component_falsify, child); + child.setRotation(90); + child.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); + child.layout(div, -div, width + div, height - div); + } + + } + } + + mRefreshLayout.layout(left, top, left + height, top + width); + } + // + + // + @Override + public RefreshLayout setFooterHeight(float dp) { + return mRefreshLayout.setFooterHeight(dp); + } + + @Override + public RefreshLayout setHeaderHeight(float dp) { + return mRefreshLayout.setHeaderHeight(dp); + } + + @Override + public RefreshLayout setHeaderInsetStart(float dp) { + return mRefreshLayout.setHeaderInsetStart(dp); + } + + @Override + public RefreshLayout setFooterInsetStart(float dp) { + return mRefreshLayout.setFooterInsetStart(dp); + } + + @Override + public RefreshLayout setDragRate(float rate) { + return mRefreshLayout.setDragRate(rate); + } + + @Override + public RefreshLayout setHeaderMaxDragRate(float rate) { + return mRefreshLayout.setHeaderMaxDragRate(rate); + } + + @Override + public RefreshLayout setFooterMaxDragRate(float rate) { + return mRefreshLayout.setFooterMaxDragRate(rate); + } + + @Override + public RefreshLayout setHeaderTriggerRate(float rate) { + return mRefreshLayout.setHeaderTriggerRate(rate); + } + + @Override + public RefreshLayout setFooterTriggerRate(float rate) { + return mRefreshLayout.setFooterTriggerRate(rate); + } + + @Override + public RefreshLayout setReboundInterpolator(@NonNull Interpolator interpolator) { + return mRefreshLayout.setReboundInterpolator(interpolator); + } + + @Override + public RefreshLayout setReboundDuration(int duration) { + return mRefreshLayout.setReboundDuration(duration); + } + + @Override + public RefreshLayout setRefreshFooter(@NonNull RefreshFooter footer) { + return mRefreshLayout.setRefreshFooter(footer); + } + + @Override + public RefreshLayout setRefreshFooter(@NonNull RefreshFooter footer, int width, int height) { + return mRefreshLayout.setRefreshFooter(footer, width, height); + } + + @Override + public RefreshLayout setRefreshHeader(@NonNull RefreshHeader header) { + return mRefreshLayout.setRefreshHeader(header); + } + + @Override + public RefreshLayout setRefreshHeader(@NonNull RefreshHeader header, int width, int height) { + return mRefreshLayout.setRefreshHeader(header, width, height); + } + + @Override + public RefreshLayout setRefreshContent(@NonNull View content) { + return mRefreshLayout.setRefreshContent(content); + } + + @Override + public RefreshLayout setRefreshContent(@NonNull View content, int width, int height) { + return mRefreshLayout.setRefreshContent(content, width, height); + } + + @Override + public RefreshLayout setEnableRefresh(boolean enabled) { + return mRefreshLayout.setEnableRefresh(enabled); + } + + @Override + public RefreshLayout setEnableLoadMore(boolean enabled) { + return mRefreshLayout.setEnableLoadMore(enabled); + } + + @Override + public RefreshLayout setEnableAutoLoadMore(boolean enabled) { + return mRefreshLayout.setEnableAutoLoadMore(enabled); + } + + @Override + public RefreshLayout setEnableHeaderTranslationContent(boolean enabled) { + return mRefreshLayout.setEnableHeaderTranslationContent(enabled); + } + + @Override + public RefreshLayout setEnableFooterTranslationContent(boolean enabled) { + return mRefreshLayout.setEnableFooterTranslationContent(enabled); + } + + @Override + public RefreshLayout setEnableOverScrollBounce(boolean enabled) { + return mRefreshLayout.setEnableOverScrollBounce(enabled); + } + + @Override + public RefreshLayout setEnablePureScrollMode(boolean enabled) { + return mRefreshLayout.setEnablePureScrollMode(enabled); + } + + @Override + public RefreshLayout setEnableScrollContentWhenLoaded(boolean enabled) { + return mRefreshLayout.setEnableScrollContentWhenLoaded(enabled); + } + + @Override + public RefreshLayout setEnableScrollContentWhenRefreshed(boolean enabled) { + return mRefreshLayout.setEnableScrollContentWhenRefreshed(enabled); + } + + @Override + public RefreshLayout setEnableLoadMoreWhenContentNotFull(boolean enabled) { + return mRefreshLayout.setEnableLoadMoreWhenContentNotFull(enabled); + } + + @Override + public RefreshLayout setEnableOverScrollDrag(boolean enabled) { + return mRefreshLayout.setEnableOverScrollDrag(enabled); + } + + @Override + @Deprecated + public RefreshLayout setEnableFooterFollowWhenLoadFinished(boolean enabled) { + return mRefreshLayout.setEnableFooterFollowWhenLoadFinished(enabled); + } + + @Override + public RefreshLayout setEnableFooterFollowWhenNoMoreData(boolean enabled) { + return mRefreshLayout.setEnableFooterFollowWhenNoMoreData(enabled); + } + + @Override + public RefreshLayout setEnableClipHeaderWhenFixedBehind(boolean enabled) { + return mRefreshLayout.setEnableClipHeaderWhenFixedBehind(enabled); + } + + @Override + public RefreshLayout setEnableClipFooterWhenFixedBehind(boolean enabled) { + return mRefreshLayout.setEnableClipFooterWhenFixedBehind(enabled); + } + + @Override + public RefreshLayout setEnableNestedScroll(boolean enabled) { + return mRefreshLayout.setEnableNestedScroll(enabled); + } + + @Override + public RefreshLayout setDisableContentWhenRefresh(boolean disable) { + return mRefreshLayout.setDisableContentWhenRefresh(disable); + } + + @Override + public RefreshLayout setDisableContentWhenLoading(boolean disable) { + return mRefreshLayout.setDisableContentWhenLoading(disable); + } + + @Override + public RefreshLayout setOnRefreshListener(OnRefreshListener listener) { + return mRefreshLayout.setOnRefreshListener(listener); + } + + @Override + public RefreshLayout setOnLoadMoreListener(OnLoadMoreListener listener) { + return mRefreshLayout.setOnLoadMoreListener(listener); + } + + @Override + public RefreshLayout setOnRefreshLoadMoreListener(OnRefreshLoadMoreListener listener) { + return mRefreshLayout.setOnRefreshLoadMoreListener(listener); + } + + @Override + public RefreshLayout setOnMultiPurposeListener(OnMultiPurposeListener listener) { + return mRefreshLayout.setOnMultiPurposeListener(listener); + } + + @Override + public RefreshLayout setScrollBoundaryDecider(ScrollBoundaryDecider boundary) { + return mRefreshLayout.setScrollBoundaryDecider(boundary); + } + + @Override + public RefreshLayout setPrimaryColors(int... primaryColors) { + return mRefreshLayout.setPrimaryColors(primaryColors); + } + + @Override + public RefreshLayout setPrimaryColorsId(int... primaryColorId) { + return mRefreshLayout.setPrimaryColorsId(primaryColorId); + } + + @Override + public RefreshLayout finishRefresh() { + return mRefreshLayout.finishRefresh(); + } + + @Override + public RefreshLayout finishRefresh(int delayed) { + return mRefreshLayout.finishRefresh(delayed); + } + + @Override + public RefreshLayout finishRefresh(boolean success) { + return mRefreshLayout.finishRefresh(success); + } + + @Override + public RefreshLayout finishRefresh(int delayed, boolean success, Boolean noMoreData) { + return mRefreshLayout.finishRefresh(delayed, success, noMoreData); + } + + @Override + public RefreshLayout finishRefreshWithNoMoreData() { + return mRefreshLayout.finishRefreshWithNoMoreData(); + } + + @Override + public RefreshLayout finishLoadMore() { + return mRefreshLayout.finishLoadMore(); + } + + @Override + public RefreshLayout finishLoadMore(int delayed) { + return mRefreshLayout.finishLoadMore(delayed); + } + + @Override + public RefreshLayout finishLoadMore(boolean success) { + return mRefreshLayout.finishLoadMore(success); + } + + @Override + public RefreshLayout finishLoadMore(int delayed, boolean success, boolean noMoreData) { + return mRefreshLayout.finishLoadMore(delayed, success, noMoreData); + } + + @Override + public RefreshLayout finishLoadMoreWithNoMoreData() { + return mRefreshLayout.finishLoadMoreWithNoMoreData(); + } + + @Override + public RefreshLayout closeHeaderOrFooter() { + return mRefreshLayout.closeHeaderOrFooter(); + } + + @Override + @Deprecated + public RefreshLayout setNoMoreData(boolean noMoreData) { + return mRefreshLayout.setNoMoreData(noMoreData); + } + + @Override + public RefreshLayout resetNoMoreData() { + return mRefreshLayout.resetNoMoreData(); + } + + @Override + @Nullable + public RefreshHeader getRefreshHeader() { + return mRefreshLayout.getRefreshHeader(); + } + + @Override + @Nullable + public RefreshFooter getRefreshFooter() { + return mRefreshLayout.getRefreshFooter(); + } + + @NonNull + @Override + public RefreshState getState() { + return mRefreshLayout.getState(); + } + + @NonNull + @Override + public ViewGroup getLayout() { + return mRefreshLayout.getLayout(); + } + + @Override + public boolean autoRefresh() { + return mRefreshLayout.autoRefresh(); + } + + @Override + @Deprecated + public boolean autoRefresh(int delayed) { + return mRefreshLayout.autoRefresh(delayed); + } + + @Override + public boolean autoRefreshAnimationOnly() { + return mRefreshLayout.autoRefreshAnimationOnly(); + } + + @Override + public boolean autoRefresh(int delayed, int duration, float dragRate, boolean animationOnly) { + return mRefreshLayout.autoRefresh(delayed, duration, dragRate, animationOnly); + } + + @Override + public boolean autoLoadMore() { + return mRefreshLayout.autoLoadMore(); + } + +// @Override +// @Deprecated +// public boolean autoLoadMore(int delayed) { +// return mRefreshLayout.autoLoadMore(delayed); +// } + + @Override + public boolean autoLoadMoreAnimationOnly() { + return mRefreshLayout.autoLoadMoreAnimationOnly(); + } + + @Override + public boolean autoLoadMore(int delayed, int duration, float dragRate, boolean animationOnly) { + return mRefreshLayout.autoLoadMore(delayed, duration, dragRate, animationOnly); + } + // +} diff --git a/app/src/main/res/drawable/animation_loading_frame.xml b/app/src/main/res/drawable/animation_loading_frame.xml index 6308904f..0561bdc8 100644 --- a/app/src/main/res/drawable/animation_loading_frame.xml +++ b/app/src/main/res/drawable/animation_loading_frame.xml @@ -1,7 +1,7 @@ - + diff --git a/app/src/main/res/drawable/button_blue.xml b/app/src/main/res/drawable/button_blue.xml new file mode 100644 index 00000000..fb16cb32 --- /dev/null +++ b/app/src/main/res/drawable/button_blue.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_fly_refresh_smartphone.xml b/app/src/main/res/drawable/ic_fly_refresh_phone.xml similarity index 100% rename from app/src/main/res/drawable/ic_fly_refresh_smartphone.xml rename to app/src/main/res/drawable/ic_fly_refresh_phone.xml diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..762e7073 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_list_divider.xml b/app/src/main/res/drawable/ic_list_divider.xml index 0887d3e3..d7ab10ac 100644 --- a/app/src/main/res/drawable/ic_list_divider.xml +++ b/app/src/main/res/drawable/ic_list_divider.xml @@ -1,6 +1,6 @@ - + diff --git a/app/src/main/res/drawable/skin_instantchat_more.xml b/app/src/main/res/drawable/skin_instantchat_more.xml new file mode 100644 index 00000000..4e7ce046 --- /dev/null +++ b/app/src/main/res/drawable/skin_instantchat_more.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/skin_messages_left_bubble.xml b/app/src/main/res/drawable/skin_messages_left_bubble.xml new file mode 100644 index 00000000..54506f5a --- /dev/null +++ b/app/src/main/res/drawable/skin_messages_left_bubble.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/skin_messages_right_bubble.xml b/app/src/main/res/drawable/skin_messages_right_bubble.xml new file mode 100644 index 00000000..970f6499 --- /dev/null +++ b/app/src/main/res/drawable/skin_messages_right_bubble.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/layout/activity_example_assign_code.xml b/app/src/main/res/layout/activity_example_assign_code.xml index 5ca4d1f9..22a451ad 100644 --- a/app/src/main/res/layout/activity_example_assign_code.xml +++ b/app/src/main/res/layout/activity_example_assign_code.xml @@ -20,7 +20,7 @@ diff --git a/app/src/main/res/layout/activity_example_assign_default.xml b/app/src/main/res/layout/activity_example_assign_default.xml index 225e456a..93c33566 100644 --- a/app/src/main/res/layout/activity_example_assign_default.xml +++ b/app/src/main/res/layout/activity_example_assign_default.xml @@ -19,7 +19,7 @@ diff --git a/app/src/main/res/layout/activity_example_assign_xml.xml b/app/src/main/res/layout/activity_example_assign_xml.xml index a270ddca..ef262518 100644 --- a/app/src/main/res/layout/activity_example_assign_xml.xml +++ b/app/src/main/res/layout/activity_example_assign_xml.xml @@ -29,7 +29,7 @@ - - + - - + app:srlEnableScrollContentWhenLoaded="true" + app:srlEnableFooterFollowWhenLoadFinished="true"> + + + + diff --git a/app/src/main/res/layout/activity_example_i18n.xml b/app/src/main/res/layout/activity_example_i18n.xml new file mode 100644 index 00000000..85a9a03b --- /dev/null +++ b/app/src/main/res/layout/activity_example_i18n.xml @@ -0,0 +1,28 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_example_listener.xml b/app/src/main/res/layout/activity_example_listener.xml index bb81dd15..2a594e78 100644 --- a/app/src/main/res/layout/activity_example_listener.xml +++ b/app/src/main/res/layout/activity_example_listener.xml @@ -29,7 +29,7 @@ android:id="@+id/content" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_margin="@dimen/padding_common" + android:layout_margin="@dimen/dimenPaddingCommon" android:scrollbars="vertical" android:fadeScrollbars="false" android:textSize="18sp" diff --git a/app/src/main/res/layout/activity_example_overscroll.xml b/app/src/main/res/layout/activity_example_overscroll.xml index 0a463854..486eb406 100644 --- a/app/src/main/res/layout/activity_example_overscroll.xml +++ b/app/src/main/res/layout/activity_example_overscroll.xml @@ -21,7 +21,7 @@ - + @@ -31,7 +31,7 @@ - + - + app:srlEnableLoadMore="true"> + app:subtitle="@string/title_activity_example_snap_helper"> + + + tools:listitem="@layout/item_example_snap_helper"/> diff --git a/app/src/main/res/layout/activity_practice_banner.xml b/app/src/main/res/layout/activity_practice_banner.xml index 16f2a21c..484d4af1 100644 --- a/app/src/main/res/layout/activity_practice_banner.xml +++ b/app/src/main/res/layout/activity_practice_banner.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorBackgroundDark" - tools:context="com.scwang.refreshlayout.activity.practice.WebViewPracticeActivity"> + tools:context="com.scwang.refreshlayout.activity.practice.BannerPracticeActivity"> + tools:listitem="@layout/item_movie_item"/> + android:gravity="center_horizontal"> + android:clipToPadding="false" + android:background="@color/colorPrimaryDark"> + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -89,19 +88,19 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - android:padding="@dimen/padding_common" + android:padding="@dimen/dimenPaddingCommon" app:rv_strokeColor="@android:color/white" app:rv_strokeWidth="@dimen/division_line" - app:rv_cornerRadius="@dimen/padding_common_d"> + app:rv_cornerRadius="@dimen/dimenPaddingDiminutive"> - @@ -110,8 +109,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -150,10 +149,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - app:rv_cornerRadius_TL="@dimen/padding_common_d" - app:rv_cornerRadius_TR="@dimen/padding_common_d"> + app:rv_cornerRadius_TL="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius_TR="@dimen/dimenPaddingDiminutive"> @@ -172,8 +171,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -212,8 +211,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" - app:rv_cornerRadius="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius="@dimen/dimenPaddingDiminutive" app:rv_strokeColor="@android:color/white" app:rv_strokeWidth="@dimen/division_line"> @@ -235,8 +234,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -275,10 +274,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - app:rv_cornerRadius_TL="@dimen/padding_common_d" - app:rv_cornerRadius_TR="@dimen/padding_common_d"> + app:rv_cornerRadius_TL="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius_TR="@dimen/dimenPaddingDiminutive"> @@ -297,8 +296,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -337,8 +336,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" - app:rv_cornerRadius="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius="@dimen/dimenPaddingDiminutive" app:rv_strokeColor="@android:color/white" app:rv_strokeWidth="@dimen/division_line"> @@ -360,8 +359,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -400,19 +399,19 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - android:padding="@dimen/padding_common" + android:padding="@dimen/dimenPaddingCommon" app:rv_strokeColor="@android:color/white" app:rv_strokeWidth="@dimen/division_line" - app:rv_cornerRadius="@dimen/padding_common_d"> + app:rv_cornerRadius="@dimen/dimenPaddingDiminutive"> - @@ -421,8 +420,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -461,10 +460,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - app:rv_cornerRadius_TL="@dimen/padding_common_d" - app:rv_cornerRadius_TR="@dimen/padding_common_d"> + app:rv_cornerRadius_TL="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius_TR="@dimen/dimenPaddingDiminutive"> @@ -483,8 +482,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -523,8 +522,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" - app:rv_cornerRadius="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius="@dimen/dimenPaddingDiminutive" app:rv_strokeColor="@android:color/white" app:rv_strokeWidth="@dimen/division_line"> @@ -546,8 +545,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -586,19 +585,19 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - android:padding="@dimen/padding_common" + android:padding="@dimen/dimenPaddingCommon" app:rv_strokeColor="@android:color/white" app:rv_strokeWidth="@dimen/division_line" - app:rv_cornerRadius="@dimen/padding_common_d"> + app:rv_cornerRadius="@dimen/dimenPaddingDiminutive"> - @@ -607,8 +606,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -647,10 +646,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - app:rv_cornerRadius_TL="@dimen/padding_common_d" - app:rv_cornerRadius_TR="@dimen/padding_common_d"> + app:rv_cornerRadius_TL="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius_TR="@dimen/dimenPaddingDiminutive"> @@ -669,8 +668,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -709,8 +708,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" - app:rv_cornerRadius="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius="@dimen/dimenPaddingDiminutive" app:rv_strokeColor="@android:color/white" app:rv_strokeWidth="@dimen/division_line"> @@ -732,8 +731,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -772,19 +771,19 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - android:padding="@dimen/padding_common" + android:padding="@dimen/dimenPaddingCommon" app:rv_strokeColor="@android:color/white" app:rv_strokeWidth="@dimen/division_line" - app:rv_cornerRadius="@dimen/padding_common_d"> + app:rv_cornerRadius="@dimen/dimenPaddingDiminutive"> - @@ -793,8 +792,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -833,10 +832,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - app:rv_cornerRadius_TL="@dimen/padding_common_d" - app:rv_cornerRadius_TR="@dimen/padding_common_d"> + app:rv_cornerRadius_TL="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius_TR="@dimen/dimenPaddingDiminutive"> @@ -856,6 +855,8 @@ @@ -880,14 +881,14 @@ + android:padding="@dimen/dimenPaddingHorizontal"> @@ -901,8 +902,8 @@ @@ -933,15 +934,15 @@ android:layout_below="@id/assistant" android:layout_toEndOf="@id/photos" android:layout_toRightOf="@id/photos" - android:layout_marginTop="@dimen/padding_common_d" - android:paddingTop="@dimen/padding_common" - android:paddingLeft="@dimen/padding_common_h" - android:paddingRight="@dimen/padding_common_h" - android:paddingBottom="@dimen/padding_common" + android:layout_marginTop="@dimen/dimenPaddingDiminutive" + android:paddingTop="@dimen/dimenPaddingCommon" + android:paddingLeft="@dimen/dimenPaddingHorizontal" + android:paddingRight="@dimen/dimenPaddingHorizontal" + android:paddingBottom="@dimen/dimenPaddingCommon" android:textColor="@color/colorPrimaryDark" android:text="fllowing" - app:rv_cornerRadius_TR="@dimen/padding_common_d" - app:rv_cornerRadius_BR="@dimen/padding_common_d" + app:rv_cornerRadius_TR="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius_BR="@dimen/dimenPaddingDiminutive" android:textSize="@dimen/textsize_content" app:rv_backgroundColor="@android:color/white" app:rv_strokeWidth="1dp" diff --git a/app/src/main/res/layout/activity_practice_profile.xml b/app/src/main/res/layout/activity_practice_profile.xml index abbd9838..625072b4 100644 --- a/app/src/main/res/layout/activity_practice_profile.xml +++ b/app/src/main/res/layout/activity_practice_profile.xml @@ -13,7 +13,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" app:srlEnablePureScrollMode="true" - app:srlEnableLoadMore="true" + app:srlEnableLoadMore="false" app:srlDragRate="0.75"> - @@ -78,7 +78,7 @@ @@ -105,7 +105,7 @@ @@ -132,9 +132,9 @@ + app:srcCompat="@drawable/ic_fly_refresh_phone"/> diff --git a/app/src/main/res/layout/activity_practice_repast.xml b/app/src/main/res/layout/activity_practice_repast.xml index c3e3a6e2..9acbb1b8 100644 --- a/app/src/main/res/layout/activity_practice_repast.xml +++ b/app/src/main/res/layout/activity_practice_repast.xml @@ -11,6 +11,8 @@ android:id="@+id/refreshLayout" android:layout_width="match_parent" android:layout_height="match_parent" + android:clipChildren="true" + android:clipToPadding="true" app:srlDragRate="0.7" app:srlHeaderMaxDragRate="1.3" app:srlHeaderHeight="150dp" @@ -32,7 +34,7 @@ android:paddingTop="?attr/actionBarSize" android:clipToPadding="false" android:overScrollMode="never" - tools:listitem="@layout/listitem_practice_repast"/> + tools:listitem="@layout/item_practice_repast"/> + app:rv_cornerRadius="@dimen/dimenPaddingDiminutive"/> + android:layout_marginTop="@dimen/dimenPaddingCommon"> + android:layout_marginLeft="@dimen/dimenPaddingHorizontal" + android:layout_marginRight="@dimen/dimenPaddingHorizontal"/> - @@ -140,8 +142,8 @@ android:id="@+id/avatar" android:layout_width="80dp" android:layout_height="80dp" - android:layout_marginLeft="@dimen/padding_common" - android:layout_marginStart="@dimen/padding_common" + android:layout_marginLeft="@dimen/dimenPaddingCommon" + android:layout_marginStart="@dimen/dimenPaddingCommon" android:src="@mipmap/image_avatar_5" app:civ_border_width="3dp" app:civ_border_color="@android:color/white" @@ -193,8 +195,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -234,19 +236,19 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - android:padding="@dimen/padding_common" + android:padding="@dimen/dimenPaddingCommon" app:rv_strokeColor="#cccccc" app:rv_strokeWidth="@dimen/division_line" - app:rv_cornerRadius="@dimen/padding_common_d"> + app:rv_cornerRadius="@dimen/dimenPaddingDiminutive"> - @@ -255,8 +257,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -296,10 +298,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - app:rv_cornerRadius_TL="@dimen/padding_common_d" - app:rv_cornerRadius_TR="@dimen/padding_common_d"> + app:rv_cornerRadius_TL="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius_TR="@dimen/dimenPaddingDiminutive"> @@ -318,8 +320,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -359,8 +361,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" - app:rv_cornerRadius="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius="@dimen/dimenPaddingDiminutive" app:rv_strokeColor="#cccccc" app:rv_strokeWidth="@dimen/division_line"> @@ -382,8 +384,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -423,10 +425,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - app:rv_cornerRadius_TL="@dimen/padding_common_d" - app:rv_cornerRadius_TR="@dimen/padding_common_d"> + app:rv_cornerRadius_TL="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius_TR="@dimen/dimenPaddingDiminutive"> @@ -445,8 +447,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -486,8 +488,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" - app:rv_cornerRadius="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius="@dimen/dimenPaddingDiminutive" app:rv_strokeColor="#cccccc" app:rv_strokeWidth="@dimen/division_line"> @@ -509,8 +511,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -550,19 +552,19 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - android:padding="@dimen/padding_common" + android:padding="@dimen/dimenPaddingCommon" app:rv_strokeColor="#cccccc" app:rv_strokeWidth="@dimen/division_line" - app:rv_cornerRadius="@dimen/padding_common_d"> + app:rv_cornerRadius="@dimen/dimenPaddingDiminutive"> - @@ -571,8 +573,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -612,10 +614,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - app:rv_cornerRadius_TL="@dimen/padding_common_d" - app:rv_cornerRadius_TR="@dimen/padding_common_d"> + app:rv_cornerRadius_TL="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius_TR="@dimen/dimenPaddingDiminutive"> @@ -634,8 +636,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -675,8 +677,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" - app:rv_cornerRadius="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius="@dimen/dimenPaddingDiminutive" app:rv_strokeColor="#cccccc" app:rv_strokeWidth="@dimen/division_line"> @@ -698,8 +700,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -739,19 +741,19 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - android:padding="@dimen/padding_common" + android:padding="@dimen/dimenPaddingCommon" app:rv_strokeColor="#cccccc" app:rv_strokeWidth="@dimen/division_line" - app:rv_cornerRadius="@dimen/padding_common_d"> + app:rv_cornerRadius="@dimen/dimenPaddingDiminutive"> - @@ -760,8 +762,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -801,10 +803,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - app:rv_cornerRadius_TL="@dimen/padding_common_d" - app:rv_cornerRadius_TR="@dimen/padding_common_d"> + app:rv_cornerRadius_TL="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius_TR="@dimen/dimenPaddingDiminutive"> @@ -823,8 +825,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -864,8 +866,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" - app:rv_cornerRadius="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius="@dimen/dimenPaddingDiminutive" app:rv_strokeColor="#cccccc" app:rv_strokeWidth="@dimen/division_line"> @@ -887,8 +889,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -928,19 +930,19 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - android:padding="@dimen/padding_common" + android:padding="@dimen/dimenPaddingCommon" app:rv_strokeColor="#cccccc" app:rv_strokeWidth="@dimen/division_line" - app:rv_cornerRadius="@dimen/padding_common_d"> + app:rv_cornerRadius="@dimen/dimenPaddingDiminutive"> - @@ -949,8 +951,8 @@ + android:paddingLeft="@dimen/dimenPaddingCommon" + android:paddingRight="@dimen/dimenPaddingCommon"> @@ -990,10 +992,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" - android:layout_marginBottom="@dimen/padding_common_d" + android:layout_marginBottom="@dimen/dimenPaddingDiminutive" android:orientation="vertical" - app:rv_cornerRadius_TL="@dimen/padding_common_d" - app:rv_cornerRadius_TR="@dimen/padding_common_d"> + app:rv_cornerRadius_TL="@dimen/dimenPaddingDiminutive" + app:rv_cornerRadius_TR="@dimen/dimenPaddingDiminutive"> @@ -1029,8 +1031,8 @@ android:id="@+id/toolbar_avatar" android:layout_width="32dp" android:layout_height="32dp" - android:layout_marginEnd="@dimen/padding_common_d" - android:layout_marginRight="@dimen/padding_common_d" + android:layout_marginEnd="@dimen/dimenPaddingDiminutive" + android:layout_marginRight="@dimen/dimenPaddingDiminutive" android:src="@mipmap/image_avatar_5" app:civ_border_width="@dimen/division_line" app:civ_border_color="@android:color/white" diff --git a/app/src/main/res/layout/activity_style_bezier.xml b/app/src/main/res/layout/activity_style_bezier.xml index 659e47d2..0f355ce9 100644 --- a/app/src/main/res/layout/activity_style_bezier.xml +++ b/app/src/main/res/layout/activity_style_bezier.xml @@ -24,7 +24,7 @@ + android:layout_height="match_parent"/> @@ -16,6 +17,8 @@ android:id="@+id/refreshLayout" android:layout_width="match_parent" android:layout_height="match_parent" + app:srlAccentColor="@color/colorTextContent" + app:srlPrimaryColor="@android:color/transparent" app:srlEnableLoadMore="true" app:srlEnableAutoLoadMore="false"> + app:srlEnableLoadMore="false" + app:srlAccentColor="@android:color/white" + app:srlPrimaryColor="@android:color/transparent"> @@ -30,9 +32,9 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" - android:padding="@dimen/padding_common_d" + android:padding="@dimen/dimenPaddingDiminutive" android:overScrollMode="never" - tools:listitem="@layout/listitem_style_delivery"/> + tools:listitem="@layout/item_style_delivery"/> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_style_phoenix.xml b/app/src/main/res/layout/activity_style_phoenix.xml index 9222b0bc..eca26684 100644 --- a/app/src/main/res/layout/activity_style_phoenix.xml +++ b/app/src/main/res/layout/activity_style_phoenix.xml @@ -57,7 +57,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/fab_margin" - app:srcCompat="@drawable/ic_fly_refresh_smartphone" + app:srcCompat="@drawable/ic_fly_refresh_phone" app:layout_anchor="@id/recyclerView" app:layout_anchorGravity="top|end" app:fabSize="normal" diff --git a/app/src/main/res/layout/activity_style_taurus.xml b/app/src/main/res/layout/activity_style_taurus.xml index 8fe10994..fb4542df 100644 --- a/app/src/main/res/layout/activity_style_taurus.xml +++ b/app/src/main/res/layout/activity_style_taurus.xml @@ -57,7 +57,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/fab_margin" - app:srcCompat="@drawable/ic_fly_refresh_smartphone" + app:srcCompat="@drawable/ic_fly_refresh_phone" app:layout_anchor="@id/recyclerView" app:layout_anchorGravity="top|end" app:fabSize="normal" diff --git a/app/src/main/res/layout/fragment_example_bottom_sheet.xml b/app/src/main/res/layout/fragment_example_bottom_sheet.xml index 18e1b23f..71a26e37 100644 --- a/app/src/main/res/layout/fragment_example_bottom_sheet.xml +++ b/app/src/main/res/layout/fragment_example_bottom_sheet.xml @@ -14,11 +14,7 @@ - - + android:layout_height="match_parent"> + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_example_horizontal.xml b/app/src/main/res/layout/fragment_example_horizontal.xml new file mode 100644 index 00000000..31c91455 --- /dev/null +++ b/app/src/main/res/layout/fragment_example_horizontal.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_example_nestedscroll.xml b/app/src/main/res/layout/fragment_example_nestedscroll.xml index 3c178cc8..9ac7f171 100644 --- a/app/src/main/res/layout/fragment_example_nestedscroll.xml +++ b/app/src/main/res/layout/fragment_example_nestedscroll.xml @@ -36,14 +36,12 @@ android:id="@+id/refreshLayout" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@android:color/white" app:layout_behavior="@string/appbar_scrolling_view_behavior" app:srlPrimaryColor="@color/colorPrimary" - app:srlAccentColor="@android:color/white" - app:srlEnableLoadMore="false"> + app:srlEnableLoadMore="true"> + android:layout_height="wrap_content"/> + app:srlFooterTranslationViewId="@+id/viewPager"> - + + + + + + + + + + app:layout_behavior="@string/appbar_scrolling_view_behavior"/> + + android:layout_height="@dimen/dimenPaddingDiminutive"/> @@ -154,7 +161,7 @@ android:background="#44000000"/> diff --git a/app/src/main/res/layout/fragment_example_nestedscroll_view_pager.xml b/app/src/main/res/layout/fragment_example_nestedscroll_view_pager.xml index f736c66f..de8b4a98 100644 --- a/app/src/main/res/layout/fragment_example_nestedscroll_view_pager.xml +++ b/app/src/main/res/layout/fragment_example_nestedscroll_view_pager.xml @@ -39,7 +39,7 @@ app:layout_behavior="@string/appbar_scrolling_view_behavior"/> - + @@ -62,7 +62,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/fab_margin" - app:srcCompat="@drawable/ic_fly_refresh_smartphone" + app:srcCompat="@drawable/ic_fly_refresh_phone" app:layout_anchor="@id/viewPager" app:layout_anchorGravity="top|end" app:fabSize="normal" diff --git a/app/src/main/res/layout/fragment_example_staggered_grid.xml b/app/src/main/res/layout/fragment_example_staggered_grid.xml new file mode 100644 index 00000000..4e761fdf --- /dev/null +++ b/app/src/main/res/layout/fragment_example_staggered_grid.xml @@ -0,0 +1,30 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_flexbox_layout_manager.xml b/app/src/main/res/layout/fragment_flexbox_layout_manager.xml new file mode 100644 index 00000000..cc191211 --- /dev/null +++ b/app/src/main/res/layout/fragment_flexbox_layout_manager.xml @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_no_more_data_example.xml b/app/src/main/res/layout/fragment_no_more_data_example.xml new file mode 100644 index 00000000..da98008c --- /dev/null +++ b/app/src/main/res/layout/fragment_no_more_data_example.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_practice_instant.xml b/app/src/main/res/layout/fragment_practice_instant.xml new file mode 100644 index 00000000..4ae1df63 --- /dev/null +++ b/app/src/main/res/layout/fragment_practice_instant.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_practice_secondfloor.xml b/app/src/main/res/layout/fragment_practice_second_floor.xml similarity index 76% rename from app/src/main/res/layout/fragment_practice_secondfloor.xml rename to app/src/main/res/layout/fragment_practice_second_floor.xml index 66089efc..0857b1de 100644 --- a/app/src/main/res/layout/fragment_practice_secondfloor.xml +++ b/app/src/main/res/layout/fragment_practice_second_floor.xml @@ -14,23 +14,33 @@ app:srlAccentColor="@android:color/white"> - + + android:alpha="0"> + + + + tools:listitem="@layout/item_movie_item"/> diff --git a/app/src/main/res/layout/fragment_refresh_example.xml b/app/src/main/res/layout/fragment_refresh_example.xml index edcf9b2f..04103daa 100644 --- a/app/src/main/res/layout/fragment_refresh_example.xml +++ b/app/src/main/res/layout/fragment_refresh_example.xml @@ -14,7 +14,6 @@ android:id="@+id/refreshLayout" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@android:color/white" app:srlEnableNestedScrolling="true" app:srlPrimaryColor="@color/colorPrimary" app:srlAccentColor="@android:color/white" @@ -30,6 +29,7 @@ android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@android:color/white" android:overScrollMode="never" tools:listitem="@android:layout/simple_list_item_2"/> + tools:context="com.scwang.refreshlayout.fragment.index.RefreshPracticeFragment"> - + android:layout_height="wrap_content"/> + + + diff --git a/app/src/main/res/layout/fragment_refresh_styles.xml b/app/src/main/res/layout/fragment_refresh_styles.xml index e784d848..f2c6a5ba 100644 --- a/app/src/main/res/layout/fragment_refresh_styles.xml +++ b/app/src/main/res/layout/fragment_refresh_styles.xml @@ -14,9 +14,8 @@ android:id="@+id/refreshLayout" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@android:color/white" app:srlPrimaryColor="@color/colorPrimary" - app:srlAccentColor="@color/colorBackgroundDark" + app:srlAccentColor="@android:color/white" app:srlEnableLoadMore="true" app:srlEnableAutoLoadMore="false" app:srlEnablePreviewInEditMode="true"> @@ -27,6 +26,7 @@ android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@android:color/white" android:overScrollMode="never" tools:listitem="@android:layout/simple_list_item_2"/> diff --git a/app/src/main/res/layout/listitem_movie_header.xml b/app/src/main/res/layout/item_movie_header.xml similarity index 73% rename from app/src/main/res/layout/listitem_movie_header.xml rename to app/src/main/res/layout/item_movie_header.xml index f32e1ee0..8334d88a 100644 --- a/app/src/main/res/layout/listitem_movie_header.xml +++ b/app/src/main/res/layout/item_movie_header.xml @@ -4,4 +4,8 @@ android:id="@+id/convenientBanner" android:layout_width="match_parent" android:layout_height="150dp" + app:title_height="25dp" + app:title_textsize="12sp" + app:indicator_width="6dp" + app:indicator_height="6dp" app:is_auto_play="true"/> diff --git a/app/src/main/res/layout/listitem_movie_item.xml b/app/src/main/res/layout/item_movie_item.xml similarity index 76% rename from app/src/main/res/layout/listitem_movie_item.xml rename to app/src/main/res/layout/item_movie_item.xml index b5dbea65..fd0a90ca 100644 --- a/app/src/main/res/layout/listitem_movie_item.xml +++ b/app/src/main/res/layout/item_movie_item.xml @@ -4,14 +4,14 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="@dimen/padding_common"> + android:padding="@dimen/dimenPaddingCommon"> @@ -22,23 +22,23 @@ diff --git a/app/src/main/res/layout/item_practice_instant.xml b/app/src/main/res/layout/item_practice_instant.xml new file mode 100644 index 00000000..3dfc880b --- /dev/null +++ b/app/src/main/res/layout/item_practice_instant.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/listitem_practice_repast.xml b/app/src/main/res/layout/item_practice_repast.xml similarity index 81% rename from app/src/main/res/layout/listitem_practice_repast.xml rename to app/src/main/res/layout/item_practice_repast.xml index 701cf1c2..1c06c2f2 100644 --- a/app/src/main/res/layout/listitem_practice_repast.xml +++ b/app/src/main/res/layout/item_practice_repast.xml @@ -3,8 +3,8 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="150dp" - android:background="@android:color/white" - android:layout_marginTop="@dimen/padding_common"> + android:background="@color/colorBackgroundDark" + android:paddingTop="@dimen/dimenPaddingCommon"> + android:padding="@dimen/dimenPaddingCommon"> @@ -40,7 +41,7 @@ android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/padding_common_h" + android:layout_marginTop="@dimen/dimenPaddingHorizontal" android:textAppearance="@style/TextAppearance.AppCompat.Title" tools:text="香煎蛋果儿"/> diff --git a/app/src/main/res/layout/listitem_style_delivery.xml b/app/src/main/res/layout/item_style_delivery.xml similarity index 82% rename from app/src/main/res/layout/listitem_style_delivery.xml rename to app/src/main/res/layout/item_style_delivery.xml index 2b10969e..6a648b7d 100644 --- a/app/src/main/res/layout/listitem_style_delivery.xml +++ b/app/src/main/res/layout/item_style_delivery.xml @@ -13,14 +13,14 @@ + android:padding="@dimen/dimenPaddingCommon"> + android:layout_marginEnd="@dimen/dimenPaddingCommon" + android:layout_marginRight="@dimen/dimenPaddingCommon"/> + android:layout_marginTop="@dimen/dimenPaddingCommon"/> + android:layout_marginTop="@dimen/dimenPaddingCommon"/> diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..c4a603d4 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000..c4a603d4 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index 5a65eccc..060c07f9 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 00000000..23ad9e0f Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png index 9a078e3e..a9f9b7f0 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-hdpi/skin_aio_more_normal.png b/app/src/main/res/mipmap-hdpi/skin_aio_more_normal.png new file mode 100644 index 00000000..75cfbd4c Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/skin_aio_more_normal.png differ diff --git a/app/src/main/res/mipmap-hdpi/skin_aio_more_pressed.png b/app/src/main/res/mipmap-hdpi/skin_aio_more_pressed.png new file mode 100644 index 00000000..6545858b Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/skin_aio_more_pressed.png differ diff --git a/app/src/main/res/mipmap-hdpi/skin_common_btn_blue_disabled.9.png b/app/src/main/res/mipmap-hdpi/skin_common_btn_blue_disabled.9.png new file mode 100644 index 00000000..433d007a Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/skin_common_btn_blue_disabled.9.png differ diff --git a/app/src/main/res/mipmap-hdpi/skin_messages_left_bubble.9.png b/app/src/main/res/mipmap-hdpi/skin_messages_left_bubble.9.png new file mode 100644 index 00000000..cc93742f Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/skin_messages_left_bubble.9.png differ diff --git a/app/src/main/res/mipmap-hdpi/skin_messages_left_bubble_highlighted.9.png b/app/src/main/res/mipmap-hdpi/skin_messages_left_bubble_highlighted.9.png new file mode 100644 index 00000000..fa269762 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/skin_messages_left_bubble_highlighted.9.png differ diff --git a/app/src/main/res/mipmap-hdpi/skin_messages_right_bubble.9.png b/app/src/main/res/mipmap-hdpi/skin_messages_right_bubble.9.png new file mode 100644 index 00000000..794bdf16 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/skin_messages_right_bubble.9.png differ diff --git a/app/src/main/res/mipmap-hdpi/skin_messages_right_bubble_highlighted.9.png b/app/src/main/res/mipmap-hdpi/skin_messages_right_bubble_highlighted.9.png new file mode 100644 index 00000000..217056ff Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/skin_messages_right_bubble_highlighted.9.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png index 68f97ff5..ab643d8d 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 00000000..a9bfacc8 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index efc028a6..c21cf518 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/image_secondfloor.jpg b/app/src/main/res/mipmap-mdpi/image_second_floor.jpg similarity index 100% rename from app/src/main/res/mipmap-mdpi/image_secondfloor.jpg rename to app/src/main/res/mipmap-mdpi/image_second_floor.jpg diff --git a/app/src/main/res/mipmap-mdpi/image_secondfloor_content.jpg b/app/src/main/res/mipmap-mdpi/image_second_floor_content.jpg similarity index 100% rename from app/src/main/res/mipmap-mdpi/image_secondfloor_content.jpg rename to app/src/main/res/mipmap-mdpi/image_second_floor_content.jpg diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 9dc79afc..62641a60 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 00000000..cec67c70 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png index 3af2608a..5083293a 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 0d6bfdc6..4e5a8b9b 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 00000000..e6795198 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index 9bec2e62..42707ad3 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index d2e32e56..c506c734 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 00000000..951f160d Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index 34947cd6..b89ca168 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 4d7236fa..c0e6e162 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -45,7 +45,10 @@ 多功能监听器 自定义Header SnapHelper + 国际化 + 没有更多数据 + 水平滚动模式 纯滚动模式 纯滚动模式-单独指定Header 空页面 @@ -56,8 +59,14 @@ ViewPager 三级刷新 Bottom Sheet 对话框 + Flexbox Layout 管理器 + 禁止拦截 + 瀑布流 + + 即时通讯 基本的使用 + 没有更多数据的使用 使用指定的Header和Footer 整合空页面 嵌套Layout作为内容 @@ -65,10 +74,15 @@ 纯滚动模式 多功能监听器 自定义Header + 国际化支持 结合 SnapHelper 使用 ViewPager 多页面共用一个 RefreshLayout BottomSheet内部使用加载更多 三级刷新 + 结合 FlexboxLayoutManager 使用 + 水平滚动刷新 + requestDisallowInterceptTouchEvent 的使用 + StaggeredGridLayoutManager 的使用 餐饮美食-简单自定义Header-外边距magin 个人中心-PureScrollMode-纯滚动模式 @@ -78,6 +92,7 @@ 滚动广告-Banner QQ浏览器-模拟QQ浏览器内核提示 二级刷新-仿淘宝二楼 + 即时通讯 更改为橙色主题颜色 更改为红色主题颜色 @@ -108,6 +123,11 @@ 左边 右边 + 跟随系统 + 中文 + 英语 + 点击切换语言为 %s + 网页由 github.com 提供\n已启用QQ浏览器X5内核 这是使用定制Header和Footer的第一种方法-全局默认\n\n @@ -154,10 +174,15 @@ 1.设置一次生效一次,需要多处设置,建议特别的页面使用\n 2.优先级最高,即使使用了会覆盖方法一和方法二的设置\n\n 使用方法: \n - final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout);\n + final RefreshLayout refreshLayout = findViewById(R.id.refreshLayout);\n //设置 Header 为 Material风格\n refreshLayout.setRefreshHeader(new MaterialHeader(this));\n //设置 Footer 为 三球动画\n refreshLayout.setRefreshFooter(new BallPulseFooter(this));\n\n + + 输入消息 + 发送 + 加载更多时显示新内容 + diff --git a/app/src/main/res/values-zh/strings_srl.xml b/app/src/main/res/values-zh/strings_srl.xml new file mode 100644 index 00000000..35985bbc --- /dev/null +++ b/app/src/main/res/values-zh/strings_srl.xml @@ -0,0 +1,20 @@ + + + 下拉开始刷新 + 正在刷新… + 正在加载… + 释放即将刷新 + 刷新完成 + 刷新失败 + 上次更新 M-d HH:mm + 进入二楼 + + 上拉开始加载 + 释放即将加载 + 正在加载… + 正在刷新… + 加载完成 + 加载失败 + 没有更多数据了 + + diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml new file mode 100644 index 00000000..1220cb47 --- /dev/null +++ b/app/src/main/res/values/attrs.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 8fc822cc..fc2f8d14 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -9,10 +9,15 @@ 0.5dp - 10dp - 15dp - 10dp - 5dp + 2.5dp + 5dp + 10dp + 10dp + 12.5dp + 15dp + 20dp + 25dp + 12sp 14sp @@ -21,4 +26,13 @@ 19sp 20sp + 10sp + 12sp + 14sp + 16sp + 17sp + 19sp + 20sp + 14sp + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f9f2c2f6..b6048830 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ - SmartRefreshLayout + SmartRefresh Style Example @@ -45,7 +45,10 @@ Multifunction monitor Custom Header SnapHelper + I18N + No More Data + Horizontal Scroll Mode Pure Rolling Mode Pure Rolling Mode - Header Only Empty Layout @@ -56,6 +59,11 @@ ViewPager Three Level Refresh Bottom Sheet + FlexBox Layout Manager + Disallow Intercept + Staggered Grid + + Instant Simple customization header, HeaderInsetStart Pure scroll mode @@ -65,19 +73,27 @@ Use banner Imitate QQ browser Imitate the second floor of "Treasure Prospecting" + Instant Messaging + The basic usage of refresh layout Specify the style of Header and Footer + The usage of no more data The usage of empty pages Use Layout as content The usage of nested scroll The usage of pure rolling mode The usage of multifunction listener The usage of custom Header + The usage of I18n The usage of SnapHelper The usage of ViewPager The usage of BottomSheet The usage of three level refresh + The usage of FlexboxLayoutManager + The usage of Horizontal Scroll + The usage of requestDisallowInterceptTouchEvent + The usage of StaggeredGridLayoutManager Change theme to orange color Change theme to red color @@ -108,6 +124,11 @@ Left Pager Right Pager + System + Chinese + English + Click to switch the language to %s + The web page is provided by github.com.\nThe QQ browser X5 kernel has been enabled. \n @@ -145,8 +166,17 @@ ]]> \n Usage: \n - final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout);\n + final RefreshLayout refreshLayout = findViewById(R.id.refreshLayout);\n refreshLayout.setRefreshHeader(new MaterialHeader(this));\n refreshLayout.setRefreshFooter(new BallPulseFooter(this));\n\n + + input message + Send + Scroll Content + + + Hello blank fragment + + diff --git a/app/src/main/res/values/strings_srl.xml b/app/src/main/res/values/strings_srl.xml new file mode 100644 index 00000000..a23cde1c --- /dev/null +++ b/app/src/main/res/values/strings_srl.xml @@ -0,0 +1,20 @@ + + + Pull Down To Refresh + Refreshing… + Wait For Loading… + Release To Refresh + Refresh Finished + Refresh Failed + \'Last Update\' M-d HH:mm + Release To Second Floor + + Pull Up To Load More + Release To Load More + Loading… + Wait For Refreshing… + Load More Finished + Load More Failed + No More Data + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index bf9bb390..f5aafa52 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -10,8 +10,15 @@ @drawable/ic_list_divider @drawable/ic_arrow_back_white_24dp @style/LoadingLayoutStyle + + + + + + + @@ -68,10 +75,10 @@ - @@ -134,7 +141,7 @@ @@ -142,10 +149,10 @@ center_vertical 3dp 3dp - @dimen/padding_common - @dimen/padding_common - - + @dimen/dimenPaddingCommon + @dimen/dimenPaddingCommon + + ?android:attr/selectableItemBackground @@ -154,29 +161,29 @@ - --> + \ No newline at end of file diff --git a/refresh-layout/src/main/res/values/strings.xml b/refresh-layout/src/main/res/values/strings.xml index 6910273e..e4998425 100644 --- a/refresh-layout/src/main/res/values/strings.xml +++ b/refresh-layout/src/main/res/values/strings.xml @@ -2,7 +2,7 @@ Pull Down To Refresh Release To Refresh Refreshing… - Loading… + Wait For Loading… Refresh Success Refresh Failed \'Last Update\' M-d HH:mm @@ -11,7 +11,7 @@ Pull Up To Load More Release To Load More Loading… - Refreshing… + Wait For Refreshing… Load Success Load Failed No More Data