├── .gitignore ├── .idea ├── caches │ └── build_file_checksums.ser ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── markdown-navigator.xml ├── markdown-navigator │ └── profiles_settings.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README-cn.md ├── README.md ├── UpdateLog.md ├── app-debug.apk ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── zone │ │ │ └── com │ │ │ └── zrefreshlayoutdemo │ │ │ ├── Apps.kt │ │ │ ├── AutoRefreshActivity.kt │ │ │ ├── CircleHeaderActivity.kt │ │ │ ├── CirlcleActivity.kt │ │ │ ├── FlexibilityKtActivity.kt │ │ │ ├── GlobalViewActivity.java │ │ │ ├── GridViewActivity.kt │ │ │ ├── ListViewActivity.kt │ │ │ ├── MainActivity.kt │ │ │ ├── MeterialHeaderActivity.kt │ │ │ ├── PinContentActivity.kt │ │ │ ├── RecyclerViewActivity.kt │ │ │ ├── RefreshPositionActivity.kt │ │ │ ├── ResistanceActivity.kt │ │ │ ├── SPManager.kt │ │ │ ├── ScrollerNesttActivity.kt │ │ │ ├── ScrollerViewActivity.kt │ │ │ ├── SettingActivity.kt │ │ │ ├── SinaHeaderActivity.kt │ │ │ ├── TextViewActivity.java │ │ │ ├── UniqueFeatureActivity.kt │ │ │ ├── WaveHeaderActivity.kt │ │ │ ├── WebViewActivity.kt │ │ │ ├── common │ │ │ ├── Constant.kt │ │ │ └── HeadSetting.kt │ │ │ ├── delegate │ │ │ ├── AdapterList.kt │ │ │ └── MenuEntityDeletates.kt │ │ │ ├── header │ │ │ ├── CircleRefresh.java │ │ │ ├── SinaRefreshViewRefreshPositionTest.java │ │ │ ├── WaveHead.java │ │ │ └── view │ │ │ │ └── AnimationView.java │ │ │ ├── resistance │ │ │ └── Damping2Head8per.kt │ │ │ └── utils │ │ │ └── RecyclerViewEmptyUtils.java │ └── res │ │ ├── drawable-xxhdpi │ │ ├── aaaaaaaaaaaab.jpg │ │ ├── img_header.png │ │ └── wave.png │ │ ├── layout │ │ ├── a_circle.xml │ │ ├── a_flexibility.xml │ │ ├── a_scroll_recycler_nest.xml │ │ ├── a_setting.xml │ │ ├── auto_refresh.xml │ │ ├── grid.xml │ │ ├── item_menu.xml │ │ ├── item_rc_textview.xml │ │ ├── list.xml │ │ ├── main.xml │ │ ├── rev.xml │ │ ├── scroller.xml │ │ ├── text.xml │ │ ├── title.xml │ │ ├── unique_feature.xml │ │ ├── unique_feature_copy.xml │ │ └── web.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ ├── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ │ └── xml │ │ └── network_security_config.xml │ └── test │ └── java │ └── zone │ └── com │ └── zrefreshlayoutdemo │ └── ExampleUnitTest.java ├── build.gradle ├── demo └── home.png ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── zrefreshlayout ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src ├── androidTest └── java │ └── zone │ └── com │ └── zrefreshlayoutdemo │ └── ExampleInstrumentedTest.java ├── main ├── AndroidManifest.xml ├── java │ └── zone │ │ └── com │ │ └── zrefreshlayout │ │ ├── AUtils.kt │ │ ├── Config.java │ │ ├── FlexibilityLayout.kt │ │ ├── IFooterView.java │ │ ├── IHeaderView.java │ │ ├── IResistance.java │ │ ├── IScroll.java │ │ ├── NestFrameLayout.java │ │ ├── ScrollAnimation.java │ │ ├── ZRefreshLayout.java │ │ ├── footer │ │ ├── LoadFooter.java │ │ ├── MeterialFooter.java │ │ └── NullFooter.java │ │ ├── header │ │ ├── MeterialHead.java │ │ ├── NullHeader.kt │ │ └── SinaRefreshHeader.java │ │ ├── loadmore │ │ ├── ListViewLoadMoreListener.java │ │ ├── LoadMoreController.java │ │ ├── LoadMoreOtherListener.java │ │ └── RecyclerViewLoadMoreListener.java │ │ ├── resistance │ │ ├── DampingHalf.java │ │ ├── DampingHalfToHead.java │ │ └── DampingTo3Head.java │ │ ├── scroll │ │ ├── ScrollDoNothing.kt │ │ ├── ScrollPin.kt │ │ ├── ScrollPinNot.kt │ │ └── listener │ │ │ ├── ScrollScale.kt │ │ │ └── ScrollScroll.kt │ │ ├── utils │ │ ├── DensityUtils.java │ │ ├── LogUtils.java │ │ ├── RecyclerViewUtils.java │ │ ├── ScreenUtils.java │ │ ├── ScrollingUtil.java │ │ └── SimpleAnimatorListener.java │ │ └── v4 │ │ ├── CircleImageView.java │ │ ├── MaterialProgressDrawable.java │ │ └── MeterialCircle.java └── res │ ├── drawable-xxhdpi │ ├── ic_arrow.png │ └── refresh_loading01.png │ ├── layout │ ├── footer.xml │ ├── header.xml │ ├── header_meterial.xml │ └── view_sinaheader.xml │ └── values │ └── strings.xml └── test └── java └── zone └── com └── zrefreshlayoutdemo └── ExampleUnitTest.java /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /.idea/caches/build_file_checksums.ser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luhaoaimama1/ZRefreshLayout/1226a2d020b718687865b369810d069328e547cb/.idea/caches/build_file_checksums.ser -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/markdown-navigator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 32 | 33 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /.idea/markdown-navigator/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | Android 36 | 37 | 38 | Android > Lint > Correctness 39 | 40 | 41 | Java 42 | 43 | 44 | Java language level migration aidsJava 45 | 46 | 47 | 48 | 49 | AndroidLintNewerVersionAvailable 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 61 | 62 | 63 | 64 | 65 | 1.8 66 | 67 | 72 | 73 | 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README-cn.md: -------------------------------------------------------------------------------- 1 | # ZRefreshLayout 2 | 3 | 一个可以`全局`随意`配置头部`的`下拉刷新`与`上拉加载`库; 4 | 5 | ### 特点与功能实现 6 | - [x] 支持添加下拉刷新与上拉加载 7 | - [x] 支持超时而自动做出刷新或者加载完成动作 8 | - [x] 支持嵌套滑动 9 | - [x] 支持所有的View:ImageView,FrameLayout,ListView, GridView, ScrollView, WebView... 10 | - [x] 全局配置(头部配置都在这里,所以没有xml属性~),与独立更改 11 | - [x] 自动刷新 12 | - [x] 头部是否固定 13 | - [x] 刷新出发位置 14 | - [x] 下拉位置映射,既resistance阻力 15 | - [x] 因为是继承FrameLayout,可以添加多个child。(我没有让控制必须一个,感觉更灵活吧) 16 | 17 | ### JicPack 18 | Add it in your root build.gradle at the end of repositories: 19 | ``` 20 | allprojects { 21 | repositories { 22 | ... 23 | maven { url "https://jitpack.io" } 24 | } 25 | } 26 | ``` 27 | Step 2. Add the dependency 28 | 29 | > compile 'com.github.luhaoaimama1:ZRefreshLayout:[Latest release](https://github.com/luhaoaimama1/ZRefreshLayout/releases)' 30 | > 非 anroidX 版本使用 compile 'com.github.luhaoaimama1:ZRefreshLayout:1.0.19' 分支:notAndroidx 31 | 32 | Step 3. Step 3: you need provide 33 | 34 | 原因: compileOnly 'androidx.recyclerview:recyclerview:1.0.0' 35 | 36 | ## UML 37 | 38 | ![](https://ww1.sinaimg.cn/large/006tNc79gy1foynj1rsrmj30zc0lg3zi.jpg) 39 | 40 | ## Preview 41 | 42 | #### 固定头 43 | ![](https://ww4.sinaimg.cn/large/006tKfTcly1fbtqosupizg307i0dcb29.gif) 44 | 45 | #### Meterial Header与Footer 46 | ![](https://ww4.sinaimg.cn/large/006tKfTcly1fbtqsrspgjg307i0dc4bx.gif) 47 | 48 | #### SinaRefreshHeader与LoadFooter 49 | ![](https://ww3.sinaimg.cn/large/006tKfTcly1fbtqt3ghb1g307i0dch1l.gif) 50 | 51 | #### WaveHead 52 | ![](https://ww3.sinaimg.cn/large/006tKfTcly1fbtqtb17leg307i0dcn8w.gif) 53 | 54 | #### CircleRefresh Head 55 | >[引用tuesda的CircleView 主要是为了测试延迟功能](https://github.com/tuesda/CircleRefreshLayout) 56 | 57 | ![](https://ww3.sinaimg.cn/large/006tKfTcly1fbtqq5dl7vg307i0dc48d.gif) 58 | 59 | ## Usage 60 | 61 | #### 全局配置 62 | 63 | ``` 64 | Config.build() 65 | .setHeader(new MeterialHead()) 66 | .setFooter(new MeterialFooter()) 67 | .setResistance(new Damping()) 68 | .writeLog(true) 69 | .perform(); 70 | ``` 71 | #### 独立更改 72 | 73 | ``` 74 | refresh.setIHeaderView(new SinaRefreshHeader()); 75 | ``` 76 | 77 | #### 头部固定否 78 | 79 | ``` 80 | refresh.setHeadPin(ZRefreshLayout.HeadPin.PIN) 81 | ``` 82 | 83 | #### 自动刷新 84 | 85 | ``` 86 | refresh.autoRefresh(haveAnimate) 87 | ``` 88 | 89 | ### 下拉监听 90 | > 刷新完成记得使用:**zRefreshLayout.refreshComplete();** 91 | 92 | ``` 93 | refresh.setPullListener(new ZRefreshLayout.PullListener() { 94 | @Override 95 | public void refresh(final ZRefreshLayout zRefreshLayout) { 96 | tv.postDelayed(new Runnable() { 97 | @Override 98 | public void run() { 99 | tv.setText("刷新完毕:" + i++); 100 | zRefreshLayout.refreshComplete(); 101 | } 102 | }, 500); 103 | } 104 | }); 105 | ``` 106 | 107 | #### 上拉监听 108 | > 如果没有设置上啦监听则不会有上拉加载功能 109 | 110 | > 加载完成记得使用:**zRefreshLayout.loadMoreComplete();** 111 | 112 | ``` 113 | refresh.setPullListener(new ZRefreshLayout.PullListener() { 114 | @Override 115 | public void refresh(final ZRefreshLayout zRefreshLayout) { 116 | tv.postDelayed(new Runnable() { 117 | @Override 118 | public void run() { 119 | tv.setText("刷新完毕:" + i++); 120 | zRefreshLayout.refreshComplete(); 121 | } 122 | }, 500); 123 | } 124 | }); 125 | ``` 126 | 127 | >头部自定义与底部自定义和更多高级功能,请看[**Wiki 文档**](https://github.com/luhaoaimama1/ZRefreshLayout/wiki); 128 | 129 | # Reference&Thanks: 130 | 131 | https://github.com/lcodecorex/TwinklingRefreshLayout 132 | 133 | https://github.com/tuesda/CircleRefreshLayout 134 | 135 | https://github.com/android-cjj/Android-MaterialRefreshLayout 136 | 137 | https://github.com/desmond1121/Android-Ptr-Comparison 138 | 139 | https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh 140 | 141 | 142 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | [中文版文档](README-cn.md) 3 | 4 | # ZRefreshLayout 5 | 6 | A global random configuration head , drop-down refresh and loadMore library; 7 | 8 | ## Feature 9 | - [x] support refresh and loadMore 10 | - [x] support Timeout automatically complete the action 11 | - [x] support nest scroll 12 | - [x] support All the View:ImageView,FrameLayout,ListView, GridView, ScrollView, WebView... 13 | - [x] support Global configuration (HeaderView's configuration is here,so not have xml's property),and Independent changes 14 | - [x] support auto refresh 15 | - [x] support header fixed 16 | - [x] support refresh's Trigger position 17 | - [x] support drop-down's position map(as IResistance) 18 | - [x] support add many childs。because extends FrameLayout(not must be one,because more changeful) 19 | 20 | ## JicPack 21 | Add it in your root build.gradle at the end of repositories: 22 | ``` 23 | allprojects { 24 | repositories { 25 | ... 26 | maven { url "https://jitpack.io" } 27 | } 28 | } 29 | ``` 30 | Step 2. Add the dependency 31 | 32 | > compile 'com.github.luhaoaimama1:ZRefreshLayout:[Latest release](https://github.com/luhaoaimama1/ZRefreshLayout/releases)' 33 | 34 | > not anroidX version compile 'com.github.luhaoaimama1:ZRefreshLayout:1.0.19' branch:notAndroidx 35 | 36 | Step 3: you need provide 37 | 38 | because compileOnly 'androidx.recyclerview:recyclerview:1.0.0' 39 | 40 | 41 | 42 | ## UML 43 | 44 | ![](https://ww1.sinaimg.cn/large/006tNc79gy1foynj1rsrmj30zc0lg3zi.jpg) 45 | 46 | ## Preview 47 | 48 | #### header fixed 49 | ![](https://ww4.sinaimg.cn/large/006tKfTcly1fbtqosupizg307i0dcb29.gif) 50 | 51 | #### Meterial Header与Footer 52 | ![](https://ww4.sinaimg.cn/large/006tKfTcly1fbtqsrspgjg307i0dc4bx.gif) 53 | 54 | #### SinaRefreshHeader与LoadFooter 55 | ![](https://ww3.sinaimg.cn/large/006tKfTcly1fbtqt3ghb1g307i0dch1l.gif) 56 | 57 | #### WaveHead 58 | ![](https://ww3.sinaimg.cn/large/006tKfTcly1fbtqtb17leg307i0dcn8w.gif) 59 | 60 | #### CircleRefresh Head 61 | >[引用tuesda的CircleView 主要是为了测试延迟功能](https://github.com/tuesda/CircleRefreshLayout) 62 | 63 | ![](https://ww3.sinaimg.cn/large/006tKfTcly1fbtqq5dl7vg307i0dc48d.gif) 64 | 65 | ## Usage 66 | 67 | #### Global configuration 68 | 69 | ``` 70 | Config.build() 71 | .setHeader(new MeterialHead()) 72 | .setFooter(new MeterialFooter()) 73 | .setResistance(new Damping()) 74 | .writeLog(true) 75 | .perform(); 76 | ``` 77 | #### Independent changes 78 | 79 | ``` 80 | refresh.setIHeaderView(new SinaRefreshHeader()); 81 | ``` 82 | 83 | #### header fixed 84 | 85 | ``` 86 | refresh.setHeadPin(ZRefreshLayout.HeadPin.PIN) 87 | ``` 88 | 89 | #### auto refresh 90 | 91 | ``` 92 | refresh.autoRefresh(haveAnimate) 93 | ``` 94 | 95 | ### refresh's listener 96 | > refresh complete ,Remember to use:**zRefreshLayout.refreshComplete();** 97 | 98 | ``` 99 | refresh.setPullListener(new ZRefreshLayout.PullListener() { 100 | @Override 101 | public void refresh(final ZRefreshLayout zRefreshLayout) { 102 | tv.postDelayed(new Runnable() { 103 | @Override 104 | public void run() { 105 | tv.setText("刷新完毕:" + i++); 106 | zRefreshLayout.refreshComplete(); 107 | } 108 | }, 500); 109 | } 110 | }); 111 | ``` 112 | 113 | #### loadMore's Listener 114 | > if not setLoadMoreListener,not have loadMore feature; 115 | 116 | > loadMore complete ,Remember to use:**zRefreshLayout.loadMoreComplete();** 117 | 118 | ``` 119 | refresh.setPullListener(new ZRefreshLayout.PullListener() { 120 | @Override 121 | public void refresh(final ZRefreshLayout zRefreshLayout) { 122 | tv.postDelayed(new Runnable() { 123 | @Override 124 | public void run() { 125 | tv.setText("刷新完毕:" + i++); 126 | zRefreshLayout.refreshComplete(); 127 | } 128 | }, 500); 129 | } 130 | }); 131 | ``` 132 | 133 | > HeadView and FooterView 's custom and More advanced features,please see [**Wiki Document**](https://github.com/luhaoaimama1/ZRefreshLayout/wiki);; 134 | 135 | # Reference&Thanks: 136 | 137 | https://github.com/lcodecorex/TwinklingRefreshLayout 138 | 139 | https://github.com/tuesda/CircleRefreshLayout 140 | 141 | https://github.com/android-cjj/Android-MaterialRefreshLayout 142 | 143 | https://github.com/desmond1121/Android-Ptr-Comparison 144 | 145 | https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh 146 | -------------------------------------------------------------------------------- /UpdateLog.md: -------------------------------------------------------------------------------- 1 | ## Update log 2 | 3 | >由于每个版本更新的东西较多,所以从现在开始每个版本都会贴上更新日志. 4 | 5 | 6 | ### 1.0.19 7 | 8 | * 修复auto刷新bug 9 | * 接口简化有助于Lambda的使用 10 | * 增加全局头部更改示例 11 | * 明明与内部逻辑的优化整理 12 | 13 | ### 1.0.18 14 | 15 | * 增加一些便利方法 16 | 17 | ### 1.0.17 18 | 19 | * 修复从新设置头部,刷新高度未变bug 20 | 21 | ### 1.0.16 22 | 23 | * 修复auto刷新bug 24 | 25 | ### 1.0.15 26 | 27 | * 全局刷新基本功能完成 28 | * 刷新加载委托逻辑 -------------------------------------------------------------------------------- /app-debug.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luhaoaimama1/ZRefreshLayout/1226a2d020b718687865b369810d069328e547cb/app-debug.apk -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | apply plugin: 'kotlin-android-extensions' 4 | apply plugin: 'kotlin-kapt' 5 | 6 | android { 7 | compileSdkVersion 28 8 | defaultConfig { 9 | minSdkVersion 16 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | compileOptions { 21 | sourceCompatibility JavaVersion.VERSION_1_8 22 | targetCompatibility JavaVersion.VERSION_1_8 23 | } 24 | } 25 | 26 | dependencies { 27 | api fileTree(include: ['*.jar'], dir: 'libs') 28 | androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', { 29 | exclude group: 'com.android.support', module: 'support-annotations' 30 | }) 31 | testImplementation 'junit:junit:4.12' 32 | api project(':zrefreshlayout') 33 | api 'androidx.appcompat:appcompat:1.0.0' 34 | api 'com.google.android.material:material:1.0.0' 35 | // apile 'com.github.luhaoaimama1:ZRefreshLayout:1.0.1' 36 | api 'com.github.luhaoaimama1:ZView:1.0.36' 37 | implementation 'com.github.luhaoaimama1:zone-sdk:2.2.1' 38 | // api 'com.github.luhaoaimama1:zone-sdk:1.0.98' 39 | implementation'com.github.luhaoaimama1:ZAdapter3:1.0.94' 40 | // api 'com.github.luhaoaimama1:ZAdapter:1.1.0' 41 | api "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 42 | api 'com.google.code.gson:gson:2.8.2' 43 | implementation "io.reactivex:rxjava:1.2.5" 44 | implementation "io.reactivex:rxandroid:1.2.1" 45 | } 46 | configurations { 47 | //排除module 48 | compile.exclude group: 'org.jetbrains', module: 'annotations' 49 | } 50 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/fuzhipeng/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/Apps.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.app.Application 4 | import android.graphics.Color 5 | import com.zone.lib.Configure 6 | import zone.com.zrefreshlayout.Config 7 | import zone.com.zrefreshlayout.ZRefreshLayout 8 | import zone.com.zrefreshlayout.footer.MeterialFooter 9 | import zone.com.zrefreshlayout.header.MeterialHead 10 | import zone.com.zrefreshlayout.header.SinaRefreshHeader 11 | import zone.com.zrefreshlayout.resistance.DampingHalf 12 | import zone.com.zrefreshlayoutdemo.common.Constant 13 | import zone.com.zrefreshlayoutdemo.common.HeadSetting 14 | import zone.com.zrefreshlayoutdemo.header.WaveHead 15 | 16 | /** 17 | * @author Sergey Tarasevich (nostra13[at]gmail[dot]com) 18 | */ 19 | class Apps : Application() { 20 | override fun onCreate() { 21 | super.onCreate() 22 | Configure.init(this) 23 | setGlobalHead(SP1.get(Constant.REFRESH_MODE, HeadSetting::class.java)) 24 | } 25 | 26 | companion object { 27 | 28 | val COLORS_RED_GREEN_YELLOW = intArrayOf(Color.parseColor("#ffF44336"), Color.parseColor("#ff4CAF50"), Color.parseColor("#ffFFEB3B")) 29 | 30 | fun setDefaultHeader() { 31 | Config.build() 32 | .setHeader(MeterialHead(COLORS_RED_GREEN_YELLOW)) 33 | .setHeadPin(ZRefreshLayout.HeadPin.NOT_PIN) 34 | .setFooter(MeterialFooter()) 35 | .setResistance(DampingHalf()) 36 | // .setHeader(new CircleRefresh()) 37 | // .setResistance(new Damping2Head8per()) 38 | .writeLog(true) 39 | .perform() 40 | } 41 | 42 | 43 | fun setGlobalHead(mHeadSetting: HeadSetting?) { 44 | val temp = Config.build() 45 | if (mHeadSetting == null) { 46 | setDefaultHeader() 47 | return 48 | } 49 | when (mHeadSetting.headmode) { 50 | HeadSetting.METERIAL -> temp.setHeader(MeterialHead(COLORS_RED_GREEN_YELLOW)) 51 | HeadSetting.SINA -> temp.setHeader(SinaRefreshHeader()) 52 | HeadSetting.WAVE -> { 53 | val waveHead = WaveHead() 54 | waveHead.resourceId = R.drawable.wave 55 | temp.setHeader(waveHead) 56 | } 57 | } 58 | temp.setHeadPin(mHeadSetting.headPin()) 59 | .setFooter(MeterialFooter()) 60 | .setResistance(DampingHalf()) 61 | .writeLog(true) 62 | .perform() 63 | } 64 | } 65 | 66 | } 67 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/AutoRefreshActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import android.view.View 6 | import kotlinx.android.synthetic.main.unique_feature_copy.* 7 | import zone.com.zrefreshlayout.ZRefreshLayout 8 | import zone.com.zrefreshlayout.header.MeterialHead 9 | 10 | /** 11 | * Created by fuzhipeng on 2017/1/11. 12 | */ 13 | 14 | class AutoRefreshActivity : AppCompatActivity(),View.OnClickListener { 15 | 16 | override fun onCreate(savedInstanceState: Bundle?) { 17 | super.onCreate(savedInstanceState) 18 | setContentView(R.layout.unique_feature_copy) 19 | refresh.iHeaderView = MeterialHead() 20 | refresh.headPin = ZRefreshLayout.HeadPin.PIN 21 | refresh.pullListener = ZRefreshLayout.PullListener { zRefreshLayout -> 22 | refresh.postDelayed({ 23 | iv.setImageResource(R.drawable.aaaaaaaaaaaab) 24 | zRefreshLayout.refreshComplete() 25 | }, 2000) 26 | } 27 | 28 | } 29 | 30 | override fun onClick(view: View?) { 31 | when (view?.id) { 32 | R.id.tv -> refresh.postDelayed({ refresh.autoRefresh(false) }, 1000) 33 | R.id.tvAnimate -> refresh.postDelayed({ refresh.autoRefresh(true) }, 1000) 34 | else->{} 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/CircleHeaderActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import kotlinx.android.synthetic.main.unique_feature.* 6 | import zone.com.zrefreshlayoutdemo.header.CircleRefresh 7 | 8 | /** 9 | * Created by fuzhipeng on 2017/1/11. 10 | */ 11 | 12 | class CircleHeaderActivity : AppCompatActivity() { 13 | 14 | override fun onCreate(savedInstanceState: Bundle?) { 15 | super.onCreate(savedInstanceState) 16 | setContentView(R.layout.unique_feature) 17 | refresh.setIHeaderView(CircleRefresh()) 18 | // refresh.setIResistance(new Damping2Head8per()); 19 | 20 | tv.text = "包含滚动拦截后,准备就绪后,在滚动到特定位置! 还有下拉位置映射,刷新位置更改" 21 | refresh.setPullListener({ zRefreshLayout -> refresh.postDelayed({ zRefreshLayout.refreshComplete() }, 2000) }, { iv.setImageResource(R.drawable.aaaaaaaaaaaab) }) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/CirlcleActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import android.util.Log 6 | import android.view.View 7 | import android.view.animation.LinearInterpolator 8 | 9 | import android.animation.Animator 10 | import android.animation.AnimatorListenerAdapter 11 | import kotlinx.android.synthetic.main.a_circle.* 12 | import zone.com.zanimate.value.ValueAnimatorProxy 13 | import zone.com.zrefreshlayout.utils.ScreenUtils 14 | import zone.com.zrefreshlayout.v4.MeterialCircle 15 | 16 | /** 17 | * [2017] by Zone 18 | */ 19 | 20 | class CirlcleActivity : AppCompatActivity(), View.OnClickListener { 21 | 22 | var mMeterialCircle: MeterialCircle? = null 23 | 24 | private val valueAnimator = ValueAnimatorProxy.ofFloat(0F, 1f) 25 | .setDuration(1200) 26 | .setInterpolator(LinearInterpolator()) 27 | .addUpdateListener { animation -> 28 | println("值?" + animation.animatedValue as Float) 29 | mMeterialCircle?.pullProgress(animation.animatedValue as Float) 30 | } 31 | .addListener(object : AnimatorListenerAdapter() { 32 | override fun onAnimationEnd(animation: Animator?) { 33 | super.onAnimationEnd(animation) 34 | mMeterialCircle?.start() 35 | } 36 | }) 37 | 38 | override fun onCreate(savedInstanceState: Bundle?) { 39 | super.onCreate(savedInstanceState) 40 | setContentView(R.layout.a_circle) 41 | root.post { 42 | val screenPixs = ScreenUtils.getScreenPix(this@CirlcleActivity) 43 | mMeterialCircle = MeterialCircle(root, (screenPixs[1] * 0.2).toInt()) 44 | root.addView(mMeterialCircle!!.view) 45 | } 46 | } 47 | 48 | override fun onClick(view: View?) { 49 | when (view?.id) { 50 | R.id.bt_start -> { 51 | if (valueAnimator.isRunning) 52 | valueAnimator.cancel() 53 | mMeterialCircle?.reset() 54 | valueAnimator.start() 55 | } 56 | R.id.bt_stop -> mMeterialCircle?.reset() 57 | R.id.bt_reStart -> mMeterialCircle?.startScaleDownAnimation { Log.e("CirlcleActivity", "over") } 58 | else -> { 59 | } 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/FlexibilityKtActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.os.Bundle 4 | import androidx.core.view.ViewCompat 5 | import androidx.appcompat.app.AppCompatActivity 6 | import android.view.View 7 | import android.widget.ImageView 8 | import java.util.ArrayList 9 | import com.zone.adapter3.QuickRcvAdapter 10 | import kotlinx.android.synthetic.main.a_flexibility.* 11 | import kotlinx.android.synthetic.main.a_flexibility.refresh 12 | import kotlinx.android.synthetic.main.a_flexibility.rv 13 | import zone.com.zrefreshlayout.IScroll 14 | import zone.com.zrefreshlayout.ZRefreshLayout 15 | import zone.com.zrefreshlayout.scroll.listener.ScrollScale 16 | import zone.com.zrefreshlayout.scroll.listener.ScrollScroll 17 | import zone.com.zrefreshlayoutdemo.delegate.MenuEntityDeletates 18 | 19 | /** 20 | * Created by fuzhipeng on 2017/1/10. 21 | */ 22 | 23 | class FlexibilityKtActivity : AppCompatActivity(),View.OnClickListener { 24 | 25 | private val mDatas = ArrayList() 26 | private var adapter2: QuickRcvAdapter? = null 27 | var height: Int = 0 28 | 29 | init { 30 | var i: Int = 'A'.toInt() 31 | while (i <= 'H'.toInt()) { 32 | mDatas.add("" + i.toChar()) 33 | i++ 34 | } 35 | } 36 | 37 | override fun onCreate(savedInstanceState: Bundle?) { 38 | super.onCreate(savedInstanceState) 39 | setContentView(R.layout.a_flexibility) 40 | refresh!!.headPin=ZRefreshLayout.HeadPin.NOTHING 41 | iv.post { height = iv.height } 42 | rv!!.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(this, androidx.recyclerview.widget.LinearLayoutManager.VERTICAL, false) 43 | adapter2= QuickRcvAdapter(this,mDatas).apply { 44 | addViewHolder(MenuEntityDeletates()) 45 | relatedList(rv) 46 | } 47 | } 48 | 49 | 50 | override fun onClick(view: View?) { 51 | view?.let{ 52 | val scrollScale = when (view.id) { 53 | R.id.bt_scroll -> arrayListOf(ScrollScroll(refresh!!)) 54 | R.id.bt_scale -> arrayListOf(ScrollScale(refresh!!)) 55 | R.id.bt_Header -> arrayListOf(ScrollHeadScroll(refresh!!, iv!!, height), ScrollScroll(refresh!!)) 56 | else -> arrayListOf(ScrollScroll(refresh!!)) 57 | } 58 | refresh!!.iScrollList.clear() 59 | refresh!!.iScrollList.addAll(scrollScale) 60 | } 61 | } 62 | 63 | class ScrollHeadScroll(mZRefreshLayout: ZRefreshLayout, val iv: ImageView, val height: Int) : IScroll(mZRefreshLayout) { 64 | 65 | override fun scrollTo(fy: Int, isTriggerHeaderOnPullingDown: Boolean) { 66 | if (fy > 0) { 67 | val ph = 1 + fy.toFloat() / height.toFloat() 68 | ViewCompat.setPivotY(iv, 0f) 69 | ViewCompat.setScaleX(iv, ph) 70 | ViewCompat.setScaleY(iv, ph) 71 | } 72 | } 73 | } 74 | } 75 | 76 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/GlobalViewActivity.java: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo; 2 | 3 | import android.os.Bundle; 4 | import androidx.appcompat.app.AppCompatActivity; 5 | import android.widget.TextView; 6 | 7 | import zone.com.zrefreshlayout.ZRefreshLayout; 8 | 9 | /** 10 | * Created by fuzhipeng on 2017/1/10. 11 | */ 12 | 13 | public class GlobalViewActivity extends AppCompatActivity { 14 | private ZRefreshLayout refresh; 15 | private TextView tv; 16 | private int i = 0; 17 | 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | setContentView(R.layout.text); 22 | refresh = (ZRefreshLayout) findViewById(R.id.refresh); 23 | tv = (TextView) findViewById(R.id.tv); 24 | refresh.setLoadMoreListener(new ZRefreshLayout.LoadMoreListener() { 25 | @Override 26 | public void loadMore(final ZRefreshLayout zRefreshLayout) { 27 | tv.postDelayed(new Runnable() { 28 | @Override 29 | public void run() { 30 | tv.setText("加载更多:" + i++); 31 | zRefreshLayout.loadMoreComplete(); 32 | } 33 | }, 2000); 34 | } 35 | 36 | 37 | }); 38 | refresh.setPullListener(new ZRefreshLayout.PullListener() { 39 | @Override 40 | public void refresh(final ZRefreshLayout zRefreshLayout) { 41 | tv.postDelayed(new Runnable() { 42 | @Override 43 | public void run() { 44 | tv.setText("刷新完毕:" + i++); 45 | zRefreshLayout.refreshComplete(); 46 | } 47 | }, 2000); 48 | } 49 | 50 | }); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/GridViewActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import kotlinx.android.synthetic.main.grid.* 6 | import java.util.ArrayList 7 | import zone.com.zrefreshlayout.ZRefreshLayout 8 | import zone.com.zrefreshlayoutdemo.delegate.AdapterList 9 | 10 | /** 11 | * Created by fuzhipeng on 2017/1/10. 12 | */ 13 | 14 | class GridViewActivity : AppCompatActivity() { 15 | private var i = 0 16 | 17 | private val mDatas = ArrayList() 18 | private var adapter2: AdapterList? = null 19 | 20 | init { 21 | run { 22 | var i: Int = 'A'.toInt() 23 | while (i <= 'Z'.toInt()) { 24 | mDatas.add("" + i.toChar()) 25 | i++ 26 | } 27 | } 28 | } 29 | 30 | override fun onCreate(savedInstanceState: Bundle?) { 31 | super.onCreate(savedInstanceState) 32 | setContentView(R.layout.grid) 33 | refresh.pullListener = ZRefreshLayout.PullListener { zRefreshLayout -> 34 | refresh.postDelayed({ 35 | mDatas.add("刷新完毕:" + i++) 36 | adapter2!!.notifyDataSetChanged() 37 | zRefreshLayout.refreshComplete() 38 | }, 2000) 39 | } 40 | refresh.loadMoreListener = ZRefreshLayout.LoadMoreListener { zRefreshLayout -> 41 | refresh.postDelayed({ 42 | mDatas.add("加载完毕:" + i++) 43 | adapter2!!.notifyDataSetChanged() 44 | zRefreshLayout.loadMoreComplete() 45 | }, 2000) 46 | } 47 | 48 | adapter2 = AdapterList(this, mDatas) 49 | gridView.adapter = adapter2 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/ListViewActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.graphics.Color 4 | import android.os.Bundle 5 | import androidx.appcompat.app.AppCompatActivity 6 | import java.util.ArrayList 7 | import kotlinx.android.synthetic.main.list.* 8 | import zone.com.zrefreshlayout.ZRefreshLayout 9 | import zone.com.zrefreshlayoutdemo.delegate.AdapterList 10 | 11 | /** 12 | * Created by fuzhipeng on 2017/1/10. 13 | */ 14 | 15 | class ListViewActivity : AppCompatActivity() { 16 | private var i = 0 17 | private val mDatas = ArrayList() 18 | private var adapter2: AdapterList? = null 19 | init { 20 | run { 21 | var i: Int = 'A'.toInt() 22 | while (i <= 'H'.toInt()) { 23 | mDatas.add("" + i.toChar()) 24 | i++ 25 | } 26 | } 27 | } 28 | 29 | override fun onCreate(savedInstanceState: Bundle?) { 30 | super.onCreate(savedInstanceState) 31 | setContentView(R.layout.list) 32 | refresh.loadMoreListener = ZRefreshLayout.LoadMoreListener { zRefreshLayout -> 33 | refresh.postDelayed({ 34 | mDatas.add("加载完毕:" + i++) 35 | adapter2!!.notifyDataSetChanged() 36 | zRefreshLayout.loadMoreComplete() 37 | }, 2000) 38 | } 39 | refresh.pullListener = ZRefreshLayout.PullListener { zRefreshLayout -> 40 | listView!!.smoothScrollToPosition(0) 41 | refresh.postDelayed({ 42 | mDatas.add("刷新完毕:" + i++) 43 | adapter2!!.notifyDataSetChanged() 44 | zRefreshLayout.refreshComplete() 45 | }, 2000) 46 | } 47 | 48 | adapter2 = AdapterList(this, mDatas) 49 | listView.adapter = adapter2 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import androidx.appcompat.app.AppCompatActivity 6 | import android.view.View 7 | import com.zone.lib.LogZSDK 8 | import com.zone.lib.ZLogger 9 | import com.zone.lib.base.controller.activity.BaseFeatureActivity 10 | import com.zone.lib.base.controller.activity.controller.SwipeBackActivityController 11 | import zone.com.zrefreshlayoutdemo.common.Constant 12 | import zone.com.zrefreshlayoutdemo.common.HeadSetting 13 | 14 | class MainActivity : BaseFeatureActivity() { 15 | companion object { 16 | //还原最开始的log配置 如果某次配置一次特殊的 打印完后的记得还原配置 17 | @JvmStatic 18 | fun initLogger() { 19 | ZLogger.logLevelList.clear() 20 | ZLogger.mayLoggerList.clear() 21 | // ZLogger.mayLoggerList.addAll(listOf(LogCustomView, LogZSDK)) 22 | } 23 | } 24 | 25 | override fun initDefaultConifg() { 26 | unRegisterPrestener(SwipeBackActivityController::class.java) 27 | } 28 | 29 | override fun initData() { 30 | permissionCheckStorageMustPermit() 31 | setContentView(R.layout.main) 32 | } 33 | override fun onStoragePermit() { 34 | super.onStoragePermit() 35 | } 36 | 37 | override fun onStorageDeniedMustPermit() { 38 | super.onStorageDeniedMustPermit() 39 | finish() 40 | } 41 | 42 | 43 | override fun setContentView() { 44 | } 45 | 46 | override fun setListener() { 47 | } 48 | 49 | 50 | override fun onClick(view: View?) { 51 | view?.let { 52 | if (it.id == R.id.globalView) 53 | Apps.setGlobalHead(SP1.get(Constant.REFRESH_MODE, HeadSetting::class.java)) 54 | else 55 | Apps.setDefaultHeader() 56 | 57 | when (it.id) { 58 | R.id.globalView -> startActivity(Intent(this, GlobalViewActivity::class.java)) 59 | R.id.tv_mode -> startActivity(Intent(this, SettingActivity::class.java)) 60 | R.id.textView -> startActivity(Intent(this, TextViewActivity::class.java)) 61 | R.id.listView -> startActivity(Intent(this, ListViewActivity::class.java)) 62 | R.id.recyclerView -> startActivity(Intent(this, RecyclerViewActivity::class.java)) 63 | R.id.gridView -> startActivity(Intent(this, GridViewActivity::class.java)) 64 | R.id.scrollerView -> startActivity(Intent(this, ScrollerViewActivity::class.java)) 65 | R.id.webView -> startActivity(Intent(this, WebViewActivity::class.java)) 66 | R.id.autoRefresh -> startActivity(Intent(this, AutoRefreshActivity::class.java)) 67 | R.id.pinContent -> startActivity(Intent(this, PinContentActivity::class.java)) 68 | R.id.uniqueFeature -> startActivity(Intent(this, UniqueFeatureActivity::class.java)) 69 | R.id.refreshAblePosition -> startActivity(Intent(this, RefreshPositionActivity::class.java)) 70 | R.id.resistance -> startActivity(Intent(this, ResistanceActivity::class.java)) 71 | R.id.waveHeader -> startActivity(Intent(this, WaveHeaderActivity::class.java)) 72 | R.id.circleHeader -> startActivity(Intent(this, CircleHeaderActivity::class.java)) 73 | R.id.sinaRefresh -> startActivity(Intent(this, SinaHeaderActivity::class.java)) 74 | R.id.meterialHeader -> startActivity(Intent(this, MeterialHeaderActivity::class.java)) 75 | R.id.cirlcleActivity -> startActivity(Intent(this, CirlcleActivity::class.java)) 76 | R.id.flexibilityListViewActivity -> startActivity(Intent(this, FlexibilityKtActivity::class.java)) 77 | R.id.nestScroller -> startActivity(Intent(this, ScrollerNesttActivity::class.java)) 78 | else -> { 79 | } 80 | } 81 | } 82 | 83 | } 84 | 85 | } 86 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/MeterialHeaderActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import com.zone.lib.utils.activity_fragment_ui.ToastUtils 6 | import kotlinx.android.synthetic.main.auto_refresh.* 7 | import zone.com.zrefreshlayout.ZRefreshLayout 8 | import zone.com.zrefreshlayout.footer.MeterialFooter 9 | import zone.com.zrefreshlayout.header.MeterialHead 10 | 11 | /** 12 | * Created by fuzhipeng on 2017/1/11. 13 | */ 14 | 15 | class MeterialHeaderActivity : AppCompatActivity() { 16 | 17 | override fun onCreate(savedInstanceState: Bundle?) { 18 | super.onCreate(savedInstanceState) 19 | setContentView(R.layout.auto_refresh) 20 | refresh.iHeaderView = MeterialHead() 21 | 22 | refresh.pullListener = ZRefreshLayout.PullListener { zRefreshLayout -> 23 | refresh.postDelayed({ 24 | iv.setImageResource(R.drawable.aaaaaaaaaaaab) 25 | zRefreshLayout.refreshComplete() 26 | }, 2000) 27 | } 28 | 29 | refresh.iFooterView = MeterialFooter() 30 | refresh.loadMoreListener = ZRefreshLayout.LoadMoreListener { zRefreshLayout -> 31 | refresh.postDelayed({ 32 | ToastUtils.showShort(this@MeterialHeaderActivity, "加载更多") 33 | zRefreshLayout.loadMoreComplete() 34 | }, 2000) 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/PinContentActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import kotlinx.android.synthetic.main.auto_refresh.* 6 | import zone.com.zrefreshlayout.ZRefreshLayout 7 | 8 | /** 9 | * Created by fuzhipeng on 2017/1/11. 10 | */ 11 | 12 | class PinContentActivity : AppCompatActivity() { 13 | 14 | override fun onCreate(savedInstanceState: Bundle?) { 15 | super.onCreate(savedInstanceState) 16 | setContentView(R.layout.auto_refresh) 17 | refresh.headPin = ZRefreshLayout.HeadPin.PIN 18 | refresh.pullListener = ZRefreshLayout.PullListener { zRefreshLayout -> 19 | refresh.postDelayed({ 20 | iv.setImageResource(R.drawable.aaaaaaaaaaaab) 21 | zRefreshLayout.refreshComplete() 22 | }, 2000) 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/RecyclerViewActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.graphics.Color 4 | import android.os.Bundle 5 | import androidx.appcompat.app.AppCompatActivity 6 | import com.zone.adapter3.QuickRcvAdapter 7 | import java.util.ArrayList 8 | import kotlinx.android.synthetic.main.rev.* 9 | import zone.com.zrefreshlayout.ZRefreshLayout 10 | import zone.com.zrefreshlayoutdemo.delegate.MenuEntityDeletates 11 | 12 | /** 13 | * Created by fuzhipeng on 2017/1/10. 14 | */ 15 | 16 | class RecyclerViewActivity : AppCompatActivity() { 17 | private var i = 0 18 | private val mDatas = ArrayList() 19 | private var adapter2: QuickRcvAdapter? = null 20 | 21 | companion object { 22 | val colorArry = intArrayOf(Color.WHITE, Color.GREEN, Color.YELLOW, Color.CYAN) 23 | } 24 | 25 | init { 26 | run { 27 | var i: Int = 'A'.toInt() 28 | while (i <= 'H'.toInt()) { 29 | mDatas.add("" + i.toChar()) 30 | i++ 31 | } 32 | } 33 | } 34 | 35 | override fun onCreate(savedInstanceState: Bundle?) { 36 | super.onCreate(savedInstanceState) 37 | setContentView(R.layout.rev) 38 | refresh.headPin=ZRefreshLayout.HeadPin.PIN 39 | refresh.pullListener = ZRefreshLayout.PullListener { zRefreshLayout -> 40 | // refresh.postDelayed({ 41 | mDatas.add("刷新完毕:" + i++) 42 | adapter2!!.notifyDataSetChanged() 43 | zRefreshLayout.refreshComplete() 44 | // }, 2000) 45 | } 46 | refresh.loadMoreListener = ZRefreshLayout.LoadMoreListener { zRefreshLayout -> 47 | refresh.postDelayed({ 48 | mDatas.add("加载完毕:" + i++) 49 | adapter2!!.notifyDataSetChanged() 50 | zRefreshLayout.loadMoreComplete() 51 | }, 2000) 52 | } 53 | rv!!.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(this, androidx.recyclerview.widget.LinearLayoutManager.VERTICAL, false) 54 | adapter2=QuickRcvAdapter(this,mDatas).apply { 55 | addViewHolder(MenuEntityDeletates()) 56 | relatedList(rv) 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/RefreshPositionActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import kotlinx.android.synthetic.main.unique_feature.* 6 | import zone.com.zrefreshlayout.ZRefreshLayout 7 | import zone.com.zrefreshlayoutdemo.header.SinaRefreshViewRefreshPositionTest 8 | 9 | /** 10 | * Created by fuzhipeng on 2017/1/11. 11 | */ 12 | 13 | class RefreshPositionActivity : AppCompatActivity() { 14 | 15 | override fun onCreate(savedInstanceState: Bundle?) { 16 | super.onCreate(savedInstanceState) 17 | setContentView(R.layout.unique_feature) 18 | tv.text = "下拉到头部一半,则可刷新!" 19 | refresh.setIHeaderView(SinaRefreshViewRefreshPositionTest()) 20 | refresh.pullListener = ZRefreshLayout.PullListener { zRefreshLayout -> 21 | refresh.postDelayed({ 22 | iv.setImageResource(R.drawable.aaaaaaaaaaaab) 23 | zRefreshLayout.refreshComplete() 24 | }, 2000) 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/ResistanceActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import kotlinx.android.synthetic.main.unique_feature.* 6 | import zone.com.zrefreshlayout.ZRefreshLayout 7 | import zone.com.zrefreshlayout.resistance.DampingHalfToHead 8 | 9 | /** 10 | * Created by fuzhipeng on 2017/1/11. 11 | */ 12 | 13 | class ResistanceActivity : AppCompatActivity() { 14 | 15 | override fun onCreate(savedInstanceState: Bundle?) { 16 | super.onCreate(savedInstanceState) 17 | setContentView(R.layout.unique_feature) 18 | refresh.iResistance = DampingHalfToHead() 19 | tv.text = "下拉到头部后不可继续!" 20 | refresh.pullListener = ZRefreshLayout.PullListener { zRefreshLayout -> 21 | refresh.postDelayed({ 22 | iv.setImageResource(R.drawable.aaaaaaaaaaaab) 23 | zRefreshLayout.refreshComplete() 24 | }, 2000) 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/SPManager.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import com.zone.lib.utils.data.file2io2data.ZSharePerference 4 | 5 | /** 6 | *[2018/12/11] by Zone 7 | */ 8 | object SP1 : ZSharePerference("SP1") -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/ScrollerNesttActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | import android.os.Bundle 3 | import androidx.appcompat.app.AppCompatActivity 4 | import java.util.ArrayList 5 | import com.zone.adapter3.QuickRcvAdapter 6 | import kotlinx.android.synthetic.main.a_scroll_recycler_nest.* 7 | import zone.com.zrefreshlayout.ZRefreshLayout 8 | import zone.com.zrefreshlayoutdemo.delegate.MenuEntityDeletates 9 | 10 | /** 11 | * Created by fuzhipeng on 2017/1/10. 12 | */ 13 | 14 | class ScrollerNesttActivity : AppCompatActivity() { 15 | private var i = 0 16 | private val mDatas = ArrayList() 17 | private var adapter2: QuickRcvAdapter? = null 18 | 19 | init { 20 | run { 21 | var i: Int = 'A'.toInt() 22 | while (i <= 'T'.toInt()) { 23 | mDatas.add("" + i.toChar()) 24 | i++ 25 | } 26 | } 27 | } 28 | 29 | override fun onCreate(savedInstanceState: Bundle?) { 30 | super.onCreate(savedInstanceState) 31 | setContentView(R.layout.a_scroll_recycler_nest) 32 | setSupportActionBar(id_toolbar) 33 | 34 | refresh.pullListener = ZRefreshLayout.PullListener { zRefreshLayout -> 35 | refresh.postDelayed({ 36 | mDatas.add("刷新完毕:" + i++) 37 | adapter2!!.notifyDataSetChanged() 38 | zRefreshLayout.refreshComplete() 39 | }, 2000) 40 | } 41 | refresh.loadMoreListener = ZRefreshLayout.LoadMoreListener { zRefreshLayout -> 42 | refresh.postDelayed({ 43 | mDatas.add("加载完毕:" + i++) 44 | adapter2!!.notifyDataSetChanged() 45 | zRefreshLayout.loadMoreComplete() 46 | }, 2000) 47 | } 48 | rv.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(this, androidx.recyclerview.widget.LinearLayoutManager.VERTICAL, false) 49 | adapter2= QuickRcvAdapter(this,mDatas).apply { 50 | addViewHolder(MenuEntityDeletates()) 51 | relatedList(rv) 52 | } 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/ScrollerViewActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import kotlinx.android.synthetic.main.scroller.* 6 | import zone.com.zrefreshlayout.ZRefreshLayout 7 | 8 | /** 9 | * Created by fuzhipeng on 2017/1/10. 10 | */ 11 | 12 | class ScrollerViewActivity : AppCompatActivity() { 13 | internal var i = 0 14 | 15 | override fun onCreate(savedInstanceState: Bundle?) { 16 | super.onCreate(savedInstanceState) 17 | setContentView(R.layout.scroller) 18 | 19 | initText() 20 | refresh.loadMoreListener = ZRefreshLayout.LoadMoreListener { zRefreshLayout -> 21 | refresh.postDelayed({ 22 | tv1.text = "TV1:加载次数$i" 23 | tv2.text = "TV2:加载次数$i" 24 | tv3.text = "TV3:加载次数$i" 25 | zRefreshLayout.loadMoreComplete() 26 | }, 2000) 27 | } 28 | refresh.pullListener = ZRefreshLayout.PullListener { zRefreshLayout -> 29 | refresh.postDelayed({ 30 | i++ 31 | initText() 32 | zRefreshLayout.refreshComplete() 33 | }, 2000) 34 | } 35 | } 36 | 37 | private fun initText() { 38 | tv1.text = "TV1:刷新次数$i" 39 | tv2.text = "TV2:刷新次数$i" 40 | tv3.text = "TV3:刷新次数$i" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/SettingActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.os.Bundle 4 | import androidx.annotation.IdRes 5 | import androidx.appcompat.app.AppCompatActivity 6 | import android.view.View 7 | import android.widget.RadioGroup 8 | import kotlinx.android.synthetic.main.a_setting.* 9 | import zone.com.zrefreshlayout.ZRefreshLayout 10 | import zone.com.zrefreshlayoutdemo.common.Constant 11 | import zone.com.zrefreshlayoutdemo.common.HeadSetting 12 | 13 | /** 14 | * MIT License 15 | * Copyright (c) [2018] [Zone] 16 | */ 17 | 18 | class SettingActivity : AppCompatActivity(), RadioGroup.OnCheckedChangeListener, View.OnClickListener { 19 | private var mHeadSetting: HeadSetting? = null 20 | 21 | override fun onCreate(savedInstanceState: Bundle?) { 22 | super.onCreate(savedInstanceState) 23 | setContentView(R.layout.a_setting) 24 | rb_pin!!.setOnCheckedChangeListener(this) 25 | rb_head!!.setOnCheckedChangeListener(this) 26 | mHeadSetting = SP1.get(Constant.REFRESH_MODE, HeadSetting::class.java) 27 | if (mHeadSetting == null) { 28 | mHeadSetting = HeadSetting() 29 | rb_head_meterial!!.performClick() 30 | rb_pin_false!!.performClick() 31 | } else { 32 | when (mHeadSetting!!.headmode) { 33 | HeadSetting.METERIAL -> rb_head_meterial!!.performClick() 34 | HeadSetting.SINA -> rb_head_sina!!.performClick() 35 | HeadSetting.WAVE -> rb_head_wave!!.performClick() 36 | } 37 | if (mHeadSetting!!.headPin() == ZRefreshLayout.HeadPin.PIN) 38 | rb_pin_true!!.performClick() 39 | else 40 | rb_pin_false!!.performClick() 41 | } 42 | 43 | } 44 | 45 | override fun onClick(v: View?) { 46 | v?.let { 47 | when (it.id) { 48 | R.id.tv_Clear -> { 49 | SP1.remove(Constant.REFRESH_MODE) 50 | Apps.setDefaultHeader() 51 | } 52 | R.id.Save -> { 53 | SP1.put(Constant.REFRESH_MODE, mHeadSetting) 54 | Apps.setGlobalHead(mHeadSetting) 55 | } 56 | } 57 | finish() 58 | } 59 | } 60 | 61 | override fun onCheckedChanged(group: RadioGroup, @IdRes checkedId: Int) { 62 | if (group === rb_pin) 63 | onCheckedChanged_Pin(checkedId) 64 | if (group === rb_head) 65 | onCheckedChanged_Head(checkedId) 66 | } 67 | 68 | fun onCheckedChanged_Pin(@IdRes checkedId: Int) { 69 | if (checkedId == R.id.rb_pin_true) 70 | mHeadSetting!!.setPin(ZRefreshLayout.HeadPin.PIN) 71 | else 72 | mHeadSetting!!.setPin(ZRefreshLayout.HeadPin.NOT_PIN) 73 | } 74 | 75 | fun onCheckedChanged_Head(@IdRes checkedId: Int) { 76 | when (checkedId) { 77 | R.id.rb_head_meterial -> mHeadSetting!!.headmode = HeadSetting.METERIAL 78 | R.id.rb_head_sina -> mHeadSetting!!.headmode = HeadSetting.SINA 79 | R.id.rb_head_wave -> mHeadSetting!!.headmode = HeadSetting.WAVE 80 | } 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/SinaHeaderActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | 6 | import com.zone.lib.utils.activity_fragment_ui.ToastUtils 7 | 8 | import kotlinx.android.synthetic.main.auto_refresh.* 9 | import zone.com.zrefreshlayout.ZRefreshLayout 10 | import zone.com.zrefreshlayout.footer.LoadFooter 11 | import zone.com.zrefreshlayout.header.SinaRefreshHeader 12 | 13 | /** 14 | * Created by fuzhipeng on 2017/1/11. 15 | */ 16 | 17 | class SinaHeaderActivity : AppCompatActivity() { 18 | 19 | override fun onCreate(savedInstanceState: Bundle?) { 20 | super.onCreate(savedInstanceState) 21 | setContentView(R.layout.auto_refresh) 22 | refresh.iHeaderView = SinaRefreshHeader() 23 | refresh.pullListener = ZRefreshLayout.PullListener { zRefreshLayout -> 24 | refresh.postDelayed({ 25 | iv.setImageResource(R.drawable.aaaaaaaaaaaab) 26 | zRefreshLayout.refreshComplete() 27 | }, 2000) 28 | } 29 | 30 | refresh.iFooterView = LoadFooter() 31 | refresh.loadMoreListener = ZRefreshLayout.LoadMoreListener { zRefreshLayout -> 32 | refresh.postDelayed({ 33 | ToastUtils.showShort(this@SinaHeaderActivity, "加载更多") 34 | zRefreshLayout.loadMoreComplete() 35 | }, 2000) 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/TextViewActivity.java: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo; 2 | 3 | import android.os.Bundle; 4 | import androidx.appcompat.app.AppCompatActivity; 5 | import android.widget.TextView; 6 | 7 | import zone.com.zrefreshlayout.ZRefreshLayout; 8 | 9 | /** 10 | * Created by fuzhipeng on 2017/1/10. 11 | */ 12 | 13 | public class TextViewActivity extends AppCompatActivity { 14 | private ZRefreshLayout refresh; 15 | private TextView tv; 16 | private int i = 0; 17 | 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | setContentView(R.layout.text); 22 | refresh = (ZRefreshLayout) findViewById(R.id.refresh); 23 | tv = (TextView) findViewById(R.id.tv); 24 | refresh.setLoadMoreListener(new ZRefreshLayout.LoadMoreListener() { 25 | @Override 26 | public void loadMore(final ZRefreshLayout zRefreshLayout) { 27 | tv.postDelayed(new Runnable() { 28 | @Override 29 | public void run() { 30 | tv.setText("加载更多:" + i++); 31 | zRefreshLayout.loadMoreComplete(); 32 | } 33 | }, 500); 34 | } 35 | 36 | }); 37 | refresh.setPullListener(new ZRefreshLayout.PullListener() { 38 | @Override 39 | public void refresh(final ZRefreshLayout zRefreshLayout) { 40 | tv.postDelayed(new Runnable() { 41 | @Override 42 | public void run() { 43 | tv.setText("刷新完毕:" + i++); 44 | zRefreshLayout.refreshComplete(); 45 | } 46 | }, 500); 47 | } 48 | }); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/UniqueFeatureActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import kotlinx.android.synthetic.main.unique_feature.* 6 | import zone.com.zrefreshlayout.ZRefreshLayout 7 | 8 | /** 9 | * Created by fuzhipeng on 2017/1/11. 10 | */ 11 | 12 | class UniqueFeatureActivity : AppCompatActivity() { 13 | 14 | override fun onCreate(savedInstanceState: Bundle?) { 15 | super.onCreate(savedInstanceState) 16 | setContentView(R.layout.unique_feature) 17 | refresh.pullListener = ZRefreshLayout.PullListener { zRefreshLayout -> 18 | refresh.postDelayed({ 19 | iv.setImageResource(R.drawable.aaaaaaaaaaaab) 20 | zRefreshLayout.refreshComplete() 21 | }, 2000) 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/WaveHeaderActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import kotlinx.android.synthetic.main.unique_feature.* 6 | import zone.com.zrefreshlayout.ZRefreshLayout 7 | import zone.com.zrefreshlayoutdemo.header.WaveHead 8 | 9 | /** 10 | * Created by fuzhipeng on 2017/1/11. 11 | */ 12 | 13 | class WaveHeaderActivity : AppCompatActivity() { 14 | 15 | override fun onCreate(savedInstanceState: Bundle?) { 16 | super.onCreate(savedInstanceState) 17 | setContentView(R.layout.unique_feature) 18 | val waveHead = WaveHead() 19 | waveHead.resourceId = R.drawable.wave 20 | refresh.iHeaderView = waveHead 21 | 22 | tv.text = "写着玩的没啥用~" 23 | refresh.pullListener = ZRefreshLayout.PullListener { zRefreshLayout -> 24 | refresh.postDelayed({ 25 | iv.setImageResource(R.drawable.aaaaaaaaaaaab) 26 | zRefreshLayout.refreshComplete() 27 | }, 2000) 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/WebViewActivity.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import android.webkit.WebView 6 | import android.webkit.WebViewClient 7 | import android.widget.Toast 8 | import kotlinx.android.synthetic.main.web.* 9 | import zone.com.zrefreshlayout.ZRefreshLayout 10 | 11 | /** 12 | * Created by fuzhipeng on 2017/1/10. 13 | */ 14 | 15 | class WebViewActivity : AppCompatActivity() { 16 | 17 | 18 | override fun onCreate(savedInstanceState: Bundle?) { 19 | super.onCreate(savedInstanceState) 20 | setContentView(R.layout.web) 21 | rotate_header_web_view.settings.javaScriptEnabled = true 22 | rotate_header_web_view.webViewClient = object : WebViewClient() { 23 | override fun onPageFinished(view: WebView, url: String) { 24 | refresh.refreshComplete() 25 | } 26 | } 27 | refresh.pullListener = ZRefreshLayout.PullListener { rotate_header_web_view.loadUrl("http://luhaoaimama1.github.io") } 28 | 29 | refresh.loadMoreListener = ZRefreshLayout.LoadMoreListener { 30 | refresh.postDelayed({ 31 | Toast.makeText(this@WebViewActivity, "load", Toast.LENGTH_SHORT).show() 32 | refresh.loadMoreComplete() 33 | }, 2000) 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/common/Constant.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo.common 2 | 3 | object Constant { 4 | val REFRESH_MODE = "REFRESH_MODE" 5 | } -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/common/HeadSetting.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo.common 2 | 3 | import zone.com.zrefreshlayout.ZRefreshLayout 4 | 5 | /** 6 | * MIT License 7 | * Copyright (c) [2018] [Zone] 8 | */ 9 | 10 | class HeadSetting { 11 | 12 | var headmode: Int = 0 13 | private var headPin: ZRefreshLayout.HeadPin = ZRefreshLayout.HeadPin.NOT_PIN 14 | 15 | fun headPin(): ZRefreshLayout.HeadPin { 16 | return headPin 17 | } 18 | 19 | fun setPin(pin: ZRefreshLayout.HeadPin) { 20 | this.headPin = pin 21 | } 22 | 23 | companion object { 24 | val METERIAL = 0 25 | val SINA = 1 26 | val WAVE = 2 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/delegate/AdapterList.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo.delegate 2 | 3 | import android.content.Context 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import android.widget.BaseAdapter 8 | import android.widget.TextView 9 | import zone.com.zrefreshlayoutdemo.R 10 | import zone.com.zrefreshlayoutdemo.RecyclerViewActivity 11 | 12 | class AdapterList(val context: Context, private val stuList: List) : BaseAdapter() { 13 | 14 | override fun getCount(): Int { 15 | return stuList.size 16 | } 17 | 18 | override fun getItem(position: Int): Any { 19 | return stuList[position] 20 | } 21 | 22 | override fun getItemId(position: Int): Long { 23 | return position.toLong() 24 | } 25 | 26 | override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { 27 | val view = LayoutInflater.from(context).inflate(R.layout.item_menu, null) 28 | val tv = view.findViewById(R.id.tv) 29 | tv.setText( stuList.get(position)) 30 | val i = RecyclerViewActivity.colorArry[position % 31 | RecyclerViewActivity.colorArry.size] 32 | tv.setBackgroundColor(i) 33 | return view 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/delegate/MenuEntityDeletates.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo.delegate 2 | 3 | import com.zone.adapter3.bean.Holder 4 | import com.zone.adapter3.bean.ViewDelegates 5 | import zone.com.zrefreshlayoutdemo.R 6 | import zone.com.zrefreshlayoutdemo.RecyclerViewActivity 7 | 8 | class MenuEntityDeletates() : ViewDelegates() { 9 | override fun getLayoutId(): Int = R.layout.item_menu 10 | 11 | override fun fillData(posi: Int, entity: String?, holder: Holder>?) { 12 | holder?.setText(R.id.tv, entity) 13 | ?.setBackgroundColor(R.id.tv, RecyclerViewActivity.colorArry[holder.getAdapterPosition() % RecyclerViewActivity.colorArry.size]) 14 | } 15 | 16 | } -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/header/CircleRefresh.java: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo.header; 2 | 3 | import android.app.Activity; 4 | import android.graphics.Color; 5 | import androidx.annotation.NonNull; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.LinearLayout; 9 | 10 | import zone.com.zrefreshlayout.AUtils; 11 | import zone.com.zrefreshlayout.IScroll; 12 | import zone.com.zrefreshlayout.ScrollAnimation; 13 | import zone.com.zrefreshlayout.IHeaderView; 14 | import zone.com.zrefreshlayout.R; 15 | import zone.com.zrefreshlayout.ZRefreshLayout; 16 | import zone.com.zrefreshlayout.utils.ScreenUtils; 17 | import zone.com.zrefreshlayoutdemo.header.view.AnimationView; 18 | import static zone.com.zrefreshlayout.utils.LogUtils.log; 19 | /** 20 | * Created by fuzhipeng on 2017/1/13. 21 | */ 22 | 23 | public class CircleRefresh implements IHeaderView { 24 | 25 | private View rootView; 26 | private AnimationView mHeaderWaveCircle; 27 | private int mHeaderCircleSmaller = 6; 28 | private IScroll iScroll; 29 | private LinearLayout ll_main; 30 | private int[] screenPixs; 31 | 32 | 33 | @Override 34 | public View initView(ZRefreshLayout zRefreshLayout) { 35 | rootView = View.inflate(zRefreshLayout.getContext(), R.layout.header_meterial, null); 36 | // rootView.setBackgroundColor(Color.RED); 37 | //注意inflate那种模式 第一层需要空出去 不然会wrapcontent 38 | ll_main = (LinearLayout) rootView.findViewById(R.id.ll_main); 39 | screenPixs = ScreenUtils.getScreenPix((Activity) zRefreshLayout.getContext()); 40 | ll_main.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT 41 | , (int) (screenPixs[1] * 0.2))); 42 | AUtils.setHeaderHeightToRefresh(zRefreshLayout,(int) (screenPixs[1] * 0.2*0.8)); 43 | addView(); 44 | return rootView; 45 | } 46 | 47 | @NonNull 48 | @Override 49 | public View getView() { 50 | return rootView; 51 | } 52 | 53 | private void addView() { 54 | ll_main.removeAllViews(); 55 | mHeaderWaveCircle = new AnimationView(rootView.getContext()); 56 | mHeaderWaveCircle.setBackgroundColor(Color.parseColor("#ffdb6e")); 57 | LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, (int) (screenPixs[1] * 0.2)); 58 | mHeaderWaveCircle.setLayoutParams(params); 59 | 60 | ll_main.addView(mHeaderWaveCircle); 61 | mHeaderWaveCircle.setAniBackColor(Color.parseColor("#ffdb6e")); 62 | mHeaderWaveCircle.setAniForeColor(Color.WHITE); 63 | mHeaderWaveCircle.setRadius(mHeaderCircleSmaller); 64 | mHeaderWaveCircle.setOnViewAniDone(new AnimationView.OnViewAniDone() { 65 | @Override 66 | public void viewAniDone() { 67 | // Log.i(TAG, "should invoke"); 68 | log("viewAniDone"); 69 | //刷新动画 延迟完毕 70 | AUtils.smoothScrollTo_NotIntercept(iScroll,0); 71 | } 72 | }); 73 | } 74 | 75 | @Override 76 | public void onPullingDown(float fraction, float headHeight) { 77 | } 78 | 79 | @Override 80 | public void refreshAble(boolean refreshAble) { 81 | if (refreshAble) { 82 | mHeaderWaveCircle.releaseDrag(); 83 | } 84 | } 85 | 86 | private ScrollAnimation mScrollAnimation = ScrollAnimation.None; 87 | 88 | @Override 89 | public void animateBack(ScrollAnimation scrollAnimation, float fraction, float headHeight, ZRefreshLayout.HeadPin isPinContent) { 90 | mScrollAnimation = scrollAnimation; 91 | } 92 | 93 | 94 | //这里主要是对延迟刷新的处理 95 | @Override 96 | public boolean interceptAnimateBack(ScrollAnimation scrollAnimation, IScroll iScroll) { 97 | this.iScroll = iScroll; 98 | boolean result = false; 99 | if (mScrollAnimation != scrollAnimation && scrollAnimation == ScrollAnimation.Complete_BackAnimation) { 100 | mHeaderWaveCircle.setRefreshing(false);//刷新动画 101 | result = true; 102 | } 103 | mScrollAnimation = scrollAnimation; 104 | //返回结果就是是否拦截 105 | return result; 106 | } 107 | 108 | @Override 109 | public void onRefreshing(float headHeight, boolean isAutoRefresh) { 110 | 111 | } 112 | 113 | @Override 114 | public void onComplete() { 115 | addView(); 116 | } 117 | 118 | @Override 119 | public IHeaderView clone_() { 120 | return new CircleRefresh(); 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/header/SinaRefreshViewRefreshPositionTest.java: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo.header; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import androidx.annotation.DrawableRes; 6 | import androidx.annotation.NonNull; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.view.animation.LinearInterpolator; 11 | import android.widget.ImageView; 12 | import android.widget.LinearLayout; 13 | import android.widget.TextView; 14 | 15 | import android.animation.ValueAnimator; 16 | 17 | import zone.com.zanimate.value.ValueAnimatorProxy; 18 | import zone.com.zrefreshlayout.AUtils; 19 | import zone.com.zrefreshlayout.IScroll; 20 | import zone.com.zrefreshlayout.ScrollAnimation; 21 | import zone.com.zrefreshlayout.IHeaderView; 22 | import zone.com.zrefreshlayout.R; 23 | import zone.com.zrefreshlayout.ZRefreshLayout; 24 | import zone.com.zrefreshlayout.utils.DensityUtils; 25 | import zone.com.zrefreshlayout.utils.ScreenUtils; 26 | 27 | import static zone.com.zrefreshlayout.utils.LogUtils.log; 28 | 29 | /** 30 | * Created by lcodecore on 2016/10/2. 31 | */ 32 | 33 | public class SinaRefreshViewRefreshPositionTest implements IHeaderView { 34 | 35 | private ImageView refreshArrow; 36 | private ImageView loadingView; 37 | private TextView refreshTextView; 38 | private View rootView; 39 | private LinearLayout ll_main; 40 | 41 | public void setArrowResource(@DrawableRes int resId) { 42 | refreshArrow.setImageResource(resId); 43 | } 44 | 45 | public void setPullDownStr(String pullDownStr1) { 46 | pullDownStr = pullDownStr1; 47 | } 48 | 49 | public void setReleaseRefreshStr(String releaseRefreshStr1) { 50 | releaseRefreshStr = releaseRefreshStr1; 51 | } 52 | 53 | public void setRefreshingStr(String refreshingStr1) { 54 | refreshingStr = refreshingStr1; 55 | } 56 | 57 | private String pullDownStr = "下拉刷新"; 58 | private String releaseRefreshStr = "释放刷新"; 59 | private String refreshingStr = "正在刷新"; 60 | 61 | @Override 62 | public IHeaderView clone_() { 63 | return new SinaRefreshViewRefreshPositionTest(); 64 | } 65 | 66 | @Override 67 | public View initView(ZRefreshLayout zRefreshLayout) { 68 | rootView = LayoutInflater.from(zRefreshLayout.getContext()).inflate(R.layout.view_sinaheader,zRefreshLayout,false); 69 | //注意inflate那种模式 第一层需要空出去 不然会wrapcontent 70 | ll_main = (LinearLayout) rootView.findViewById(R.id.ll_main); 71 | refreshArrow = (ImageView) rootView.findViewById(R.id.iv_arrow); 72 | refreshTextView = (TextView) rootView.findViewById(R.id.tv); 73 | loadingView = (ImageView) rootView.findViewById(R.id.iv_loading); 74 | screenAdapter(zRefreshLayout,zRefreshLayout.getContext()); 75 | return rootView; 76 | } 77 | 78 | @NonNull 79 | @Override 80 | public View getView() { 81 | return rootView; 82 | } 83 | 84 | private void screenAdapter(ZRefreshLayout zRefreshLayout, Context context) { 85 | int[] screenPixs = ScreenUtils.getScreenPix((Activity) context); 86 | ll_main.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT 87 | , (int) (screenPixs[1] * 0.1))); 88 | ViewGroup.LayoutParams refreshArrowLp = refreshArrow.getLayoutParams(); 89 | refreshArrowLp.width = getAnInt(71, screenPixs, true); 90 | refreshArrowLp.height = getAnInt(71, screenPixs, false); 91 | refreshArrow.setLayoutParams(refreshArrowLp); 92 | ViewGroup.LayoutParams loadingViewLp = loadingView.getLayoutParams(); 93 | loadingViewLp.width = getAnInt(71, screenPixs, true); 94 | loadingViewLp.height = getAnInt(71, screenPixs, false); 95 | loadingView.setLayoutParams(loadingViewLp); 96 | //注意TextSiz 要的是sp 需要px转过去 97 | refreshTextView.setTextSize(DensityUtils.px2sp(context, getAnInt(35, screenPixs, true))); 98 | AUtils.setHeaderHeightToRefresh(zRefreshLayout,(int) (screenPixs[1] * 0.05)); 99 | } 100 | 101 | //我的参考图是1080*1920 102 | private int getAnInt(int dx, int[] screenPixs, boolean isWidth) { 103 | if (isWidth) 104 | return (int) (1F * dx / 1080 * screenPixs[0]); 105 | else 106 | return (int) (1F * dx / 1920 * screenPixs[1]); 107 | } 108 | 109 | @Override 110 | public void onPullingDown(float fraction, float headHeight) { 111 | } 112 | 113 | @Override 114 | public void refreshAble(boolean refreshAble) { 115 | if (refreshAble) { 116 | refreshArrow.animate().rotation(-180).start(); 117 | refreshTextView.setText(releaseRefreshStr); 118 | } else { 119 | refreshTextView.setText(pullDownStr); 120 | refreshArrow.animate().rotation(0).start(); 121 | } 122 | } 123 | 124 | @Override 125 | public void animateBack(ScrollAnimation scrollAnimation, float fraction, float headHeight, 126 | ZRefreshLayout.HeadPin mIScroll) { 127 | } 128 | 129 | @Override 130 | public boolean interceptAnimateBack(ScrollAnimation scrollAnimation, IScroll iScroll) { 131 | return false; 132 | } 133 | 134 | @Override 135 | public void onRefreshing(float headHeight, boolean isAutoRefresh) { 136 | refreshTextView.setText(refreshingStr); 137 | refreshArrow.setVisibility(View.GONE); 138 | loadingView.setVisibility(View.VISIBLE); 139 | valueAnimator.start(); 140 | log("onRefreshing"); 141 | } 142 | 143 | private ValueAnimatorProxy valueAnimator = ValueAnimatorProxy.ofInt(0, 360) 144 | .setDuration(1200) 145 | .setInterpolator(new LinearInterpolator()) 146 | .setRepeatCount(ValueAnimator.INFINITE) 147 | .addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 148 | @Override 149 | public void onAnimationUpdate(ValueAnimator animation) { 150 | // 30 =360/12; 151 | // ZRefreshLayout.log("animation.getAnimatedValue():"+animation.getAnimatedValue()+"——————进度:"+((Integer) animation.getAnimatedValue()/30)*30F); 152 | loadingView.setRotation(((Integer) animation.getAnimatedValue() / 30) * 30F); 153 | } 154 | }); 155 | 156 | @Override 157 | public void onComplete() { 158 | refreshArrow.setVisibility(View.VISIBLE); 159 | loadingView.setVisibility(View.GONE); 160 | if (valueAnimator.isRunning()) 161 | valueAnimator.end(); 162 | log("onComplete"); 163 | } 164 | 165 | 166 | } 167 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/header/WaveHead.java: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo.header; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.graphics.Bitmap; 6 | import android.graphics.ColorMatrix; 7 | import android.graphics.ColorMatrixColorFilter; 8 | import android.graphics.PorterDuff; 9 | import androidx.annotation.NonNull; 10 | import android.view.View; 11 | import android.view.ViewGroup; 12 | import android.widget.ImageView; 13 | import android.widget.LinearLayout; 14 | 15 | import android.animation.ValueAnimator; 16 | import com.zone.lib.utils.image.BitmapComposer; 17 | import com.zone.lib.utils.image.WaveHelper; 18 | import com.zone.lib.utils.image.compress2sample.SampleUtils; 19 | 20 | import zone.com.zanimate.value.ValueAnimatorProxy; 21 | import zone.com.zrefreshlayout.IScroll; 22 | import zone.com.zrefreshlayout.ScrollAnimation; 23 | import zone.com.zrefreshlayout.IHeaderView; 24 | import zone.com.zrefreshlayout.R; 25 | import zone.com.zrefreshlayout.ZRefreshLayout; 26 | import zone.com.zrefreshlayout.utils.ScreenUtils; 27 | 28 | /** 29 | * Created by fuzhipeng on 2017/1/13. 30 | */ 31 | 32 | public class WaveHead implements IHeaderView { 33 | 34 | private View rootView; 35 | private ImageView imageView; 36 | private int resourceId; 37 | private static final int ANIMATION_DURATION = 1332 * 2; 38 | private WaveUtils mWaveUtils; 39 | 40 | @Override 41 | public View initView(ZRefreshLayout zRefreshLayout) { 42 | rootView = View.inflate(zRefreshLayout.getContext(), R.layout.header_meterial, null); 43 | //注意inflate那种模式 第一层需要空出去 不然会wrapcontent 44 | LinearLayout ll_main = (LinearLayout) rootView.findViewById(R.id.ll_main); 45 | int[] screenPixs = ScreenUtils.getScreenPix((Activity) zRefreshLayout.getContext()); 46 | ll_main.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT 47 | , (int) (screenPixs[1] * 0.2))); 48 | imageView = new ImageView(zRefreshLayout.getContext()); 49 | int imageViewHeight2width = (int) (screenPixs[1] * 0.2); 50 | imageView.setLayoutParams(new LinearLayout.LayoutParams(imageViewHeight2width, imageViewHeight2width)); 51 | ll_main.addView(imageView); 52 | mWaveUtils = new WaveUtils(); 53 | mWaveUtils.wave(zRefreshLayout.getContext(), imageViewHeight2width); 54 | return rootView; 55 | } 56 | 57 | @NonNull 58 | @Override 59 | public View getView() { 60 | return rootView; 61 | } 62 | 63 | @Override 64 | public void onPullingDown(float fraction, float headHeight) { 65 | imageView.setRotationX(90 - fraction * 90); 66 | } 67 | 68 | @Override 69 | public void refreshAble(boolean refreshAble) { 70 | 71 | } 72 | 73 | @Override 74 | public void animateBack(ScrollAnimation scrollAnimation, float fraction, float headHeight, ZRefreshLayout.HeadPin mIScroll) { 75 | if (scrollAnimation == ScrollAnimation.RefreshAble_BackAnimation) 76 | imageView.setRotationX(90 - fraction * 90); 77 | } 78 | 79 | @Override 80 | public boolean interceptAnimateBack(ScrollAnimation scrollAnimation, IScroll iScroll) { 81 | return false; 82 | } 83 | 84 | @Override 85 | public void onRefreshing(float headHeight, boolean isAutoRefresh) { 86 | mWaveUtils.valueAnimator.start(); 87 | mWaveUtils.mWaveHelper.start(); 88 | } 89 | 90 | @Override 91 | public void onComplete() { 92 | imageView.setRotationX(90); 93 | mWaveUtils.valueAnimator.end(); 94 | mWaveUtils.mWaveHelper.cancel(); 95 | mWaveUtils.mWaveHelper.setLevelProgress(0F); 96 | } 97 | 98 | @Override 99 | public IHeaderView clone_() { 100 | WaveHead clone = new WaveHead(); 101 | clone.resourceId = resourceId; 102 | return clone; 103 | } 104 | 105 | 106 | public int getResourceId() { 107 | return resourceId; 108 | } 109 | 110 | public void setResourceId(int resourceId) { 111 | this.resourceId = resourceId; 112 | } 113 | 114 | 115 | class WaveUtils { 116 | 117 | private WaveHelper mWaveHelper; 118 | private ValueAnimatorProxy valueAnimator = ValueAnimatorProxy.ofFloat(0, 1F) 119 | .setDuration(ANIMATION_DURATION) 120 | .setRepeatCount(ValueAnimator.INFINITE) 121 | .addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 122 | @Override 123 | public void onAnimationUpdate(ValueAnimator animation) { 124 | if (mWaveHelper != null) 125 | mWaveHelper.setLevelProgress((Float) animation.getAnimatedValue()); 126 | // log("onAnimationUpdate:" + (Float) animation.getAnimatedValue()); 127 | } 128 | }); 129 | 130 | private void wave(final Context context, final int imageViewHeight2width) { 131 | if (resourceId == -1) 132 | throw new IllegalStateException("resourceId not be null!"); 133 | final Bitmap bt = SampleUtils.load(context, resourceId) 134 | .override(imageViewHeight2width, imageViewHeight2width) 135 | .bitmap(); 136 | 137 | final ColorMatrix colorMatrix = new ColorMatrix(); 138 | colorMatrix.setSaturation(0); 139 | 140 | final BitmapComposer bitmapComposer = BitmapComposer.newComposition(bt.getWidth(), bt.getHeight(), Bitmap.Config.ARGB_4444); 141 | // Matrix first = new Matrix(); 142 | // first.postTranslate(0, -20); 143 | mWaveHelper = new WaveHelper(bt.getWidth(), bt.getHeight(), new WaveHelper.RefreshCallback() { 144 | @Override 145 | public void refresh(Bitmap wave) { 146 | Bitmap render = bitmapComposer.clear() 147 | .newLayer( 148 | BitmapComposer.Layer.bitmap(bt) 149 | .colorFilter(new ColorMatrixColorFilter(colorMatrix)) 150 | ).newLayer( 151 | BitmapComposer.Layer.bitmap(bt) 152 | .mask(wave, PorterDuff.Mode.DST_IN) 153 | // .matrix(first) 154 | ).render(); 155 | imageView.setImageBitmap(render); 156 | } 157 | }); 158 | mWaveHelper.cancel(); 159 | mWaveHelper.setAmplitude(imageViewHeight2width / 16); 160 | mWaveHelper.setLength(imageViewHeight2width / 1.2F); 161 | mWaveHelper.setSpeed(imageViewHeight2width * 1.2F); 162 | mWaveHelper.setLevelProgress(0F); 163 | } 164 | 165 | 166 | } 167 | } 168 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/resistance/Damping2Head8per.kt: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo.resistance 2 | 3 | import zone.com.zrefreshlayout.IResistance 4 | 5 | /** 6 | * Created by fuzhipeng on 2017/1/10. 7 | */ 8 | 9 | class Damping2Head8per : IResistance { 10 | 11 | override fun clone_(): IResistance { 12 | return Damping2Head8per() 13 | } 14 | 15 | override fun getOffSetYMapValue(headerHeight: Int, offset: Int): Int { 16 | return if (offset / 2 <= headerHeight * 0.8) offset / 2 else (headerHeight * 0.8).toInt() 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/zone/com/zrefreshlayoutdemo/utils/RecyclerViewEmptyUtils.java: -------------------------------------------------------------------------------- 1 | package zone.com.zrefreshlayoutdemo.utils; 2 | 3 | import androidx.annotation.LayoutRes; 4 | import androidx.annotation.NonNull; 5 | import androidx.recyclerview.widget.RecyclerView; 6 | import android.util.Log; 7 | import android.view.View; 8 | 9 | import zone.com.zrefreshlayout.ZRefreshLayout; 10 | 11 | /** 12 | * [2017] by Zone 13 | */ 14 | 15 | public class RecyclerViewEmptyUtils { 16 | 17 | private View emptyView; 18 | private RecyclerView rv; 19 | 20 | public static void addEmptyView(RecyclerView rv, @NonNull View emptyView) { 21 | RecyclerViewEmptyUtils recyclerViewEmptyUtils = new RecyclerViewEmptyUtils(); 22 | recyclerViewEmptyUtils.addEmptyViewInner(rv, emptyView); 23 | } 24 | 25 | public static void addEmptyView(RecyclerView rv, @LayoutRes int layoutID) { 26 | RecyclerViewEmptyUtils recyclerViewEmptyUtils = new RecyclerViewEmptyUtils(); 27 | recyclerViewEmptyUtils.addEmptyViewInner(rv, View.inflate(rv.getContext(), layoutID, null)); 28 | } 29 | 30 | private void addEmptyViewInner(final RecyclerView rv, @NonNull final View emptyView) { 31 | RecyclerView.Adapter adapter = rv.getAdapter(); 32 | if (adapter == null) 33 | throw new IllegalStateException("oldAdapter 不能为Null!"); 34 | this.emptyView = emptyView; 35 | this.rv = rv; 36 | try { 37 | adapter.unregisterAdapterDataObserver(observer); 38 | } catch (Exception e) { 39 | } 40 | if (rv.getParent() instanceof ZRefreshLayout) { 41 | ZRefreshLayout parent = (ZRefreshLayout) rv.getParent(); 42 | parent.addView(emptyView, 1); 43 | } else 44 | throw new IllegalStateException("rv parent 类型必须是ZRefreshLayout!"); 45 | adapter.registerAdapterDataObserver(observer); 46 | checkIfEmpty(); 47 | } 48 | 49 | // private void replaceView(RecyclerView rv, @NonNull View emptyView) { 50 | // ViewGroup parent = (ViewGroup) rv.getParent(); 51 | // FrameLayout frameLayout = new FrameLayout(rv.getContext()); 52 | // frameLayout.setLayoutParams(rv.getLayoutParams()); 53 | // int index = parent.indexOfChild(rv); 54 | // 55 | // parent.removeView(rv); 56 | // frameLayout.addView(rv); 57 | // frameLayout.addView(emptyView); 58 | // parent.addView(frameLayout, index); 59 | // } 60 | 61 | 62 | private RecyclerView.AdapterDataObserver observer = new RecyclerView.AdapterDataObserver() { 63 | public String TAG = "RecyclerViewUtils"; 64 | 65 | @Override 66 | public void onChanged() { 67 | checkIfEmpty(); 68 | } 69 | 70 | @Override 71 | public void onItemRangeInserted(int positionStart, int itemCount) { 72 | Log.i(TAG, "onItemRangeInserted" + itemCount); 73 | checkIfEmpty(); 74 | } 75 | 76 | @Override 77 | public void onItemRangeRemoved(int positionStart, int itemCount) { 78 | checkIfEmpty(); 79 | } 80 | }; 81 | 82 | 83 | private void checkIfEmpty() { 84 | boolean emptyViewVisible = 85 | rv.getAdapter().getItemCount() == 0; 86 | emptyView.setVisibility(emptyViewVisible ? View.VISIBLE : View.GONE); 87 | } 88 | 89 | } 90 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/aaaaaaaaaaaab.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luhaoaimama1/ZRefreshLayout/1226a2d020b718687865b369810d069328e547cb/app/src/main/res/drawable-xxhdpi/aaaaaaaaaaaab.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/img_header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luhaoaimama1/ZRefreshLayout/1226a2d020b718687865b369810d069328e547cb/app/src/main/res/drawable-xxhdpi/img_header.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/wave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luhaoaimama1/ZRefreshLayout/1226a2d020b718687865b369810d069328e547cb/app/src/main/res/drawable-xxhdpi/wave.png -------------------------------------------------------------------------------- /app/src/main/res/layout/a_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 |