├── .gitignore
├── GIF
├── 1.gif
├── 2.gif
├── 3.gif
├── 4.gif
├── 5.gif
├── 6.gif
├── 7.gif
├── 8.gif
└── 9.gif
├── LICENSE
├── README.md
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── libs
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── ybao
│ │ └── pullrefreshview
│ │ ├── extras
│ │ ├── PullableImageView.java
│ │ └── PullableTextView.java
│ │ ├── layout
│ │ ├── BaseFooterView.java
│ │ ├── BaseHeaderView.java
│ │ ├── FlingLayout.java
│ │ ├── PullRefreshLayout.java
│ │ └── SliderBox.java
│ │ └── support
│ │ ├── anim
│ │ ├── AnimGetter.java
│ │ ├── AnimListener.java
│ │ ├── IAnimGetter.java
│ │ └── interpolator
│ │ │ └── DecelerateAccelerateInterpolator.java
│ │ ├── impl
│ │ ├── HPullable.java
│ │ ├── Loadable.java
│ │ ├── OnEndListener.java
│ │ ├── OnScrollListener.java
│ │ ├── Pullable.java
│ │ ├── Refreshable.java
│ │ └── VPullable.java
│ │ ├── overscroll
│ │ └── OverScrollController.java
│ │ ├── resolver
│ │ ├── EventResolver.java
│ │ ├── FlingXResolver.java
│ │ ├── FlingYResolver.java
│ │ └── IEventResolver.java
│ │ ├── type
│ │ └── LayoutType.java
│ │ ├── utils
│ │ ├── HCanPullUtil.java
│ │ ├── Utils.java
│ │ ├── VCanPullUtil.java
│ │ └── ViewScrollUtil.java
│ │ └── view
│ │ └── ObservableScrollView.java
│ └── res
│ └── values
│ ├── attrs.xml
│ └── strings.xml
├── settings.gradle
├── simple
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── ic_launcher-web.png
│ ├── java
│ └── com
│ │ └── ybao
│ │ └── pullrefreshview
│ │ └── simple
│ │ ├── activities
│ │ ├── AllViewActivity.java
│ │ ├── ExpandActivity.java
│ │ ├── FlingActivity.java
│ │ ├── MainActivity.java
│ │ ├── NestedScrollingActivity.java
│ │ ├── NormalRefreshActivity.java
│ │ ├── OtherActivity.java
│ │ ├── ep
│ │ │ ├── DrawerEpActivity.java
│ │ │ ├── NormolEpActivity.java
│ │ │ ├── RG2Activity.java
│ │ │ ├── RGActivity.java
│ │ │ └── ScrollerEpActivity.java
│ │ ├── ex
│ │ │ ├── RecyclerViewActivity.java
│ │ │ ├── ScrollViewActivity.java
│ │ │ └── TextViewActivity.java
│ │ └── other
│ │ │ ├── HeaderActivity.java
│ │ │ └── MIFlingActivity.java
│ │ ├── fragment
│ │ ├── Fragment0.java
│ │ ├── Fragment1.java
│ │ ├── Fragment2.java
│ │ ├── Fragment3.java
│ │ └── Fragment4.java
│ │ ├── utils
│ │ └── AnimUtil.java
│ │ └── view
│ │ ├── EndFooterView.java
│ │ ├── ExpandFooterView.java
│ │ ├── ExpandHeaderView.java
│ │ ├── LockFooterView.java
│ │ ├── LockHeaderView.java
│ │ ├── MiFliingLayout.java
│ │ ├── NormalFooterView.java
│ │ └── NormalHeaderView.java
│ └── res
│ ├── anim
│ ├── scale_in.xml
│ └── scale_out.xml
│ ├── drawable
│ ├── bottom_shadow.xml
│ ├── progress_large_black.xml
│ ├── progress_large_white.xml
│ └── top_shadow.xml
│ ├── layout
│ ├── activity_all_view.xml
│ ├── activity_drawer_ep.xml
│ ├── activity_expand.xml
│ ├── activity_fling.xml
│ ├── activity_header.xml
│ ├── activity_main.xml
│ ├── activity_mifling.xml
│ ├── activity_nestedscrolling.xml
│ ├── activity_normal_refresh.xml
│ ├── activity_normol_ep.xml
│ ├── activity_other.xml
│ ├── activity_recyclerview.xml
│ ├── activity_rg.xml
│ ├── activity_rg2.xml
│ ├── activity_scroller_ep.xml
│ ├── activity_scrollview.xml
│ ├── activity_textview.xml
│ ├── fragment0.xml
│ ├── fragment1.xml
│ ├── fragment2.xml
│ ├── fragment3.xml
│ ├── fragment4.xml
│ ├── item.xml
│ ├── view_footer_end.xml
│ ├── view_footer_expand.xml
│ ├── view_footer_lock.xml
│ ├── view_footer_normal.xml
│ ├── view_header_expand.xml
│ ├── view_header_lock.xml
│ └── view_header_normal.xml
│ ├── mipmap-hdpi
│ └── ic_launcher.png
│ ├── mipmap-mdpi
│ └── ic_launcher.png
│ ├── mipmap-xhdpi
│ ├── ic_launcher.png
│ ├── ic_pull_down.png
│ ├── ic_pull_up.png
│ ├── id_load.png
│ ├── id_load_b.png
│ ├── id_load_clone.png
│ ├── id_load_clone_b.png
│ └── img_header.png
│ ├── mipmap-xxhdpi
│ └── ic_launcher.png
│ ├── mipmap-xxxhdpi
│ └── ic_launcher.png
│ ├── values-w820dp
│ └── dimens.xml
│ └── values
│ ├── colors.xml
│ ├── dimens.xml
│ ├── strings.xml
│ └── styles.xml
└── standardadapter
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
└── main
├── AndroidManifest.xml
├── java
└── com
│ └── ybao
│ └── adapter
│ ├── StandardAdapter.java
│ └── recyclerview
│ ├── HeaderStandardAdapter.java
│ └── StandardAdapter.java
└── res
└── values
└── strings.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | # Built application files
2 | *.apk
3 | *.ap_
4 |
5 | # Files for the Dalvik VM
6 | *.dex
7 |
8 | # Java class files
9 | *.class
10 |
11 | # Generated files
12 | bin/
13 | gen/
14 |
15 | # Gradle files
16 | .gradle/
17 | build/
18 | /*/build/
19 |
20 | # Local configuration file (sdk path, etc)
21 | local.properties
22 |
23 | # Proguard folder generated by Eclipse
24 | proguard/
25 |
26 | # Log Files
27 | *.log
28 |
29 | #.idea
30 | .idea/
31 | *.iml
32 |
--------------------------------------------------------------------------------
/GIF/1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/1.gif
--------------------------------------------------------------------------------
/GIF/2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/2.gif
--------------------------------------------------------------------------------
/GIF/3.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/3.gif
--------------------------------------------------------------------------------
/GIF/4.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/4.gif
--------------------------------------------------------------------------------
/GIF/5.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/5.gif
--------------------------------------------------------------------------------
/GIF/6.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/6.gif
--------------------------------------------------------------------------------
/GIF/7.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/7.gif
--------------------------------------------------------------------------------
/GIF/8.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/8.gif
--------------------------------------------------------------------------------
/GIF/9.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/9.gif
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | repositories {
5 | mavenCentral()
6 | jcenter()
7 | }
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:2.3.1'
10 |
11 | // NOTE: Do not place your application dependencies here; they belong
12 | // in the individual module build.gradle files
13 | }
14 | }
15 |
16 | allprojects {
17 | repositories {
18 | mavenCentral()
19 | jcenter()
20 | }
21 | }
22 |
23 | task clean(type: Delete) {
24 | delete rootProject.buildDir
25 | }
26 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | ANDROID_BUILD_MIN_SDK_VERSION=9
2 | ANDROID_BUILD_TARGET_SDK_VERSION=22
3 | ANDROID_BUILD_SDK_VERSION=23
4 | ANDROID_BUILD_TOOLS_VERSION=25.0.0
5 |
6 | VERSION_NAME=2.1
7 | VERSION_CODE=3
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sun May 14 06:00:48 CST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # For Cygwin, ensure paths are in UNIX format before anything is touched.
46 | if $cygwin ; then
47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
48 | fi
49 |
50 | # Attempt to set APP_HOME
51 | # Resolve links: $0 may be a link
52 | PRG="$0"
53 | # Need this for relative symlinks.
54 | while [ -h "$PRG" ] ; do
55 | ls=`ls -ld "$PRG"`
56 | link=`expr "$ls" : '.*-> \(.*\)$'`
57 | if expr "$link" : '/.*' > /dev/null; then
58 | PRG="$link"
59 | else
60 | PRG=`dirname "$PRG"`"/$link"
61 | fi
62 | done
63 | SAVED="`pwd`"
64 | cd "`dirname \"$PRG\"`/" >&-
65 | APP_HOME="`pwd -P`"
66 | cd "$SAVED" >&-
67 |
68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
69 |
70 | # Determine the Java command to use to start the JVM.
71 | if [ -n "$JAVA_HOME" ] ; then
72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
73 | # IBM's JDK on AIX uses strange locations for the executables
74 | JAVACMD="$JAVA_HOME/jre/sh/java"
75 | else
76 | JAVACMD="$JAVA_HOME/bin/java"
77 | fi
78 | if [ ! -x "$JAVACMD" ] ; then
79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
80 |
81 | Please set the JAVA_HOME variable in your environment to match the
82 | location of your Java installation."
83 | fi
84 | else
85 | JAVACMD="java"
86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
87 |
88 | Please set the JAVA_HOME variable in your environment to match the
89 | location of your Java installation."
90 | fi
91 |
92 | # Increase the maximum file descriptors if we can.
93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
94 | MAX_FD_LIMIT=`ulimit -H -n`
95 | if [ $? -eq 0 ] ; then
96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
97 | MAX_FD="$MAX_FD_LIMIT"
98 | fi
99 | ulimit -n $MAX_FD
100 | if [ $? -ne 0 ] ; then
101 | warn "Could not set maximum file descriptor limit: $MAX_FD"
102 | fi
103 | else
104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
105 | fi
106 | fi
107 |
108 | # For Darwin, add options to specify how the application appears in the dock
109 | if $darwin; then
110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
111 | fi
112 |
113 | # For Cygwin, switch paths to Windows format before running java
114 | if $cygwin ; then
115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
158 | function splitJvmOpts() {
159 | JVM_OPTS=("$@")
160 | }
161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
163 |
164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
165 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/libs/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/libs/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 |
3 | android {
4 | compileSdkVersion ANDROID_BUILD_SDK_VERSION as int
5 | buildToolsVersion ANDROID_BUILD_TOOLS_VERSION
6 |
7 | defaultConfig {
8 | minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION as int
9 | targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION as int
10 | versionCode VERSION_CODE as int
11 | versionName VERSION_NAME
12 | }
13 | buildTypes {
14 | release {
15 | minifyEnabled false
16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
17 | }
18 | }
19 | productFlavors {
20 | }
21 | }
22 |
23 | dependencies {
24 | compile project(':standardadapter')
25 | compile 'com.android.support:recyclerview-v7:23.2.1'
26 | compile 'com.android.support:support-v4:23.2.1'
27 | compile 'com.nineoldandroids:library:2.4.0'
28 | }
29 |
--------------------------------------------------------------------------------
/libs/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 D:\CodeTools\SDK\AndroidWindows/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 |
--------------------------------------------------------------------------------
/libs/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/extras/PullableImageView.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.extras;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.view.View;
6 | import android.widget.ImageView;
7 |
8 | import com.ybao.pullrefreshview.support.impl.VPullable;
9 |
10 |
11 | public class PullableImageView extends ImageView implements VPullable {
12 |
13 | public PullableImageView(Context context) {
14 | super(context);
15 | }
16 |
17 | public PullableImageView(Context context, AttributeSet attrs) {
18 | super(context, attrs);
19 | }
20 |
21 | public PullableImageView(Context context, AttributeSet attrs, int defStyle) {
22 | super(context, attrs, defStyle);
23 |
24 | }
25 |
26 | @Override
27 | public boolean canOverStart() {
28 | return true;
29 | }
30 |
31 | @Override
32 | public boolean canOverEnd() {
33 | return true;
34 | }
35 |
36 | @Override
37 | public View getView() {
38 | return this;
39 | }
40 |
41 | @Override
42 | public void scrollAViewBy(int dp) {
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/extras/PullableTextView.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.extras;
2 |
3 |
4 | import android.content.Context;
5 | import android.text.method.ScrollingMovementMethod;
6 | import android.util.AttributeSet;
7 | import android.view.View;
8 | import android.widget.TextView;
9 |
10 | import com.ybao.pullrefreshview.support.impl.OnScrollListener;
11 | import com.ybao.pullrefreshview.support.impl.VPullable;
12 |
13 | public class PullableTextView extends TextView implements VPullable {
14 | private OnScrollListener onScrollListener = null;
15 |
16 | public PullableTextView(Context context) {
17 | super(context);
18 | setMovementMethod(ScrollingMovementMethod.getInstance());
19 | }
20 |
21 | public PullableTextView(Context context, AttributeSet attrs) {
22 | super(context, attrs);
23 | setMovementMethod(ScrollingMovementMethod.getInstance());
24 | }
25 |
26 | public PullableTextView(Context context, AttributeSet attrs, int defStyle) {
27 | super(context, attrs, defStyle);
28 | setMovementMethod(ScrollingMovementMethod.getInstance());
29 | }
30 |
31 | @Override
32 | public boolean canOverStart() {
33 | if (getScrollY() == 0)
34 | return true;
35 | else
36 | return false;
37 | }
38 |
39 | @Override
40 | public boolean canOverEnd() {
41 | if (getScrollY() >= (getLayout().getHeight() - getMeasuredHeight() + getCompoundPaddingBottom() + getCompoundPaddingTop()))
42 | return true;
43 | else
44 | return false;
45 | }
46 |
47 | public void setOnScrollListener(OnScrollListener onScrollListener) {
48 | this.onScrollListener = onScrollListener;
49 | }
50 |
51 | @Override
52 | protected void onScrollChanged(int x, int y, int oldx, int oldy) {
53 | super.onScrollChanged(x, y, oldx, oldy);
54 | if (onScrollListener != null) {
55 | onScrollListener.onScrollChanged(this, x, y, oldx, oldy);
56 | }
57 | }
58 |
59 | @Override
60 | public View getView() {
61 | return this;
62 | }
63 |
64 | @Override
65 | public void scrollAViewBy(int dp) {
66 | int maxScrollY = (getLayout().getHeight() - getMeasuredHeight() + getCompoundPaddingBottom() + getCompoundPaddingTop());
67 | if (getScrollY() + dp >= maxScrollY) {
68 | scrollTo(0, maxScrollY);
69 | } else {
70 | scrollBy(0, dp);
71 | }
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/layout/SliderBox.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.layout;
2 |
3 | import android.annotation.TargetApi;
4 | import android.content.Context;
5 | import android.os.Build;
6 | import android.support.v4.view.NestedScrollingChild;
7 | import android.support.v4.view.NestedScrollingChildHelper;
8 | import android.support.v4.view.NestedScrollingParent;
9 | import android.support.v4.view.NestedScrollingParentHelper;
10 | import android.support.v4.view.ViewCompat;
11 | import android.util.AttributeSet;
12 | import android.view.View;
13 | import android.view.ViewGroup;
14 | import android.widget.FrameLayout;
15 |
16 | import com.ybao.pullrefreshview.support.impl.VPullable;
17 | import com.ybao.pullrefreshview.support.utils.VCanPullUtil;
18 |
19 | /**
20 | * 其他附带控件的父控件
21 | * 处理事件传递
22 | * Created by Ybao on 17/1/16.
23 | */
24 |
25 | public class SliderBox extends FrameLayout implements VPullable, NestedScrollingChild, NestedScrollingParent {
26 | private VPullable mPullable;
27 | private NestedScrollingParentHelper mParentHelper;
28 | private NestedScrollingChildHelper mChildHelper;
29 |
30 | public SliderBox(Context context) {
31 | super(context);
32 | init();
33 | }
34 |
35 | public SliderBox(Context context, AttributeSet attrs) {
36 | super(context, attrs);
37 | init();
38 | }
39 |
40 | public SliderBox(Context context, AttributeSet attrs, int defStyleAttr) {
41 | super(context, attrs, defStyleAttr);
42 | init();
43 | }
44 |
45 | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
46 | public SliderBox(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
47 | super(context, attrs, defStyleAttr, defStyleRes);
48 | init();
49 | }
50 |
51 | private void init() {
52 | mParentHelper = new NestedScrollingParentHelper(this);
53 | mChildHelper = new NestedScrollingChildHelper(this);
54 | }
55 |
56 | @Override
57 | public void addView(View child, int index, ViewGroup.LayoutParams params) {
58 | VPullable pullable;
59 | if (mPullable == null && (pullable = VCanPullUtil.getPullAble(child)) != null) {
60 | mPullable = pullable;
61 | }
62 | super.addView(child, index, params);
63 | }
64 |
65 | @Override
66 | public boolean canOverEnd() {
67 | if (mPullable != null) {
68 | return mPullable.canOverEnd();
69 | }
70 | return false;
71 | }
72 |
73 | @Override
74 | public boolean canOverStart() {
75 | if (mPullable != null) {
76 | return mPullable.canOverStart();
77 | }
78 | return false;
79 | }
80 |
81 | @Override
82 | public View getView() {
83 | return this;
84 | }
85 |
86 | @Override
87 | public void scrollAViewBy(int dp) {
88 | if (mPullable != null) {
89 | mPullable.scrollAViewBy(dp);
90 | }
91 | }
92 |
93 | /*****************************************************************************************/
94 |
95 | @Override
96 | public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
97 | if (!isNestedScrollingEnabled()) {
98 | setNestedScrollingEnabled(true);
99 | }
100 | return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
101 | }
102 |
103 | @Override
104 | public void onNestedScrollAccepted(View child, View target, int nestedScrollAxes) {
105 | mParentHelper.onNestedScrollAccepted(child, target, nestedScrollAxes);
106 | startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL);
107 | }
108 |
109 | @Override
110 | public void onStopNestedScroll(View target) {
111 | stopNestedScroll();
112 | }
113 |
114 | @Override
115 | public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
116 | dispatchNestedScroll(0, dyConsumed, 0, dyUnconsumed, null);
117 | }
118 |
119 | @Override
120 | public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) {
121 | dispatchNestedPreScroll(0, dy, consumed, null);
122 | }
123 |
124 | @Override
125 | public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed) {
126 | return dispatchNestedFling(velocityX, velocityY, consumed);
127 | }
128 |
129 | @Override
130 | public boolean onNestedPreFling(View target, float velocityX, float velocityY) {
131 | return dispatchNestedPreFling(velocityX, velocityY);
132 | }
133 |
134 | @Override
135 | public int getNestedScrollAxes() {
136 | return mParentHelper.getNestedScrollAxes();
137 | }
138 |
139 |
140 | @Override
141 | public void setNestedScrollingEnabled(boolean enabled) {
142 | mChildHelper.setNestedScrollingEnabled(enabled);
143 | }
144 |
145 | @Override
146 | public boolean isNestedScrollingEnabled() {
147 | return mChildHelper.isNestedScrollingEnabled();
148 | }
149 |
150 | @Override
151 | public boolean startNestedScroll(int axes) {
152 | return mChildHelper.startNestedScroll(axes);
153 | }
154 |
155 | @Override
156 | public void stopNestedScroll() {
157 | mChildHelper.stopNestedScroll();
158 | }
159 |
160 | @Override
161 | public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) {
162 | return mChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow);
163 | }
164 |
165 | @Override
166 | public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {
167 | return mChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);
168 | }
169 |
170 | @Override
171 | public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) {
172 | return mChildHelper.dispatchNestedFling(velocityX, velocityY, consumed);
173 | }
174 |
175 | @Override
176 | public boolean dispatchNestedPreFling(float velocityX, float velocityY) {
177 | return mChildHelper.dispatchNestedPreFling(velocityX, velocityY);
178 | }
179 |
180 | @Override
181 | public void onDetachedFromWindow() {
182 | super.onDetachedFromWindow();
183 | mChildHelper.onDetachedFromWindow();
184 | }
185 | }
186 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/anim/AnimGetter.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.support.anim;
2 |
3 | import android.view.animation.AccelerateDecelerateInterpolator;
4 | import android.view.animation.Interpolator;
5 |
6 | import com.nineoldandroids.animation.Animator;
7 | import com.nineoldandroids.animation.AnimatorListenerAdapter;
8 | import com.nineoldandroids.animation.ValueAnimator;
9 |
10 | /**
11 | * Created by ybao on 2017/5/14.
12 | */
13 |
14 | public class AnimGetter implements IAnimGetter {
15 |
16 | @Override
17 | public Animator createMoveToAnim(int startDelay, int duration, Interpolator interpolator, final AnimListener animListener, float... p) {
18 | ValueAnimator animator = ValueAnimator.ofFloat(p);
19 | animator.setStartDelay(startDelay);
20 | animator.setInterpolator(interpolator);
21 | animator.setDuration(duration);
22 | animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
23 | @Override
24 | public void onAnimationUpdate(ValueAnimator animation) {
25 | animListener.onUpdate((float) animation.getAnimatedValue());
26 | }
27 | });
28 | animator.addListener(new AnimatorListenerAdapter() {
29 | @Override
30 | public void onAnimationEnd(Animator animation) {
31 | super.onAnimationEnd(animation);
32 | animListener.onAnimEnd();
33 | }
34 |
35 | @Override
36 | public void onAnimationCancel(Animator animation) {
37 | super.onAnimationCancel(animation);
38 | animListener.onAnimCencel();
39 | }
40 | });
41 | return animator;
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/anim/AnimListener.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.support.anim;
2 |
3 | /**
4 | * Created by ybao on 2017/5/14.
5 | */
6 |
7 | public interface AnimListener {
8 | void onUpdate(float value);
9 |
10 | void onAnimEnd();
11 |
12 | void onAnimCencel();
13 | }
14 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/anim/IAnimGetter.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.support.anim;
2 |
3 | import android.view.animation.Interpolator;
4 |
5 | import com.nineoldandroids.animation.Animator;
6 |
7 | /**
8 | * Created by ybao on 2017/5/14.
9 | */
10 |
11 | public interface IAnimGetter {
12 | Animator createMoveToAnim(int offstart, int duration, Interpolator interpolator, AnimListener animListener, float... p);
13 | }
14 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/anim/interpolator/DecelerateAccelerateInterpolator.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.support.anim.interpolator;
2 |
3 | import android.view.animation.Interpolator;
4 |
5 | /**
6 | * Created by ybao on 2017/5/14.
7 | */
8 |
9 | public class DecelerateAccelerateInterpolator implements Interpolator {
10 |
11 | @Override
12 | public float getInterpolation(float input) {
13 | float result;
14 | if (input <= 0.5) {
15 | result = (float) (Math.sin(Math.PI * input)) / 2;
16 | } else {
17 | result = (float) (2 - Math.sin(Math.PI * input)) / 2;
18 | }
19 | return result;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/impl/HPullable.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2015 Pengyuan-Jiang
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | *
16 | * Author:Ybao on 2015/11/3 0:51
17 | *
18 | * QQ: 392579823
19 | *
20 | * Email:392579823@qq.com
21 | */
22 | package com.ybao.pullrefreshview.support.impl;
23 |
24 | public interface HPullable extends Pullable {
25 | }
26 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/impl/Loadable.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2015 Pengyuan-Jiang
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | *
16 | * Author:Ybao on 2015/11/3 17:44
17 | *
18 | * QQ: 392579823
19 | *
20 | * Email:392579823@qq.com
21 | */
22 | package com.ybao.pullrefreshview.support.impl;
23 |
24 | import com.ybao.pullrefreshview.layout.PullRefreshLayout;
25 |
26 | public interface Loadable {
27 |
28 | void setPullRefreshLayout(PullRefreshLayout refreshLayout);
29 |
30 | boolean onScroll(float y);
31 |
32 | void onScrollChange(int state);
33 |
34 | boolean onStartrRelease(float offsetTop);
35 |
36 | void startLoad();
37 |
38 | void stopLoad();
39 | }
40 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/impl/OnEndListener.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.support.impl;
2 |
3 | /**
4 | * Created by ybao on 2017/5/16.
5 | */
6 |
7 | public interface OnEndListener {
8 | void onEnd();
9 | }
10 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/impl/OnScrollListener.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.support.impl;
2 |
3 | import android.view.View;
4 |
5 | /**
6 | * Created by Ybao on 16/7/24.
7 | */
8 | public interface OnScrollListener {
9 | void onScrollChanged(View scrollView, int x, int y, int oldx, int oldy);
10 | }
11 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/impl/Pullable.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2015 Pengyuan-Jiang
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | *
16 | * Author:Ybao on 2015/11/3 0:51
17 | *
18 | * QQ: 392579823
19 | *
20 | * Email:392579823@qq.com
21 | */
22 | package com.ybao.pullrefreshview.support.impl;
23 |
24 | import android.view.View;
25 |
26 | public interface Pullable {
27 |
28 | boolean canOverStart();
29 |
30 | boolean canOverEnd();
31 |
32 | View getView();
33 |
34 | void scrollAViewBy(int dp);
35 | }
36 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/impl/Refreshable.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2015 Pengyuan-Jiang
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | *
16 | * Author:Ybao on 2015/11/3 17:44
17 | *
18 | * QQ: 392579823
19 | *
20 | * Email:392579823@qq.com
21 | */
22 | package com.ybao.pullrefreshview.support.impl;
23 |
24 | import com.ybao.pullrefreshview.layout.PullRefreshLayout;
25 |
26 | public interface Refreshable {
27 |
28 | void setPullRefreshLayout(PullRefreshLayout refreshLayout);
29 |
30 | boolean onScroll(float y);
31 |
32 | void onScrollChange(int state);
33 |
34 | boolean onStartrRelease(float offsetTop);
35 |
36 | void startRefresh();
37 |
38 | void stopRefresh();
39 | }
40 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/impl/VPullable.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright 2015 Pengyuan-Jiang
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | *
16 | * Author:Ybao on 2015/11/3 0:51
17 | *
18 | * QQ: 392579823
19 | *
20 | * Email:392579823@qq.com
21 | */
22 | package com.ybao.pullrefreshview.support.impl;
23 |
24 | public interface VPullable extends Pullable {
25 | }
26 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/overscroll/OverScrollController.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.support.overscroll;
2 |
3 | import android.os.Handler;
4 | import android.view.animation.DecelerateInterpolator;
5 |
6 | import com.ybao.pullrefreshview.layout.FlingLayout;
7 | import com.ybao.pullrefreshview.support.anim.interpolator.DecelerateAccelerateInterpolator;
8 |
9 | /**
10 | * Created by ybao on 2017/5/14.
11 | */
12 |
13 | public class OverScrollController {
14 | Handler handler = new Handler();
15 | ScrollChangedListener scrollChangedListener = new ScrollChangedListener();
16 | protected FlingLayout.FlingLayoutContext c;
17 |
18 | public OverScrollController(FlingLayout.FlingLayoutContext flingLayoutContext) {
19 | this.c = flingLayoutContext;
20 | }
21 |
22 | public void addOverScrollListener() {
23 | removeOverScrollListener();
24 | scrollChangedListener.reset();
25 | handler.post(scrollChangedListener);
26 | }
27 |
28 |
29 | public void removeOverScrollListener() {
30 | handler.removeCallbacks(scrollChangedListener);
31 | }
32 |
33 | class ScrollChangedListener implements Runnable {
34 | int times = 0;
35 |
36 | public void reset() {
37 | times = 0;
38 | }
39 |
40 | @Override
41 | public void run() {
42 | times++;
43 | if (c.canOverStart()) {
44 | float oh = (float) Math.sqrt(c.getVelocity() * 3 / times);
45 | oh = Math.min(c.getMaxOverScrollDist(), oh);
46 | if (oh > c.getTouchSlop()) {
47 | float moveP = c.getMoveP();
48 | startBounce(moveP, moveP + oh);
49 | } else {
50 | c.setScrollState(FlingLayout.SCROLL_STATE_IDLE);
51 | }
52 | return;
53 | } else if (c.canOverEnd()) {
54 | float oh = (float) -Math.sqrt(-c.getVelocity() * 3 / times);
55 | oh = -Math.min(c.getMaxOverScrollDist(), -oh);
56 | if (-oh > c.getTouchSlop()) {
57 | float moveP = c.getMoveP();
58 | startBounce(moveP, moveP + oh);
59 | } else {
60 | c.setScrollState(FlingLayout.SCROLL_STATE_IDLE);
61 | }
62 | return;
63 | }
64 | if (times > 60) {
65 | c.setScrollState(FlingLayout.SCROLL_STATE_IDLE);
66 | } else {
67 | c.setScrollState(FlingLayout.SCROLL_STATE_FLING);
68 | handler.postDelayed(this, 16);
69 | }
70 | }
71 | }
72 |
73 | public int startBounce(float startP, float endP) {
74 | int duration = (int) Math.abs(endP - startP);
75 | int time = Math.min(c.getMaxDuration() * 2, duration);
76 | time = Math.max(c.getMinDuration(), time);
77 | c.startAnim(0, FlingLayout.SCROLL_STATE_OVER_SCROLL, time, new DecelerateAccelerateInterpolator(), null, startP, endP, startP);
78 | return time;
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/resolver/IEventResolver.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.support.resolver;
2 |
3 | import android.support.v4.view.NestedScrollingChild;
4 | import android.support.v4.view.NestedScrollingParent;
5 | import android.view.MotionEvent;
6 | import android.view.View;
7 |
8 | import com.ybao.pullrefreshview.support.impl.Pullable;
9 |
10 | /**
11 | * Created by ybao on 2017/5/14.
12 | */
13 |
14 | public interface IEventResolver extends NestedScrollingChild, NestedScrollingParent {
15 |
16 | Pullable getPullAble(View view);
17 |
18 | Pullable getPullAble(Pullable pullable);
19 |
20 | boolean isScrolling();
21 |
22 | void setViewTranslationP(View view, float value);
23 |
24 | boolean dispatchTouchEvent(MotionEvent ev);
25 |
26 | boolean interceptTouchEvent(MotionEvent ev);
27 |
28 | boolean touchEvent(MotionEvent ev);
29 |
30 | float getVelocity();
31 |
32 | void onDetachedFromWindow();
33 | }
34 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/type/LayoutType.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.support.type;
2 |
3 | /**
4 | * Created by Ybao on 16/7/26.
5 | */
6 | public class LayoutType {
7 | public final static int LAYOUT_NORMAL = 0x00;
8 | public final static int LAYOUT_DRAWER = 0x01;
9 | public final static int LAYOUT_SCROLLER = 0x10;
10 | public final static int LAYOUT_NOT_MOVE= 0x11;
11 | }
12 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/utils/HCanPullUtil.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.support.utils;
2 |
3 | import android.support.v4.widget.NestedScrollView;
4 | import android.support.v7.widget.LinearLayoutManager;
5 | import android.support.v7.widget.RecyclerView;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 | import android.widget.ScrollView;
9 |
10 | import com.ybao.pullrefreshview.support.impl.HPullable;
11 |
12 | /**
13 | * Created by ybao on 16/3/7.
14 | */
15 | public class HCanPullUtil {
16 |
17 | public static HPullable getPullAble(View view) {
18 | if (view == null) {
19 | return null;
20 | }
21 | view.setOverScrollMode(View.OVER_SCROLL_NEVER);
22 | if (view instanceof HPullable) {
23 | return (HPullable) view;
24 | } else if (view instanceof ScrollView || view instanceof NestedScrollView) {
25 | return new ScrollViewCanPull((ViewGroup) view);
26 | } else if (view instanceof RecyclerView) {
27 | return new RecyclerViewCanPull((RecyclerView) view);
28 | }
29 | return null;
30 | }
31 |
32 | private static class ScrollViewCanPull implements HPullable {
33 | public ScrollViewCanPull(ViewGroup scrollView) {
34 | this.scrollView = scrollView;
35 | }
36 |
37 | ViewGroup scrollView;
38 |
39 | @Override
40 | public boolean canOverStart() {
41 | if (scrollView.getScrollX() <= 0)
42 | return true;
43 | else
44 | return false;
45 | }
46 |
47 | @Override
48 | public boolean canOverEnd() {
49 | if (scrollView.getChildCount() == 0) {
50 | return true;
51 | }
52 | if (scrollView.getScrollX() >= (scrollView.getChildAt(0).getWidth() - scrollView.getMeasuredWidth()))
53 | return true;
54 | else
55 | return false;
56 | }
57 |
58 | @Override
59 | public View getView() {
60 | return scrollView;
61 | }
62 |
63 | @Override
64 | public void scrollAViewBy(int dp) {
65 | if (scrollView.getChildCount() != 0) {
66 | float maxScrollY = scrollView.getChildAt(0).getWidth() - scrollView.getMeasuredWidth();
67 | if (scrollView.getScrollX() + dp >= maxScrollY) {
68 | scrollView.scrollTo((int) maxScrollY, 0);
69 | } else {
70 | scrollView.scrollBy(dp, 0);
71 | }
72 | }
73 | }
74 | }
75 |
76 |
77 | private static class RecyclerViewCanPull implements HPullable {
78 | public RecyclerViewCanPull(RecyclerView recyclerView) {
79 | this.recyclerView = recyclerView;
80 | }
81 |
82 | RecyclerView recyclerView;
83 | LinearLayoutManager layoutManager;
84 |
85 | private void initLayoutManager() {
86 | if (layoutManager == null) {
87 | RecyclerView.LayoutManager layout = recyclerView.getLayoutManager();
88 | if (layout != null && layout instanceof LinearLayoutManager) {
89 | layoutManager = (LinearLayoutManager) layout;
90 | }
91 | }
92 | }
93 |
94 | @Override
95 | public boolean canOverStart() {
96 | initLayoutManager();
97 | if (layoutManager != null) {
98 | if (layoutManager.getItemCount() == 0) {
99 | return true;
100 | } else if (layoutManager.findFirstVisibleItemPosition() == 0 && recyclerView.getChildAt(0).getLeft() >= recyclerView.getPaddingLeft()) {
101 | return true;
102 | }
103 | }
104 | return false;
105 | }
106 |
107 |
108 | @Override
109 | public boolean canOverEnd() {
110 | initLayoutManager();
111 | if (layoutManager != null) {
112 | int count = layoutManager.getItemCount();
113 | if (count == 0) {
114 | return true;
115 | } else if (layoutManager.findLastCompletelyVisibleItemPosition() == count - 1) {
116 | return true;
117 | }
118 | }
119 | return false;
120 | }
121 |
122 | @Override
123 | public View getView() {
124 | return recyclerView;
125 | }
126 |
127 | @Override
128 | public void scrollAViewBy(int dp) {
129 | recyclerView.scrollBy(dp, 0);
130 | }
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/utils/Utils.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.support.utils;
2 |
3 | import android.app.Activity;
4 | import android.content.Context;
5 | import android.util.DisplayMetrics;
6 | import android.view.Display;
7 | import android.view.WindowManager;
8 |
9 | /**
10 | * Created by Ybao on 16/7/24.
11 | */
12 | public class Utils {
13 | public static int getScreenWidth(Context context) {
14 | WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
15 | Display mDisplay = windowManager.getDefaultDisplay();
16 | DisplayMetrics metrics = new DisplayMetrics();
17 | mDisplay.getMetrics(metrics);
18 | return metrics.widthPixels;
19 | }
20 |
21 | /**
22 | * 屏幕分辨率高
23 | **/
24 | public static int getScreenHeight(Context context) {
25 | WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
26 | Display mDisplay = windowManager.getDefaultDisplay();
27 | DisplayMetrics metrics = new DisplayMetrics();
28 | mDisplay.getMetrics(metrics);
29 | return metrics.heightPixels;
30 | }
31 |
32 | public static int dip2px(Context context, float dipValue) {
33 | final float scale = context.getResources().getDisplayMetrics().density;
34 | return (int) (dipValue * scale + 0.5f);
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/utils/ViewScrollUtil.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.support.utils;
2 |
3 | import android.support.v7.widget.GridLayoutManager;
4 | import android.support.v7.widget.LinearLayoutManager;
5 | import android.support.v7.widget.RecyclerView;
6 | import android.util.Log;
7 | import android.view.View;
8 | import android.widget.AbsListView;
9 |
10 | /**
11 | * Created by ybao on 16/3/9.
12 | */
13 | public class ViewScrollUtil {
14 | public static ScrollGeter getScrollGeter(View view) {
15 | if (view == null) {
16 | return null;
17 | }
18 | if (view instanceof ScrollGeter) {
19 | return (ScrollGeter) view;
20 | } else if (view instanceof AbsListView) {
21 | return new AbsListViewScrollGeter((AbsListView) view);
22 | } else if (view instanceof RecyclerView) {
23 | return new RecyclerViewScrollGeter((RecyclerView) view);
24 | }
25 | return null;
26 | }
27 |
28 | private static class AbsListViewScrollGeter implements ScrollGeter {
29 | AbsListView absListView;
30 |
31 | public AbsListViewScrollGeter(AbsListView absListView) {
32 | this.absListView = absListView;
33 | }
34 |
35 | @Override
36 | public int getScrollX() {
37 | return 0;
38 | }
39 |
40 | @Override
41 | public int getScrollY() {
42 | int firstVisiblePosition = absListView.getFirstVisiblePosition();
43 | View c = absListView.getChildAt(0);
44 | if (c == null) {
45 | return 0;
46 | }
47 | int top = c.getTop() - absListView.getPaddingTop();
48 | return -top + firstVisiblePosition * c.getHeight();
49 | }
50 | }
51 |
52 | private static class RecyclerViewScrollGeter implements ScrollGeter {
53 | RecyclerView recyclerView;
54 | LinearLayoutManager layoutManager;
55 |
56 | public RecyclerViewScrollGeter(RecyclerView recyclerView) {
57 | this.recyclerView = recyclerView;
58 | RecyclerView.LayoutManager layout = recyclerView.getLayoutManager();
59 | if (layout != null && layout instanceof LinearLayoutManager) {
60 | layoutManager = (LinearLayoutManager) layout;
61 | } else {
62 | Log.w("RecyclerViewScrollGeter", "LayoutManager is null or Not is LinearLayoutManager");
63 | }
64 | }
65 |
66 | @Override
67 | public int getScrollX() {
68 | return 0;
69 | }
70 |
71 | @Override
72 | public int getScrollY() {
73 | if (layoutManager != null) {
74 | int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
75 | View c = layoutManager.findViewByPosition(firstVisiblePosition);
76 | if (c == null) {
77 | return 0;
78 | }
79 | int top = c.getTop() - recyclerView.getPaddingTop();
80 | int n = firstVisiblePosition;
81 | if (layoutManager instanceof GridLayoutManager) {
82 | int spanCount = ((GridLayoutManager) layoutManager).getSpanCount();
83 | n = n / spanCount;
84 | }
85 | return -top + n * c.getHeight();
86 | }
87 | return 0;
88 | }
89 | }
90 |
91 | public interface ScrollGeter {
92 | int getScrollX();
93 |
94 | int getScrollY();
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/libs/src/main/java/com/ybao/pullrefreshview/support/view/ObservableScrollView.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.support.view;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.widget.ScrollView;
6 |
7 | import com.ybao.pullrefreshview.support.impl.OnScrollListener;
8 |
9 | /**
10 | *
11 | * Created by Y-bao on 2016/3/21 17:48.
12 | */
13 | public class ObservableScrollView extends ScrollView {
14 |
15 | private OnScrollListener onScrollListener = null;
16 |
17 | public ObservableScrollView(Context context) {
18 | super(context);
19 | }
20 |
21 | public ObservableScrollView(Context context, AttributeSet attrs,
22 | int defStyle) {
23 | super(context, attrs, defStyle);
24 | }
25 |
26 | public ObservableScrollView(Context context, AttributeSet attrs) {
27 | super(context, attrs);
28 | }
29 |
30 | public void setOnScrollListener(OnScrollListener onScrollListener) {
31 | this.onScrollListener = onScrollListener;
32 | }
33 |
34 | @Override
35 | protected void onScrollChanged(int x, int y, int oldx, int oldy) {
36 | super.onScrollChanged(x, y, oldx, oldy);
37 | if (onScrollListener != null) {
38 | onScrollListener.onScrollChanged(this, x, y, oldx, oldy);
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/libs/src/main/res/values/attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/libs/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | libs
3 |
4 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':simple', ':libs', ':standardadapter'
2 |
--------------------------------------------------------------------------------
/simple/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/simple/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion ANDROID_BUILD_SDK_VERSION as int
5 | buildToolsVersion ANDROID_BUILD_TOOLS_VERSION
6 |
7 | defaultConfig {
8 | applicationId 'com.ybao.pullrefreshview.simple'
9 | minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION as int
10 | targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION as int
11 | versionCode VERSION_CODE as int
12 | versionName VERSION_NAME
13 | multiDexEnabled true
14 | }
15 | buildTypes {
16 | release {
17 | minifyEnabled false
18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
19 | }
20 | }
21 | productFlavors {
22 | }
23 | }
24 |
25 | dependencies {
26 | compile 'com.nineoldandroids:library:2.4.0'
27 | compile project(':libs')
28 | compile 'com.android.support:support-v4:23.2.1'
29 | compile 'com.android.support:appcompat-v7:23.2.1'
30 | compile 'com.android.support:design:23.2.1'
31 | compile 'com.android.support:recyclerview-v7:23.2.1'
32 | }
33 |
--------------------------------------------------------------------------------
/simple/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 D:\CodeTools\SDK\AndroidWindows/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 |
--------------------------------------------------------------------------------
/simple/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
23 |
26 |
30 |
33 |
36 |
39 |
42 |
45 |
48 |
51 |
54 |
57 |
60 |
63 |
66 |
69 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/simple/src/main/ic_launcher-web.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/simple/src/main/ic_launcher-web.png
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/activities/AllViewActivity.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.activities;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.v7.app.AppCompatActivity;
6 | import android.view.View;
7 |
8 | import com.ybao.pullrefreshview.simple.R;
9 | import com.ybao.pullrefreshview.simple.activities.ex.RecyclerViewActivity;
10 | import com.ybao.pullrefreshview.simple.activities.ex.ScrollViewActivity;
11 | import com.ybao.pullrefreshview.simple.activities.ex.TextViewActivity;
12 |
13 |
14 | /**
15 | * Created by Ybao on 2015/11/3 0003.
16 | */
17 | public class AllViewActivity extends AppCompatActivity {
18 |
19 | @Override
20 | protected void onCreate(Bundle savedInstanceState) {
21 | super.onCreate(savedInstanceState);
22 | setContentView(R.layout.activity_all_view);
23 | findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
24 | @Override
25 | public void onClick(View v) {
26 | startActivity(new Intent(AllViewActivity.this, ScrollViewActivity.class));
27 | }
28 | });
29 | findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
30 | @Override
31 | public void onClick(View v) {
32 | startActivity(new Intent(AllViewActivity.this, TextViewActivity.class));
33 | }
34 | });
35 | findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
36 | @Override
37 | public void onClick(View v) {
38 | startActivity(new Intent(AllViewActivity.this, RecyclerViewActivity.class));
39 | }
40 | });
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ExpandActivity.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.activities;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.v7.app.AppCompatActivity;
6 | import android.view.View;
7 |
8 | import com.ybao.pullrefreshview.simple.R;
9 | import com.ybao.pullrefreshview.simple.activities.ep.DrawerEpActivity;
10 | import com.ybao.pullrefreshview.simple.activities.ep.NormolEpActivity;
11 | import com.ybao.pullrefreshview.simple.activities.ep.RG2Activity;
12 | import com.ybao.pullrefreshview.simple.activities.ep.RGActivity;
13 | import com.ybao.pullrefreshview.simple.activities.ep.ScrollerEpActivity;
14 |
15 |
16 | /**
17 | * Created by Ybao on 2015/11/3 0003.
18 | */
19 | public class ExpandActivity extends AppCompatActivity {
20 |
21 |
22 | @Override
23 | protected void onCreate(Bundle savedInstanceState) {
24 | super.onCreate(savedInstanceState);
25 | setContentView(R.layout.activity_expand);
26 | findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
27 | @Override
28 | public void onClick(View v) {
29 | startActivity(new Intent(ExpandActivity.this, NormolEpActivity.class));
30 | }
31 | });
32 | findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
33 | @Override
34 | public void onClick(View v) {
35 | startActivity(new Intent(ExpandActivity.this, DrawerEpActivity.class));
36 | }
37 | });
38 | findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
39 | @Override
40 | public void onClick(View v) {
41 | startActivity(new Intent(ExpandActivity.this, ScrollerEpActivity.class));
42 | }
43 | });
44 | findViewById(R.id.button4).setOnClickListener(new View.OnClickListener() {
45 | @Override
46 | public void onClick(View v) {
47 | startActivity(new Intent(ExpandActivity.this, RGActivity.class));
48 | }
49 | });
50 | findViewById(R.id.button5).setOnClickListener(new View.OnClickListener() {
51 | @Override
52 | public void onClick(View v) {
53 | startActivity(new Intent(ExpandActivity.this, RG2Activity.class));
54 | }
55 | });
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/activities/FlingActivity.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.activities;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 | import android.widget.ArrayAdapter;
6 | import android.widget.ListView;
7 |
8 | import com.ybao.pullrefreshview.simple.R;
9 |
10 | import java.util.ArrayList;
11 | import java.util.List;
12 |
13 | /**
14 | * Created by Ybao on 2015/11/3 0003.
15 | */
16 | public class FlingActivity extends AppCompatActivity {
17 |
18 | ListView listView;
19 |
20 | ArrayAdapter adapter;
21 |
22 | List list;
23 |
24 | @Override
25 | protected void onCreate(Bundle savedInstanceState) {
26 | super.onCreate(savedInstanceState);
27 | setContentView(R.layout.activity_fling);
28 | listView = (ListView) findViewById(R.id.list);
29 | list = getData(15);
30 | adapter = new ArrayAdapter(this, R.layout.item, list);
31 |
32 | listView.setAdapter(adapter);
33 | }
34 |
35 |
36 | int page = 1;
37 |
38 | private List getData(int n) {
39 | List datas = new ArrayList<>(n);
40 | for (int i = 0; i < n; i++) {
41 | datas.add("第" + page + "页,第" + i + "条");
42 | }
43 | return datas;
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/activities/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.activities;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.v4.view.NestedScrollingParent;
6 | import android.support.v7.app.AppCompatActivity;
7 | import android.view.View;
8 |
9 | import com.ybao.pullrefreshview.simple.R;
10 |
11 |
12 | /**
13 | * Created by Ybao on 2015/11/3 0003.
14 | */
15 | public class MainActivity extends AppCompatActivity {
16 |
17 | @Override
18 | protected void onCreate(Bundle savedInstanceState) {
19 | super.onCreate(savedInstanceState);
20 | setContentView(R.layout.activity_main);
21 | findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
22 | @Override
23 | public void onClick(View v) {
24 | startActivity(new Intent(MainActivity.this, FlingActivity.class));
25 | }
26 | });
27 | findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
28 | @Override
29 | public void onClick(View v) {
30 | startActivity(new Intent(MainActivity.this, NormalRefreshActivity.class));
31 | }
32 | });
33 | findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
34 | @Override
35 | public void onClick(View v) {
36 | startActivity(new Intent(MainActivity.this, ExpandActivity.class));
37 | }
38 | });
39 | findViewById(R.id.button4).setOnClickListener(new View.OnClickListener() {
40 | @Override
41 | public void onClick(View v) {
42 | startActivity(new Intent(MainActivity.this, AllViewActivity.class));
43 | }
44 | });
45 | findViewById(R.id.button5).setOnClickListener(new View.OnClickListener() {
46 | @Override
47 | public void onClick(View v) {
48 | startActivity(new Intent(MainActivity.this, OtherActivity.class));
49 | }
50 | });
51 | findViewById(R.id.button6).setOnClickListener(new View.OnClickListener() {
52 | @Override
53 | public void onClick(View v) {
54 | startActivity(new Intent(MainActivity.this, NestedScrollingActivity.class));
55 | }
56 | });
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/activities/NestedScrollingActivity.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.activities;
2 |
3 | import android.os.Bundle;
4 | import android.support.v4.app.Fragment;
5 | import android.support.v4.app.FragmentManager;
6 | import android.support.v4.app.FragmentPagerAdapter;
7 | import android.support.v4.view.ViewPager;
8 | import android.support.v7.app.AppCompatActivity;
9 | import android.support.v7.widget.Toolbar;
10 |
11 | import com.ybao.pullrefreshview.simple.R;
12 | import com.ybao.pullrefreshview.simple.fragment.Fragment0;
13 | import com.ybao.pullrefreshview.simple.fragment.Fragment2;
14 | import com.ybao.pullrefreshview.simple.fragment.Fragment3;
15 | import com.ybao.pullrefreshview.simple.fragment.Fragment1;
16 | import com.ybao.pullrefreshview.simple.fragment.Fragment4;
17 |
18 | import java.util.ArrayList;
19 |
20 | /**
21 | * Created by Ybao on 2015/11/3 0003.
22 | */
23 | public class NestedScrollingActivity extends AppCompatActivity {
24 | ViewPager viewPager;
25 |
26 | @Override
27 | protected void onCreate(Bundle savedInstanceState) {
28 | super.onCreate(savedInstanceState);
29 | setContentView(R.layout.activity_nestedscrolling);
30 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
31 | setSupportActionBar(toolbar);
32 | ArrayList fragments = new ArrayList<>();
33 | fragments.add(new Fragment0());
34 | fragments.add(new Fragment1());
35 | fragments.add(new Fragment2());
36 | fragments.add(new Fragment3());
37 | fragments.add(new Fragment4());
38 | MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), fragments);
39 | viewPager = (ViewPager) findViewById(R.id.viewpager);
40 | viewPager.setOffscreenPageLimit(2);
41 | viewPager.setAdapter(myFragmentPagerAdapter);
42 | }
43 |
44 | public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
45 | ArrayList list;
46 | ArrayList strings;
47 |
48 | public MyFragmentPagerAdapter(FragmentManager fm, ArrayList list) {
49 | super(fm);
50 | this.list = list;
51 | strings = new ArrayList<>();
52 | strings.add("ListView");
53 | strings.add("RecyclerView");
54 | strings.add("ScrollView");
55 | strings.add("NestedScrollView");
56 | strings.add("WebView");
57 | }
58 |
59 |
60 | @Override
61 | public int getCount() {
62 | return list.size();
63 | }
64 |
65 | @Override
66 | public Fragment getItem(int arg0) {
67 | return list.get(arg0);
68 | }
69 |
70 | @Override
71 | public CharSequence getPageTitle(int position) {
72 | if (position >= strings.size()) {
73 | return "第" + position + "个";
74 | }
75 | return strings.get(position);
76 | }
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/activities/NormalRefreshActivity.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.activities;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 | import android.support.v7.widget.Toolbar;
6 | import android.util.Log;
7 | import android.util.SparseArray;
8 | import android.view.View;
9 | import android.widget.AbsListView;
10 | import android.widget.ArrayAdapter;
11 | import android.widget.ListView;
12 |
13 | import com.ybao.pullrefreshview.layout.BaseFooterView;
14 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
15 | import com.ybao.pullrefreshview.layout.PullRefreshLayout;
16 | import com.ybao.pullrefreshview.simple.R;
17 | import com.ybao.pullrefreshview.simple.view.EndFooterView;
18 | import com.ybao.pullrefreshview.simple.view.NormalFooterView;
19 |
20 | import java.util.ArrayList;
21 | import java.util.List;
22 |
23 | /**
24 | * Created by Ybao on 2015/11/3 0003.
25 | */
26 | public class NormalRefreshActivity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener {
27 |
28 | ListView listView;
29 | BaseHeaderView headerView;
30 | BaseFooterView footerView;
31 |
32 | ArrayAdapter adapter;
33 |
34 | List list = new ArrayList();
35 |
36 | @Override
37 | protected void onCreate(Bundle savedInstanceState) {
38 | super.onCreate(savedInstanceState);
39 | setContentView(R.layout.activity_normal_refresh);
40 |
41 | listView = (ListView) findViewById(R.id.list);
42 | headerView = (BaseHeaderView) findViewById(R.id.header);
43 |
44 | list = getData(15);
45 |
46 | adapter = new ArrayAdapter(this, R.layout.item, list);
47 |
48 | footerView = new EndFooterView(this);
49 |
50 | listView.setAdapter(adapter);
51 | listView.addFooterView(footerView);
52 |
53 | ((PullRefreshLayout) findViewById(R.id.root)).setFooter(footerView);
54 |
55 | headerView.setOnRefreshListener(this);
56 | footerView.setOnLoadListener(this);
57 | }
58 |
59 | @Override
60 | public void onRefresh(BaseHeaderView baseHeaderView) {
61 | baseHeaderView.postDelayed(new Runnable() {
62 | @Override
63 | public void run() {
64 | page = 1;
65 | List datas = getData(5);
66 | list.clear();
67 | list.addAll(datas);
68 | adapter.notifyDataSetChanged();
69 | headerView.stopRefresh();
70 | }
71 | }, 3000);
72 | }
73 |
74 | @Override
75 | public void onLoad(BaseFooterView baseFooterView) {
76 | baseFooterView.postDelayed(new Runnable() {
77 | @Override
78 | public void run() {
79 | page++;
80 | List datas = getData(5);
81 | list.addAll(datas);
82 | adapter.notifyDataSetChanged();
83 | footerView.stopLoad();
84 | }
85 | }, 3000);
86 | }
87 |
88 |
89 | int page = 1;
90 |
91 | private List getData(int n) {
92 | List datas = new ArrayList<>(n);
93 | for (int i = 0; i < n; i++) {
94 | datas.add("第" + page + "页,第" + i + "条");
95 | }
96 | return datas;
97 | }
98 | }
99 |
100 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/activities/OtherActivity.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.activities;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.v7.app.AppCompatActivity;
6 | import android.view.View;
7 |
8 | import com.ybao.pullrefreshview.simple.R;
9 | import com.ybao.pullrefreshview.simple.activities.other.HeaderActivity;
10 | import com.ybao.pullrefreshview.simple.activities.other.MIFlingActivity;
11 |
12 |
13 | /**
14 | * Created by Ybao on 2015/11/3 0003.
15 | */
16 | public class OtherActivity extends AppCompatActivity {
17 |
18 | @Override
19 | protected void onCreate(Bundle savedInstanceState) {
20 | super.onCreate(savedInstanceState);
21 | setContentView(R.layout.activity_other);
22 | findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
23 | @Override
24 | public void onClick(View v) {
25 | startActivity(new Intent(OtherActivity.this, MIFlingActivity.class));
26 | }
27 | });
28 | findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
29 | @Override
30 | public void onClick(View v) {
31 | startActivity(new Intent(OtherActivity.this, HeaderActivity.class));
32 | }
33 | });
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ep/DrawerEpActivity.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.activities.ep;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 | import android.widget.ArrayAdapter;
6 | import android.widget.ListView;
7 |
8 | import com.ybao.pullrefreshview.layout.BaseFooterView;
9 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
10 | import com.ybao.pullrefreshview.simple.R;
11 |
12 | import java.util.ArrayList;
13 | import java.util.List;
14 |
15 | /**
16 | * Created by Ybao on 2015/11/3 0003.
17 | */
18 | public class DrawerEpActivity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener {
19 |
20 | ListView listView;
21 | BaseHeaderView headerView;
22 | BaseFooterView footerView;
23 |
24 | ArrayAdapter adapter;
25 |
26 | List list;
27 |
28 | @Override
29 | protected void onCreate(Bundle savedInstanceState) {
30 | super.onCreate(savedInstanceState);
31 | setContentView(R.layout.activity_drawer_ep);
32 |
33 | listView = (ListView) findViewById(R.id.list);
34 | headerView = (BaseHeaderView) findViewById(R.id.header);
35 | footerView = (BaseFooterView) findViewById(R.id.footer);
36 |
37 | list = getData(15);
38 |
39 | adapter = new ArrayAdapter(this, R.layout.item, list);
40 |
41 |
42 | listView.setAdapter(adapter);
43 |
44 | headerView.setOnRefreshListener(this);
45 | footerView.setOnLoadListener(this);
46 | }
47 |
48 | @Override
49 | public void onRefresh(BaseHeaderView baseHeaderView) {
50 | baseHeaderView.postDelayed(new Runnable() {
51 | @Override
52 | public void run() {
53 | page = 1;
54 | List datas = getData(5);
55 | list.clear();
56 | list.addAll(datas);
57 | adapter.notifyDataSetChanged();
58 | headerView.stopRefresh();
59 | }
60 | }, 3000);
61 | }
62 |
63 | @Override
64 | public void onLoad(BaseFooterView baseFooterView) {
65 | baseFooterView.postDelayed(new Runnable() {
66 | @Override
67 | public void run() {
68 | page++;
69 | List datas = getData(5);
70 | list.addAll(datas);
71 | adapter.notifyDataSetChanged();
72 | footerView.stopLoad();
73 | }
74 | }, 3000);
75 | }
76 |
77 |
78 | int page = 1;
79 |
80 | private List getData(int n) {
81 | List datas = new ArrayList<>(n);
82 | for (int i = 0; i < n; i++) {
83 | datas.add("第" + page + "页,第" + i + "条");
84 | }
85 | return datas;
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ep/NormolEpActivity.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.activities.ep;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 | import android.widget.ArrayAdapter;
6 | import android.widget.ListView;
7 |
8 | import com.ybao.pullrefreshview.layout.BaseFooterView;
9 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
10 | import com.ybao.pullrefreshview.simple.R;
11 |
12 | import java.util.ArrayList;
13 | import java.util.List;
14 |
15 | /**
16 | * Created by Ybao on 2015/11/3 0003.
17 | */
18 | public class NormolEpActivity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener {
19 |
20 | ListView listView;
21 | BaseHeaderView headerView;
22 | BaseFooterView footerView;
23 |
24 | ArrayAdapter adapter;
25 |
26 | List list = new ArrayList();
27 |
28 | @Override
29 | protected void onCreate(Bundle savedInstanceState) {
30 | super.onCreate(savedInstanceState);
31 | setContentView(R.layout.activity_normol_ep);
32 |
33 | listView = (ListView) findViewById(R.id.list);
34 | headerView = (BaseHeaderView) findViewById(R.id.header);
35 | footerView = (BaseFooterView) findViewById(R.id.footer);
36 |
37 | list = getData(15);
38 |
39 | adapter = new ArrayAdapter(this, R.layout.item, list);
40 |
41 |
42 | listView.setAdapter(adapter);
43 |
44 | headerView.setOnRefreshListener(this);
45 | footerView.setOnLoadListener(this);
46 | }
47 |
48 | @Override
49 | public void onRefresh(BaseHeaderView baseHeaderView) {
50 | baseHeaderView.postDelayed(new Runnable() {
51 | @Override
52 | public void run() {
53 | page = 1;
54 | List datas = getData(5);
55 | list.clear();
56 | list.addAll(datas);
57 | adapter.notifyDataSetChanged();
58 | headerView.stopRefresh();
59 | }
60 | }, 3000);
61 | }
62 |
63 | @Override
64 | public void onLoad(BaseFooterView baseFooterView) {
65 | baseFooterView.postDelayed(new Runnable() {
66 | @Override
67 | public void run() {
68 | page++;
69 | List datas = getData(5);
70 | list.addAll(datas);
71 | adapter.notifyDataSetChanged();
72 | footerView.stopLoad();
73 | }
74 | }, 3000);
75 | }
76 |
77 |
78 | int page = 1;
79 |
80 | private List getData(int n) {
81 | List datas = new ArrayList<>(n);
82 | for (int i = 0; i < n; i++) {
83 | datas.add("第" + page + "页,第" + i + "条");
84 | }
85 | return datas;
86 | }
87 | }
88 |
89 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ep/RG2Activity.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.activities.ep;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 | import android.widget.ArrayAdapter;
6 | import android.widget.ListView;
7 |
8 | import com.ybao.pullrefreshview.layout.BaseFooterView;
9 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
10 | import com.ybao.pullrefreshview.simple.R;
11 |
12 | import java.util.ArrayList;
13 | import java.util.List;
14 |
15 | /**
16 | * Created by Ybao on 2015/11/3 0003.
17 | */
18 | public class RG2Activity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener {
19 |
20 | ListView listView;
21 | BaseHeaderView headerView;
22 | BaseFooterView footerView;
23 |
24 | ArrayAdapter adapter;
25 |
26 | List list = new ArrayList();
27 |
28 | @Override
29 | protected void onCreate(Bundle savedInstanceState) {
30 | super.onCreate(savedInstanceState);
31 | setContentView(R.layout.activity_rg2);
32 | listView = (ListView) findViewById(R.id.list);
33 | headerView = (BaseHeaderView) findViewById(R.id.header);
34 | footerView = (BaseFooterView) findViewById(R.id.footer);
35 |
36 | list = getData(15);
37 |
38 | adapter = new ArrayAdapter(this, R.layout.item, list);
39 |
40 | listView.setAdapter(adapter);
41 |
42 | headerView.setOnRefreshListener(this);
43 | footerView.setOnLoadListener(this);
44 | }
45 |
46 |
47 | @Override
48 | public void onRefresh(BaseHeaderView baseHeaderView) {
49 | baseHeaderView.postDelayed(new Runnable() {
50 | @Override
51 | public void run() {
52 | page = 1;
53 | List datas = getData(5);
54 | list.clear();
55 | list.addAll(datas);
56 | adapter.notifyDataSetChanged();
57 | headerView.stopRefresh();
58 | }
59 | }, 3000);
60 | }
61 |
62 | @Override
63 | public void onLoad(BaseFooterView baseFooterView) {
64 | baseFooterView.postDelayed(new Runnable() {
65 | @Override
66 | public void run() {
67 | page++;
68 | List datas = getData(5);
69 | list.addAll(datas);
70 | adapter.notifyDataSetChanged();
71 | footerView.stopLoad();
72 | }
73 | }, 3000);
74 | }
75 |
76 |
77 | int page = 1;
78 |
79 | private List getData(int n) {
80 | List datas = new ArrayList<>(n);
81 | for (int i = 0; i < n; i++) {
82 | datas.add("第" + page + "页,第" + i + "条");
83 | }
84 | return datas;
85 | }
86 | }
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ep/RGActivity.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.activities.ep;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 | import android.widget.ArrayAdapter;
6 | import android.widget.ListView;
7 |
8 | import com.ybao.pullrefreshview.layout.BaseFooterView;
9 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
10 | import com.ybao.pullrefreshview.simple.R;
11 |
12 | import java.util.ArrayList;
13 | import java.util.List;
14 |
15 | /**
16 | * Created by Ybao on 2015/11/3 0003.
17 | */
18 | public class RGActivity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener {
19 |
20 | ListView listView;
21 | BaseHeaderView headerView;
22 | BaseFooterView footerView;
23 |
24 | ArrayAdapter adapter;
25 |
26 | List list = new ArrayList();
27 |
28 | @Override
29 | protected void onCreate(Bundle savedInstanceState) {
30 | super.onCreate(savedInstanceState);
31 | setContentView(R.layout.activity_rg);
32 | listView = (ListView) findViewById(R.id.list);
33 | headerView = (BaseHeaderView) findViewById(R.id.header);
34 | footerView = (BaseFooterView) findViewById(R.id.footer);
35 |
36 | list = getData(15);
37 |
38 | adapter = new ArrayAdapter(this, R.layout.item, list);
39 |
40 | listView.setAdapter(adapter);
41 |
42 | headerView.setOnRefreshListener(this);
43 | footerView.setOnLoadListener(this);
44 | }
45 |
46 |
47 | @Override
48 | public void onRefresh(BaseHeaderView baseHeaderView) {
49 | baseHeaderView.postDelayed(new Runnable() {
50 | @Override
51 | public void run() {
52 | page = 1;
53 | List datas = getData(5);
54 | list.clear();
55 | list.addAll(datas);
56 | adapter.notifyDataSetChanged();
57 | headerView.stopRefresh();
58 | }
59 | }, 3000);
60 | }
61 |
62 | @Override
63 | public void onLoad(BaseFooterView baseFooterView) {
64 | baseFooterView.postDelayed(new Runnable() {
65 | @Override
66 | public void run() {
67 | page++;
68 | List datas = getData(5);
69 | list.addAll(datas);
70 | adapter.notifyDataSetChanged();
71 | footerView.stopLoad();
72 | }
73 | }, 3000);
74 | }
75 |
76 |
77 | int page = 1;
78 |
79 | private List getData(int n) {
80 | List datas = new ArrayList<>(n);
81 | for (int i = 0; i < n; i++) {
82 | datas.add("第" + page + "页,第" + i + "条");
83 | }
84 | return datas;
85 | }
86 | }
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ep/ScrollerEpActivity.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.activities.ep;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 | import android.widget.ArrayAdapter;
6 | import android.widget.ListView;
7 |
8 | import com.ybao.pullrefreshview.layout.BaseFooterView;
9 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
10 | import com.ybao.pullrefreshview.simple.R;
11 |
12 | import java.util.ArrayList;
13 | import java.util.List;
14 |
15 | /**
16 | * Created by Ybao on 2015/11/3 0003.
17 | */
18 | public class ScrollerEpActivity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener {
19 |
20 | ListView listView;
21 | BaseHeaderView headerView;
22 | BaseFooterView footerView;
23 |
24 | ArrayAdapter adapter;
25 |
26 | List list = new ArrayList();
27 |
28 | @Override
29 | protected void onCreate(Bundle savedInstanceState) {
30 | super.onCreate(savedInstanceState);
31 | setContentView(R.layout.activity_scroller_ep);
32 | listView = (ListView) findViewById(R.id.list);
33 | headerView = (BaseHeaderView) findViewById(R.id.header);
34 | footerView = (BaseFooterView) findViewById(R.id.footer);
35 |
36 | list = getData(15);
37 |
38 | adapter = new ArrayAdapter(this, R.layout.item, list);
39 |
40 | listView.setAdapter(adapter);
41 |
42 | headerView.setOnRefreshListener(this);
43 | footerView.setOnLoadListener(this);
44 | }
45 |
46 |
47 | @Override
48 | public void onRefresh(BaseHeaderView baseHeaderView) {
49 | baseHeaderView.postDelayed(new Runnable() {
50 | @Override
51 | public void run() {
52 | page = 1;
53 | List datas = getData(5);
54 | list.clear();
55 | list.addAll(datas);
56 | adapter.notifyDataSetChanged();
57 | headerView.stopRefresh();
58 | }
59 | }, 3000);
60 | }
61 |
62 | @Override
63 | public void onLoad(BaseFooterView baseFooterView) {
64 | baseFooterView.postDelayed(new Runnable() {
65 | @Override
66 | public void run() {
67 | page++;
68 | List datas = getData(5);
69 | list.addAll(datas);
70 | adapter.notifyDataSetChanged();
71 | footerView.stopLoad();
72 | }
73 | }, 3000);
74 | }
75 |
76 |
77 | int page = 1;
78 |
79 | private List getData(int n) {
80 | List datas = new ArrayList<>(n);
81 | for (int i = 0; i < n; i++) {
82 | datas.add("第" + page + "页,第" + i + "条");
83 | }
84 | return datas;
85 | }
86 | }
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ex/RecyclerViewActivity.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.activities.ex;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 | import android.support.v7.widget.LinearLayoutManager;
6 | import android.support.v7.widget.RecyclerView;
7 | import android.view.LayoutInflater;
8 | import android.view.ViewGroup;
9 | import android.widget.ArrayAdapter;
10 | import android.widget.ListView;
11 | import android.widget.TextView;
12 |
13 | import com.ybao.adapter.recyclerview.StandardAdapter;
14 | import com.ybao.pullrefreshview.layout.BaseFooterView;
15 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
16 | import com.ybao.pullrefreshview.simple.R;
17 |
18 | import java.util.ArrayList;
19 | import java.util.List;
20 |
21 | /**
22 | * Created by Ybao on 2015/11/3 0003.
23 | */
24 | public class RecyclerViewActivity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener {
25 |
26 | RecyclerView recyclerView;
27 | BaseHeaderView headerView;
28 | BaseFooterView footerView;
29 |
30 | RecyclerViewAdapter adapter;
31 |
32 | List list = new ArrayList();
33 |
34 | @Override
35 | protected void onCreate(Bundle savedInstanceState) {
36 | super.onCreate(savedInstanceState);
37 | setContentView(R.layout.activity_recyclerview);
38 |
39 | recyclerView = (RecyclerView) findViewById(R.id.list);
40 | headerView = (BaseHeaderView) findViewById(R.id.header);
41 | footerView = (BaseFooterView) findViewById(R.id.footer);
42 |
43 | list = getData(15);
44 |
45 | adapter = new RecyclerViewAdapter();
46 | adapter.setData(list);
47 |
48 | recyclerView.setLayoutManager(new LinearLayoutManager(this));
49 | recyclerView.setAdapter(adapter);
50 |
51 | headerView.setOnRefreshListener(this);
52 | footerView.setOnLoadListener(this);
53 | }
54 |
55 | @Override
56 | public void onRefresh(BaseHeaderView baseHeaderView) {
57 | baseHeaderView.postDelayed(new Runnable() {
58 | @Override
59 | public void run() {
60 | page = 1;
61 | List datas = getData(5);
62 | list.clear();
63 | list.addAll(datas);
64 | adapter.setData(list);
65 | headerView.stopRefresh();
66 | }
67 | }, 3000);
68 | }
69 |
70 | @Override
71 | public void onLoad(BaseFooterView baseFooterView) {
72 | baseFooterView.postDelayed(new Runnable() {
73 | @Override
74 | public void run() {
75 | page++;
76 | List datas = getData(5);
77 | list.addAll(datas);
78 | adapter.notifyDataSetChanged();
79 | footerView.stopLoad();
80 | }
81 | }, 3000);
82 | }
83 |
84 |
85 | int page = 1;
86 |
87 | private List getData(int n) {
88 | List datas = new ArrayList<>(n);
89 | for (int i = 0; i < n; i++) {
90 | datas.add("第" + page + "页,第" + i + "条");
91 | }
92 | return datas;
93 | }
94 |
95 | class RecyclerViewAdapter extends StandardAdapter {
96 | @Override
97 | public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
98 | return new ItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false));
99 | }
100 |
101 | @Override
102 | public void onBindViewHolder(ItemViewHolder holder, int position) {
103 | super.onBindViewHolder(holder, position);
104 |
105 | ((TextView) holder.itemView).setText(getItem(position).toString());
106 |
107 | }
108 | }
109 |
110 |
111 | }
112 |
113 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ex/ScrollViewActivity.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.activities.ex;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 |
6 | import com.ybao.pullrefreshview.layout.BaseFooterView;
7 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
8 | import com.ybao.pullrefreshview.simple.R;
9 |
10 | /**
11 | * Created by Ybao on 2015/11/5 0003.
12 | */
13 | public class ScrollViewActivity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener {
14 |
15 | BaseHeaderView headerView;
16 | BaseFooterView footerView;
17 |
18 | @Override
19 | protected void onCreate(Bundle savedInstanceState) {
20 | super.onCreate(savedInstanceState);
21 | setContentView(R.layout.activity_scrollview);
22 |
23 | headerView = (BaseHeaderView) findViewById(R.id.header);
24 | footerView = (BaseFooterView) findViewById(R.id.footer);
25 |
26 | headerView.setOnRefreshListener(this);
27 | footerView.setOnLoadListener(this);
28 | }
29 |
30 |
31 | @Override
32 | public void onRefresh(BaseHeaderView baseHeaderView) {
33 | baseHeaderView.postDelayed(new Runnable() {
34 | @Override
35 | public void run() {
36 | headerView.stopRefresh();
37 | }
38 | }, 3000);
39 | }
40 |
41 | @Override
42 | public void onLoad(BaseFooterView baseFooterView) {
43 | baseFooterView.postDelayed(new Runnable() {
44 | @Override
45 | public void run() {
46 | footerView.stopLoad();
47 | }
48 | }, 3000);
49 | }
50 |
51 |
52 | }
53 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ex/TextViewActivity.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.activities.ex;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 |
6 | import com.ybao.pullrefreshview.layout.BaseFooterView;
7 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
8 | import com.ybao.pullrefreshview.simple.R;
9 |
10 | /**
11 | * Created by Ybao on 2015/11/7 0007.
12 | */
13 | public class TextViewActivity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener {
14 |
15 | BaseHeaderView headerView;
16 | BaseFooterView footerView;
17 |
18 | @Override
19 | protected void onCreate(Bundle savedInstanceState) {
20 | super.onCreate(savedInstanceState);
21 | setContentView(R.layout.activity_textview);
22 |
23 | headerView = (BaseHeaderView) findViewById(R.id.header);
24 | footerView = (BaseFooterView) findViewById(R.id.footer);
25 |
26 |
27 | headerView.setOnRefreshListener(this);
28 | footerView.setOnLoadListener(this);
29 | }
30 |
31 |
32 | @Override
33 | public void onRefresh(BaseHeaderView baseHeaderView) {
34 | baseHeaderView.postDelayed(new Runnable() {
35 | @Override
36 | public void run() {
37 | headerView.stopRefresh();
38 | }
39 | }, 3000);
40 | }
41 |
42 | @Override
43 | public void onLoad(BaseFooterView baseFooterView) {
44 | baseFooterView.postDelayed(new Runnable() {
45 | @Override
46 | public void run() {
47 | footerView.stopLoad();
48 | }
49 | }, 3000);
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/activities/other/HeaderActivity.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.activities.other;
2 |
3 | import android.os.Bundle;
4 | import android.support.v4.view.ViewCompat;
5 | import android.support.v7.app.AppCompatActivity;
6 | import android.view.View;
7 | import android.widget.AbsListView;
8 | import android.widget.ArrayAdapter;
9 | import android.widget.ListView;
10 |
11 | import com.ybao.pullrefreshview.layout.BaseFooterView;
12 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
13 | import com.ybao.pullrefreshview.layout.FlingLayout;
14 | import com.ybao.pullrefreshview.simple.R;
15 | import com.ybao.pullrefreshview.support.utils.ViewScrollUtil;
16 |
17 | import java.util.ArrayList;
18 | import java.util.List;
19 |
20 | /**
21 | * Created by Ybao on 16/7/30.
22 | */
23 | public class HeaderActivity extends AppCompatActivity implements BaseFooterView.OnLoadListener, AbsListView.OnScrollListener, FlingLayout.OnScrollListener {
24 |
25 | FlingLayout flingLayout;
26 | ListView listView;
27 | BaseFooterView footerView;
28 | View animHeader;
29 |
30 | ArrayAdapter adapter;
31 |
32 | List list = new ArrayList();
33 |
34 | ViewScrollUtil.ScrollGeter scrollGeter;
35 |
36 | @Override
37 | protected void onCreate(Bundle savedInstanceState) {
38 | super.onCreate(savedInstanceState);
39 | setContentView(R.layout.activity_header);
40 |
41 | flingLayout = (FlingLayout) findViewById(R.id.root);
42 | listView = (ListView) findViewById(R.id.list);
43 | footerView = (BaseFooterView) findViewById(R.id.footer);
44 | animHeader = findViewById(R.id.anim_header);
45 | scrollGeter = ViewScrollUtil.getScrollGeter(listView);
46 |
47 | list = getData(15);
48 |
49 | adapter = new ArrayAdapter(this, R.layout.item, list);
50 |
51 | listView.setAdapter(adapter);
52 | flingLayout.setOnScrollListener(this);
53 | listView.setOnScrollListener(this);
54 | footerView.setOnLoadListener(this);
55 | }
56 |
57 | @Override
58 | public void onLoad(BaseFooterView baseFooterView) {
59 | baseFooterView.postDelayed(new Runnable() {
60 | @Override
61 | public void run() {
62 | page++;
63 | List datas = getData(5);
64 | list.addAll(datas);
65 | adapter.notifyDataSetChanged();
66 | footerView.stopLoad();
67 | }
68 | }, 3000);
69 | }
70 |
71 |
72 | int page = 1;
73 |
74 | private List getData(int n) {
75 | List datas = new ArrayList<>(n);
76 | for (int i = 0; i < n; i++) {
77 | datas.add("第" + page + "页,第" + i + "条");
78 | }
79 | return datas;
80 | }
81 |
82 | @Override
83 | public void onScroll(FlingLayout flingLayout, float y) {
84 | onMove();
85 | }
86 |
87 | @Override
88 | public void onScrollChange(FlingLayout flingLayout, int state) {
89 |
90 | }
91 |
92 | @Override
93 | public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
94 | onMove();
95 | }
96 |
97 | @Override
98 | public void onScrollStateChanged(AbsListView view, int scrollState) {
99 |
100 | }
101 |
102 |
103 | private void onMove() {
104 | int oy = (int) flingLayout.getMoveP() - scrollGeter.getScrollY();
105 | if (oy > 0) {
106 | int imgHeaderHeigth = animHeader.getMeasuredHeight();
107 | float ph = 1 + (float) oy / (float) imgHeaderHeigth;
108 | ViewCompat.setPivotY(animHeader, 0);
109 | ViewCompat.setScaleX(animHeader, ph);
110 | ViewCompat.setScaleY(animHeader, ph);
111 |
112 | } else {
113 | ViewCompat.setScaleX(animHeader, 1);
114 | ViewCompat.setScaleY(animHeader, 1);
115 | ViewCompat.setTranslationY(animHeader, oy);
116 | }
117 | }
118 | }
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/activities/other/MIFlingActivity.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.activities.other;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 | import android.widget.ArrayAdapter;
6 | import android.widget.ListView;
7 |
8 | import com.ybao.pullrefreshview.simple.R;
9 |
10 | import java.util.ArrayList;
11 | import java.util.List;
12 |
13 | /**
14 | * Created by Ybao on 16/7/30.
15 | */
16 | public class MIFlingActivity extends AppCompatActivity {
17 |
18 | ListView listView;
19 |
20 | ArrayAdapter adapter;
21 |
22 | List list;
23 |
24 | @Override
25 | protected void onCreate(Bundle savedInstanceState) {
26 | super.onCreate(savedInstanceState);
27 | setContentView(R.layout.activity_mifling);
28 | listView = (ListView) findViewById(R.id.list);
29 | list = getData(15);
30 | adapter = new ArrayAdapter(this, R.layout.item, list);
31 |
32 | listView.setAdapter(adapter);
33 | }
34 |
35 |
36 | int page = 1;
37 |
38 | private List getData(int n) {
39 | List datas = new ArrayList<>(n);
40 | for (int i = 0; i < n; i++) {
41 | datas.add("第" + page + "页,第" + i + "条");
42 | }
43 | return datas;
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/fragment/Fragment0.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.fragment;
2 |
3 |
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.support.v4.app.Fragment;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.view.ViewGroup;
10 | import android.widget.ArrayAdapter;
11 | import android.widget.ListView;
12 |
13 | import com.ybao.pullrefreshview.layout.BaseFooterView;
14 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
15 | import com.ybao.pullrefreshview.simple.R;
16 |
17 | import java.util.ArrayList;
18 | import java.util.List;
19 |
20 | /**
21 | * Created by Ybao on 16/7/25.
22 | */
23 | public class Fragment0 extends Fragment implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener {
24 | View view;
25 |
26 | ListView listView;
27 | BaseHeaderView headerView;
28 | BaseFooterView footerView;
29 |
30 | ArrayAdapter adapter;
31 |
32 | List list = new ArrayList();
33 |
34 | @Nullable
35 | @Override
36 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
37 | view = inflater.inflate(R.layout.fragment0, container, false);
38 | listView = findViewById(R.id.list);
39 | headerView = findViewById(R.id.header);
40 | footerView = findViewById(R.id.footer);
41 |
42 | list = getData(15);
43 |
44 | adapter = new ArrayAdapter(getContext(), R.layout.item, list);
45 |
46 | listView.setAdapter(adapter);
47 |
48 | headerView.setOnRefreshListener(this);
49 | footerView.setOnLoadListener(this);
50 | return view;
51 | }
52 |
53 | @Override
54 | public void onRefresh(BaseHeaderView baseHeaderView) {
55 | baseHeaderView.postDelayed(new Runnable() {
56 | @Override
57 | public void run() {
58 | page = 1;
59 | List datas = getData(5);
60 | list.clear();
61 | list.addAll(datas);
62 | adapter.notifyDataSetChanged();
63 | headerView.stopRefresh();
64 | }
65 | }, 3000);
66 | }
67 |
68 | @Override
69 | public void onLoad(BaseFooterView baseFooterView) {
70 | baseFooterView.postDelayed(new Runnable() {
71 | @Override
72 | public void run() {
73 | page++;
74 | List datas = getData(5);
75 | list.addAll(datas);
76 | adapter.notifyDataSetChanged();
77 | footerView.stopLoad();
78 | }
79 | }, 3000);
80 | }
81 |
82 |
83 | int page = 1;
84 |
85 | private List getData(int n) {
86 | List datas = new ArrayList<>(n);
87 | for (int i = 0; i < n; i++) {
88 | datas.add("第" + page + "页,第" + i + "条");
89 | }
90 | return datas;
91 | }
92 |
93 | public T findViewById(int id) {
94 | return (T) view.findViewById(id);
95 |
96 | }
97 | }
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/fragment/Fragment1.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.fragment;
2 |
3 |
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.support.v4.app.Fragment;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.view.ViewGroup;
10 | import android.support.v7.widget.LinearLayoutManager;
11 | import android.support.v7.widget.RecyclerView;
12 | import android.widget.TextView;
13 |
14 | import com.ybao.adapter.recyclerview.StandardAdapter;
15 | import com.ybao.pullrefreshview.layout.BaseFooterView;
16 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
17 | import com.ybao.pullrefreshview.simple.R;
18 |
19 | import java.util.ArrayList;
20 | import java.util.List;
21 |
22 | /**
23 | * Created by Ybao on 16/7/25.
24 | */
25 | public class Fragment1 extends Fragment implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener {
26 | View view;
27 |
28 |
29 | RecyclerView recyclerView;
30 | BaseHeaderView headerView;
31 | BaseFooterView footerView;
32 |
33 | RecyclerViewAdapter adapter;
34 |
35 | List list = new ArrayList();
36 |
37 | @Nullable
38 | @Override
39 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
40 | view = inflater.inflate(R.layout.fragment1, container, false);
41 |
42 |
43 | recyclerView = findViewById(R.id.list);
44 | headerView = findViewById(R.id.header);
45 | footerView = findViewById(R.id.footer);
46 |
47 | list = getData(15);
48 |
49 | adapter = new RecyclerViewAdapter();
50 | adapter.setData(list);
51 |
52 | recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
53 | recyclerView.setAdapter(adapter);
54 |
55 | headerView.setOnRefreshListener(this);
56 | footerView.setOnLoadListener(this);
57 |
58 | return view;
59 | }
60 | @Override
61 | public void onRefresh(BaseHeaderView baseHeaderView) {
62 | baseHeaderView.postDelayed(new Runnable() {
63 | @Override
64 | public void run() {
65 | page = 1;
66 | List datas = getData(5);
67 | list.clear();
68 | list.addAll(datas);
69 | adapter.setData(list);
70 | headerView.stopRefresh();
71 | }
72 | }, 3000);
73 | }
74 |
75 | @Override
76 | public void onLoad(BaseFooterView baseFooterView) {
77 | baseFooterView.postDelayed(new Runnable() {
78 | @Override
79 | public void run() {
80 | page++;
81 | List datas = getData(5);
82 | list.addAll(datas);
83 | adapter.notifyDataSetChanged();
84 | footerView.stopLoad();
85 | }
86 | }, 3000);
87 | }
88 |
89 |
90 | int page = 1;
91 |
92 | private List getData(int n) {
93 | List datas = new ArrayList<>(n);
94 | for (int i = 0; i < n; i++) {
95 | datas.add("第" + page + "页,第" + i + "条");
96 | }
97 | return datas;
98 | }
99 |
100 | class RecyclerViewAdapter extends StandardAdapter {
101 | @Override
102 | public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
103 | return new ItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false));
104 | }
105 |
106 | @Override
107 | public void onBindViewHolder(ItemViewHolder holder, int position) {
108 | super.onBindViewHolder(holder, position);
109 |
110 | ((TextView) holder.itemView).setText(getItem(position).toString());
111 |
112 | }
113 | }
114 |
115 | public T findViewById(int id) {
116 | return (T) view.findViewById(id);
117 |
118 | }
119 |
120 | }
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/fragment/Fragment2.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.fragment;
2 |
3 |
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.support.v4.app.Fragment;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.view.ViewGroup;
10 |
11 | import com.ybao.pullrefreshview.layout.BaseFooterView;
12 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
13 | import com.ybao.pullrefreshview.simple.R;
14 |
15 | /**
16 | * Created by Ybao on 16/7/25.
17 | */
18 | public class Fragment2 extends Fragment implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener {
19 | View view;
20 |
21 | BaseHeaderView headerView;
22 | BaseFooterView footerView;
23 | @Nullable
24 | @Override
25 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
26 | view = inflater.inflate(R.layout.fragment2, container, false);
27 |
28 | headerView = findViewById(R.id.header);
29 | footerView = findViewById(R.id.footer);
30 |
31 | headerView.setOnRefreshListener(this);
32 | footerView.setOnLoadListener(this);
33 | return view;
34 | }
35 |
36 |
37 | @Override
38 | public void onRefresh(BaseHeaderView baseHeaderView) {
39 | baseHeaderView.postDelayed(new Runnable() {
40 | @Override
41 | public void run() {
42 | headerView.stopRefresh();
43 | }
44 | }, 3000);
45 | }
46 |
47 | @Override
48 | public void onLoad(BaseFooterView baseFooterView) {
49 | baseFooterView.postDelayed(new Runnable() {
50 | @Override
51 | public void run() {
52 | footerView.stopLoad();
53 | }
54 | }, 3000);
55 | }
56 |
57 |
58 | public T findViewById(int id) {
59 | return (T) view.findViewById(id);
60 |
61 | }
62 | }
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/fragment/Fragment3.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.fragment;
2 |
3 |
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.support.v4.app.Fragment;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.view.ViewGroup;
10 | import android.widget.ArrayAdapter;
11 | import android.widget.ListView;
12 |
13 | import com.ybao.pullrefreshview.layout.BaseFooterView;
14 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
15 | import com.ybao.pullrefreshview.simple.R;
16 |
17 | import java.util.ArrayList;
18 | import java.util.List;
19 |
20 | /**
21 | * Created by Ybao on 16/7/25.
22 | */
23 | public class Fragment3 extends Fragment implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener {
24 | View view;
25 |
26 | BaseHeaderView headerView;
27 | BaseFooterView footerView;
28 | @Nullable
29 | @Override
30 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
31 | view = inflater.inflate(R.layout.fragment3, container, false);
32 |
33 | headerView = findViewById(R.id.header);
34 | footerView = findViewById(R.id.footer);
35 |
36 | headerView.setOnRefreshListener(this);
37 | footerView.setOnLoadListener(this);
38 | return view;
39 | }
40 |
41 |
42 | @Override
43 | public void onRefresh(BaseHeaderView baseHeaderView) {
44 | baseHeaderView.postDelayed(new Runnable() {
45 | @Override
46 | public void run() {
47 | headerView.stopRefresh();
48 | }
49 | }, 3000);
50 | }
51 |
52 | @Override
53 | public void onLoad(BaseFooterView baseFooterView) {
54 | baseFooterView.postDelayed(new Runnable() {
55 | @Override
56 | public void run() {
57 | footerView.stopLoad();
58 | }
59 | }, 3000);
60 | }
61 |
62 |
63 | public T findViewById(int id) {
64 | return (T) view.findViewById(id);
65 |
66 | }
67 | }
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/fragment/Fragment4.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.fragment;
2 |
3 |
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.support.v4.app.Fragment;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.view.ViewGroup;
10 | import android.webkit.WebView;
11 | import android.webkit.WebViewClient;
12 |
13 | import com.ybao.pullrefreshview.layout.BaseFooterView;
14 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
15 | import com.ybao.pullrefreshview.simple.R;
16 |
17 | /**
18 | * Created by Ybao on 16/7/25.
19 | */
20 | public class Fragment4 extends Fragment implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener {
21 | View view;
22 |
23 | BaseHeaderView headerView;
24 | BaseFooterView footerView;
25 |
26 | @Nullable
27 | @Override
28 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
29 | view = inflater.inflate(R.layout.fragment4, container, false);
30 | WebView webView = findViewById(R.id.webview);
31 | webView.setWebViewClient(new WebViewClient() {
32 | @Override
33 | public void onPageFinished(WebView view, String url){
34 | }
35 |
36 | @Override
37 | public boolean shouldOverrideUrlLoading(WebView view, String url) {
38 |
39 | if (url.indexOf("objc://") != -1) {
40 | return true;
41 | }
42 | return super.shouldOverrideUrlLoading(view, url);
43 | }
44 | });
45 | webView.loadUrl("http://www.baidu.com");
46 | headerView = findViewById(R.id.header);
47 | footerView = findViewById(R.id.footer);
48 |
49 | headerView.setOnRefreshListener(this);
50 | footerView.setOnLoadListener(this);
51 | return view;
52 | }
53 |
54 |
55 | @Override
56 | public void onRefresh(BaseHeaderView baseHeaderView) {
57 | baseHeaderView.postDelayed(new Runnable() {
58 | @Override
59 | public void run() {
60 | headerView.stopRefresh();
61 | }
62 | }, 3000);
63 | }
64 |
65 | @Override
66 | public void onLoad(BaseFooterView baseFooterView) {
67 | baseFooterView.postDelayed(new Runnable() {
68 | @Override
69 | public void run() {
70 | footerView.stopLoad();
71 | }
72 | }, 3000);
73 | }
74 |
75 |
76 | public T findViewById(int id) {
77 | return (T) view.findViewById(id);
78 |
79 | }
80 | }
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/utils/AnimUtil.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.utils;
2 |
3 | import android.view.View;
4 | import android.view.animation.Interpolator;
5 | import android.view.animation.LinearInterpolator;
6 |
7 | import com.nineoldandroids.animation.Animator;
8 | import com.nineoldandroids.animation.AnimatorSet;
9 | import com.nineoldandroids.animation.ObjectAnimator;
10 | import com.nineoldandroids.view.ViewHelper;
11 |
12 | /**
13 | * Created by Ybao on 2015/11/7 0007.
14 | */
15 | public class AnimUtil {
16 | public static Animator startRotation(View view, float toRotation) {
17 | Animator animator = ObjectAnimator.ofFloat(view, "rotation", ViewHelper.getRotation(view), toRotation);
18 | animator.start();
19 | return animator;
20 | }
21 |
22 | public static Animator startRotation(View view, float toRotation, long duration, long startDelay) {
23 | ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "rotation", ViewHelper.getRotation(view), toRotation).setDuration(duration);
24 | objectAnimator.setStartDelay(startDelay);
25 | objectAnimator.start();
26 | return objectAnimator;
27 | }
28 |
29 | public static Animator startRotation(View view, float toRotation, long duration, long startDelay, int times) {
30 | ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "rotation", ViewHelper.getRotation(view), toRotation).setDuration(duration);
31 | objectAnimator.setStartDelay(startDelay);
32 | objectAnimator.setRepeatCount(times);
33 | objectAnimator.setInterpolator(new LinearInterpolator());
34 | objectAnimator.start();
35 | return objectAnimator;
36 | }
37 |
38 | public static Animator startShow(View view, float fromAlpha, long duration, long startDelay) {
39 | ViewHelper.setAlpha(view, fromAlpha);
40 | view.setVisibility(View.VISIBLE);
41 | ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "alpha", fromAlpha, 1f).setDuration(duration);
42 | objectAnimator.setStartDelay(startDelay);
43 | objectAnimator.start();
44 | return objectAnimator;
45 | }
46 |
47 | public static Animator startHide(final View view, long duration, long startDelay) {
48 | view.setVisibility(View.VISIBLE);
49 | ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "alpha", ViewHelper.getAlpha(view), 0f).setDuration(duration);
50 | objectAnimator.setStartDelay(startDelay);
51 | objectAnimator.start();
52 | return objectAnimator;
53 | }
54 |
55 | public static Animator startShow(View view, float fromAlpha) {
56 | ViewHelper.setAlpha(view, fromAlpha);
57 | view.setVisibility(View.VISIBLE);
58 | Animator animator = ObjectAnimator.ofFloat(view, "alpha", fromAlpha, 1f);
59 | animator.start();
60 | return animator;
61 | }
62 |
63 | public static Animator startHide(final View view) {
64 | view.setVisibility(View.VISIBLE);
65 | Animator animator = ObjectAnimator.ofFloat(view, "alpha", ViewHelper.getAlpha(view), 0f);
66 | animator.start();
67 | return animator;
68 | }
69 |
70 |
71 | public static Animator startScale(final View view, float toScale) {
72 | AnimatorSet animator = new AnimatorSet();
73 | animator.playTogether(ObjectAnimator.ofFloat(view, "scaleX", ViewHelper.getScaleX(view), toScale), ObjectAnimator.ofFloat(view, "scaleY", ViewHelper.getScaleY(view), toScale));
74 | animator.start();
75 | return animator;
76 | }
77 |
78 | public static Animator startScale(final View view, float toScale, long duration, long startDelay, Interpolator setInterpolator) {
79 | ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "scaleX", ViewHelper.getScaleX(view), toScale).setDuration(duration);
80 | objectAnimator.setStartDelay(startDelay);
81 | objectAnimator.setInterpolator(setInterpolator);
82 | objectAnimator.start();
83 | objectAnimator = ObjectAnimator.ofFloat(view, "scaleY", ViewHelper.getScaleY(view), toScale).setDuration(duration);
84 | objectAnimator.setStartDelay(startDelay);
85 | objectAnimator.setInterpolator(setInterpolator);
86 | objectAnimator.start();
87 | return objectAnimator;
88 | }
89 |
90 | public static Animator startScale(final View view, float fromScale, float toScale) {
91 | AnimatorSet animator = new AnimatorSet();
92 | animator.playTogether(ObjectAnimator.ofFloat(view, "scaleX", fromScale, toScale), ObjectAnimator.ofFloat(view, "scaleY", fromScale, toScale));
93 | animator.start();
94 | return animator;
95 | }
96 |
97 |
98 | public static Animator startScale(final View view, float fromScale, float toScale, long duration, long startDelay, Interpolator setInterpolator) {
99 | ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "scaleX", fromScale, toScale).setDuration(duration);
100 | objectAnimator.setStartDelay(startDelay);
101 | objectAnimator.setInterpolator(setInterpolator);
102 | objectAnimator.start();
103 | objectAnimator = ObjectAnimator.ofFloat(view, "scaleY", fromScale, toScale).setDuration(duration);
104 | objectAnimator.setStartDelay(startDelay);
105 | objectAnimator.setInterpolator(setInterpolator);
106 | objectAnimator.start();
107 | return objectAnimator;
108 | }
109 |
110 | public static Animator startFromY(final View view, float fromY) {
111 | Animator animator = ObjectAnimator.ofFloat(view, "translationY", fromY, 0);
112 | animator.start();
113 | return animator;
114 | }
115 |
116 | public static Animator startToY(final View view, float toY) {
117 | Animator animator = ObjectAnimator.ofFloat(view, "translationY", 0, toY);
118 | animator.start();
119 | return animator;
120 | }
121 | }
122 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/view/EndFooterView.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.view;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.view.animation.OvershootInterpolator;
8 | import android.widget.TextView;
9 |
10 | import com.nineoldandroids.animation.Animator;
11 | import com.nineoldandroids.view.ViewHelper;
12 | import com.ybao.pullrefreshview.layout.BaseFooterView;
13 | import com.ybao.pullrefreshview.simple.R;
14 | import com.ybao.pullrefreshview.simple.utils.AnimUtil;
15 | import com.ybao.pullrefreshview.support.type.LayoutType;
16 |
17 | import java.util.ArrayList;
18 | import java.util.List;
19 |
20 | /**
21 | * Created by Ybao on 2015/11/3 0003.
22 | */
23 | public class EndFooterView extends BaseFooterView {
24 |
25 | TextView textView;
26 | View tagImg;
27 | View progress;
28 | View stateImg;
29 |
30 |
31 | public EndFooterView(Context context) {
32 | this(context, null);
33 | }
34 |
35 | public EndFooterView(Context context, AttributeSet attrs) {
36 | this(context, attrs, 0);
37 | }
38 |
39 | public EndFooterView(Context context, AttributeSet attrs, int defStyleAttr) {
40 | super(context, attrs, defStyleAttr);
41 | init();
42 | }
43 |
44 | private void init() {
45 | LayoutInflater.from(getContext()).inflate(R.layout.view_footer_end, this, true);
46 | textView = (TextView) findViewById(R.id.text);
47 | tagImg = findViewById(R.id.tag);
48 | progress = findViewById(R.id.progress);
49 | stateImg = findViewById(R.id.state);
50 | }
51 |
52 | List animators = new ArrayList<>();
53 |
54 | @Override
55 | protected void onStateChange(int state) {
56 | for (Animator animator : animators) {
57 | animator.cancel();
58 | }
59 | animators.clear();
60 | stateImg.setVisibility(View.INVISIBLE);
61 | progress.setVisibility(View.INVISIBLE);
62 | textView.setVisibility(View.VISIBLE);
63 | tagImg.setVisibility(View.VISIBLE);
64 | ViewHelper.setAlpha(textView, 1);
65 | ViewHelper.setAlpha(tagImg, 1);
66 | switch (state) {
67 | case NONE:
68 | case PULLING:
69 | textView.setText("上拉加载更多");
70 | animators.add(AnimUtil.startRotation(tagImg, 0));
71 | break;
72 | case LOOSENT_O_LOAD:
73 | textView.setText("松开加载");
74 | animators.add(AnimUtil.startRotation(tagImg, 180));
75 | break;
76 | case LOADING:
77 | textView.setText("正在加载");
78 | animators.add(AnimUtil.startShow(progress, 0.1f, 400, 200));
79 | animators.add(AnimUtil.startHide(textView));
80 | animators.add(AnimUtil.startHide(tagImg));
81 | break;
82 | case LOAD_CLONE:
83 | animators.add(AnimUtil.startScale(stateImg, 0.3f, 1f, 500, 50, new OvershootInterpolator()));
84 | animators.add(AnimUtil.startShow(stateImg, 0.1f, 300, 150));
85 | animators.add(AnimUtil.startHide(progress, 150, 0));
86 | textView.setVisibility(View.INVISIBLE);
87 | tagImg.setVisibility(View.INVISIBLE);
88 | textView.setText("加载完成");
89 | break;
90 |
91 | }
92 |
93 | }
94 |
95 | @Override
96 | public float getSpanHeight() {
97 | return 0;
98 | }
99 |
100 | @Override
101 | public int getLayoutType() {
102 | return LayoutType.LAYOUT_NOT_MOVE;
103 | }
104 | }
105 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/view/ExpandFooterView.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.view;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 |
9 | import com.nineoldandroids.animation.Animator;
10 | import com.nineoldandroids.animation.ObjectAnimator;
11 | import com.nineoldandroids.view.ViewHelper;
12 | import com.ybao.pullrefreshview.layout.BaseFooterView;
13 | import com.ybao.pullrefreshview.layout.FlingLayout;
14 | import com.ybao.pullrefreshview.layout.PullRefreshLayout;
15 | import com.ybao.pullrefreshview.simple.R;
16 | import com.ybao.pullrefreshview.simple.utils.AnimUtil;
17 | import com.ybao.pullrefreshview.support.type.LayoutType;
18 |
19 | import java.util.ArrayList;
20 | import java.util.List;
21 |
22 | /**
23 | * Created by Ybao on 2015/11/3 0003.
24 | */
25 | public class ExpandFooterView extends BaseFooterView {
26 | View progress;
27 | View stateImg;
28 | View loadBox;
29 |
30 | int state = NONE;
31 |
32 | private int layoutType = LayoutType.LAYOUT_DRAWER;
33 |
34 | public ExpandFooterView(Context context) {
35 | this(context, null);
36 | }
37 |
38 | public ExpandFooterView(Context context, AttributeSet attrs) {
39 | this(context, attrs, 0);
40 | }
41 |
42 | public ExpandFooterView(Context context, AttributeSet attrs, int defStyleAttr) {
43 | super(context, attrs, defStyleAttr);
44 | init();
45 | }
46 |
47 | private void init() {
48 | LayoutInflater.from(getContext()).inflate(R.layout.view_footer_expand, this, true);
49 | progress = findViewById(R.id.progress);
50 | stateImg = findViewById(R.id.state);
51 | loadBox = findViewById(R.id.load_box);
52 | setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 350));
53 | }
54 |
55 | @Override
56 | public void setPullRefreshLayout(PullRefreshLayout refreshLayout) {
57 | super.setPullRefreshLayout(refreshLayout);
58 | refreshLayout.setMaxDistance(350);
59 | }
60 |
61 | List animators = new ArrayList<>();
62 |
63 | @Override
64 | protected void onStateChange(int state) {
65 | this.state = state;
66 | for (Animator animator : animators) {
67 | animator.cancel();
68 | }
69 | animators.clear();
70 | stateImg.setVisibility(View.INVISIBLE);
71 | progress.setVisibility(View.VISIBLE);
72 | ViewHelper.setAlpha(progress, 1f);
73 | switch (state) {
74 | case NONE:
75 | break;
76 | case PULLING:
77 | break;
78 | case LOOSENT_O_LOAD:
79 | break;
80 | case LOADING:
81 | animators.add(AnimUtil.startRotation(progress, ViewHelper.getRotation(progress) + 359.99f, 500, 0, -1));
82 | break;
83 | case LOAD_CLONE:
84 | animators.add(AnimUtil.startShow(stateImg, 0.1f, 400, 200));
85 | animators.add(AnimUtil.startHide(progress));
86 | break;
87 |
88 | }
89 |
90 | }
91 |
92 | @Override
93 | public float getSpanHeight() {
94 | return loadBox.getHeight();
95 | }
96 |
97 | @Override
98 | public int getLayoutType() {
99 | return layoutType;
100 | }
101 |
102 | @Override
103 | public boolean onScroll(float y) {
104 | boolean intercept = super.onScroll(y);
105 | if (!isLockState()) {
106 | ViewHelper.setRotation(progress, y * y * 48 / 31250);
107 | }
108 | return intercept;
109 | }
110 | }
111 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/view/ExpandHeaderView.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.view;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 |
9 | import com.nineoldandroids.animation.Animator;
10 | import com.nineoldandroids.animation.ObjectAnimator;
11 | import com.nineoldandroids.view.ViewHelper;
12 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
13 | import com.ybao.pullrefreshview.layout.FlingLayout;
14 | import com.ybao.pullrefreshview.layout.PullRefreshLayout;
15 | import com.ybao.pullrefreshview.simple.R;
16 | import com.ybao.pullrefreshview.simple.utils.AnimUtil;
17 | import com.ybao.pullrefreshview.support.type.LayoutType;
18 |
19 | import java.util.ArrayList;
20 | import java.util.List;
21 |
22 | /**
23 | * Created by Ybao on 2015/11/3 0003.
24 | */
25 | public class ExpandHeaderView extends BaseHeaderView {
26 | View progress;
27 | View stateImg;
28 | View loadBox;
29 |
30 | int state = NONE;
31 |
32 | private final static int layoutType = LayoutType.LAYOUT_DRAWER;
33 |
34 | public ExpandHeaderView(Context context) {
35 | this(context, null);
36 | }
37 |
38 | public ExpandHeaderView(Context context, AttributeSet attrs) {
39 | this(context, attrs, 0);
40 | }
41 |
42 | public ExpandHeaderView(Context context, AttributeSet attrs, int defStyleAttr) {
43 | super(context, attrs, defStyleAttr);
44 | init();
45 | }
46 |
47 | private void init() {
48 | LayoutInflater.from(getContext()).inflate(R.layout.view_header_expand, this, true);
49 | progress = findViewById(R.id.progress);
50 | stateImg = findViewById(R.id.state);
51 | loadBox = findViewById(R.id.load_box);
52 | setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 300));
53 | }
54 |
55 | @Override
56 | public void setPullRefreshLayout(PullRefreshLayout refreshLayout) {
57 | super.setPullRefreshLayout(refreshLayout);
58 | refreshLayout.setMaxDistance(300);
59 | }
60 | List animators = new ArrayList<>();
61 |
62 | @Override
63 | protected void onStateChange(int state) {
64 | this.state = state;
65 | for (Animator animator : animators) {
66 | animator.cancel();
67 | }
68 | animators.clear();
69 | stateImg.setVisibility(View.INVISIBLE);
70 | progress.setVisibility(View.VISIBLE);
71 | ViewHelper.setAlpha(progress, 1f);
72 | switch (state) {
73 | case NONE:
74 | break;
75 | case PULLING:
76 | break;
77 | case LOOSENT_O_REFRESH:
78 | break;
79 | case REFRESHING:
80 | animators.add(AnimUtil.startRotation(progress, ViewHelper.getRotation(progress) + 359.99f, 500, 0, -1));
81 | break;
82 | case REFRESH_CLONE:
83 | animators.add(AnimUtil.startShow(stateImg, 0.1f, 400, 200));
84 | animators.add(AnimUtil.startHide(progress));
85 | break;
86 |
87 | }
88 |
89 | }
90 |
91 | @Override
92 | public float getSpanHeight() {
93 | return loadBox.getHeight();
94 | }
95 |
96 | @Override
97 | public int getLayoutType() {
98 | return layoutType;
99 | }
100 |
101 | @Override
102 | public boolean onScroll(float y) {
103 | boolean intercept = super.onScroll(y);
104 | if (!isLockState()) {
105 | ViewHelper.setRotation(progress, y * y * 48 / 31250);
106 | }
107 | return intercept;
108 | }
109 | }
110 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/view/LockFooterView.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.view;
2 |
3 | import android.content.Context;
4 | import android.graphics.Canvas;
5 | import android.graphics.Paint;
6 | import android.graphics.Path;
7 | import android.util.AttributeSet;
8 | import android.view.LayoutInflater;
9 | import android.view.View;
10 |
11 | import com.nineoldandroids.animation.Animator;
12 | import com.nineoldandroids.animation.ObjectAnimator;
13 | import com.nineoldandroids.view.ViewHelper;
14 | import com.ybao.pullrefreshview.layout.BaseFooterView;
15 | import com.ybao.pullrefreshview.layout.FlingLayout;
16 | import com.ybao.pullrefreshview.simple.R;
17 | import com.ybao.pullrefreshview.simple.utils.AnimUtil;
18 | import com.ybao.pullrefreshview.support.type.LayoutType;
19 |
20 | import java.util.ArrayList;
21 | import java.util.List;
22 |
23 | /**
24 | * Created by Ybao on 2015/11/3 0003.
25 | */
26 | public class LockFooterView extends BaseFooterView {
27 | View progress;
28 | View stateImg;
29 | View loadBox;
30 | int width = 0;
31 | Path path;
32 | Paint paint;
33 |
34 | int state = NONE;
35 |
36 | int layoutType = LayoutType.LAYOUT_SCROLLER;
37 |
38 | public LockFooterView(Context context) {
39 | this(context, null);
40 | }
41 |
42 | public LockFooterView(Context context, AttributeSet attrs) {
43 | this(context, attrs, 0);
44 | }
45 |
46 | public LockFooterView(Context context, AttributeSet attrs, int defStyleAttr) {
47 | super(context, attrs, defStyleAttr);
48 | init();
49 | }
50 |
51 | private void init() {
52 | LayoutInflater.from(getContext()).inflate(R.layout.view_footer_lock, this, true);
53 | progress = findViewById(R.id.progress);
54 | stateImg = findViewById(R.id.state);
55 | loadBox = findViewById(R.id.load_box);
56 | path = new Path();
57 | paint = new Paint();
58 | paint.setColor(0x8888ff00);
59 | paint.setAntiAlias(true);
60 | paint.setStyle(Paint.Style.FILL);
61 | }
62 |
63 | @Override
64 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
65 | super.onMeasure(widthMeasureSpec, 400);
66 | setMeasuredDimension(widthMeasureSpec, MeasureSpec.makeMeasureSpec(400, MeasureSpec.EXACTLY));
67 | width = getWidth();
68 | }
69 |
70 | @Override
71 | protected void dispatchDraw(Canvas canvas) {
72 | canvas.drawPath(path, paint);
73 | super.dispatchDraw(canvas);
74 | }
75 |
76 | List animators = new ArrayList<>();
77 | @Override
78 | protected void onStateChange(int state) {
79 | this.state = state;
80 | for (Animator animator : animators) {
81 | animator.cancel();
82 | }
83 | animators.clear();
84 | stateImg.setVisibility(View.INVISIBLE);
85 | progress.setVisibility(View.INVISIBLE);
86 | ViewHelper.setAlpha(progress, 1f);
87 | switch (state) {
88 | case NONE:
89 | break;
90 | case PULLING:
91 | break;
92 | case LOOSENT_O_LOAD:
93 | break;
94 | case LOADING:
95 | animators.add(AnimUtil.startShow(progress, 0.1f, 200, 0));
96 | animators.add(AnimUtil.startRotation(progress, ViewHelper.getRotation(progress) + 359.99f, 500, 0, -1));
97 | break;
98 | case LOAD_CLONE:
99 | animators.add(AnimUtil.startShow(stateImg, 0.1f, 400, 200));
100 | animators.add(AnimUtil.startHide(progress));
101 | break;
102 |
103 | }
104 |
105 | }
106 |
107 | @Override
108 | public float getSpanHeight() {
109 | return loadBox.getHeight();
110 | }
111 |
112 | @Override
113 | public int getLayoutType() {
114 | return layoutType;
115 | }
116 |
117 | @Override
118 | public boolean onScroll(float y) {
119 | boolean intercept = super.onScroll(y);
120 | ViewHelper.setTranslationY(loadBox, 400 + 0.97f * y);
121 | if (!isLockState()) {
122 | ViewHelper.setRotation(progress, y * y * 48 / 31250);
123 | }
124 | path.reset();// 重置path
125 | if (y == 0) {
126 | invalidate();
127 | return intercept;
128 | }
129 | // 贝赛尔曲线的起始点
130 | path.moveTo(0, 400);
131 | // 设置贝赛尔曲线的操作点以及终止点
132 | path.quadTo(width / 2, 400 + 1.94f * y, width, 400);
133 | invalidate();
134 | return intercept;
135 | }
136 | }
137 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/view/LockHeaderView.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.view;
2 |
3 | import android.content.Context;
4 | import android.graphics.Canvas;
5 | import android.graphics.Paint;
6 | import android.graphics.Path;
7 | import android.util.AttributeSet;
8 | import android.view.LayoutInflater;
9 | import android.view.View;
10 |
11 | import com.nineoldandroids.animation.Animator;
12 | import com.nineoldandroids.animation.ObjectAnimator;
13 | import com.nineoldandroids.view.ViewHelper;
14 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
15 | import com.ybao.pullrefreshview.layout.FlingLayout;
16 | import com.ybao.pullrefreshview.layout.PullRefreshLayout;
17 | import com.ybao.pullrefreshview.simple.R;
18 | import com.ybao.pullrefreshview.simple.utils.AnimUtil;
19 | import com.ybao.pullrefreshview.support.type.LayoutType;
20 |
21 | import java.util.ArrayList;
22 | import java.util.List;
23 |
24 | /**
25 | * Created by Ybao on 2015/11/3 0003.
26 | */
27 | public class LockHeaderView extends BaseHeaderView {
28 | View progress;
29 | View stateImg;
30 | View loadBox;
31 | int width = 0;
32 | Path path;
33 | Paint paint;
34 |
35 | int state = NONE;
36 |
37 | int layoutType = LayoutType.LAYOUT_SCROLLER;
38 |
39 | public LockHeaderView(Context context) {
40 | this(context, null);
41 | }
42 |
43 | public LockHeaderView(Context context, AttributeSet attrs) {
44 | this(context, attrs, 0);
45 | }
46 |
47 | public LockHeaderView(Context context, AttributeSet attrs, int defStyleAttr) {
48 | super(context, attrs, defStyleAttr);
49 | init();
50 | }
51 |
52 | private void init() {
53 | LayoutInflater.from(getContext()).inflate(R.layout.view_header_lock, this, true);
54 | progress = findViewById(R.id.progress);
55 | stateImg = findViewById(R.id.state);
56 | loadBox = findViewById(R.id.load_box);
57 | path = new Path();
58 | paint = new Paint();
59 | paint.setColor(0x8888ff00);
60 | paint.setAntiAlias(true);
61 | paint.setStyle(Paint.Style.FILL);
62 | }
63 |
64 | @Override
65 | public void setPullRefreshLayout(PullRefreshLayout refreshLayout) {
66 | super.setPullRefreshLayout(refreshLayout);
67 | refreshLayout.setMaxDistance(400);
68 | }
69 |
70 | @Override
71 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
72 | super.onMeasure(widthMeasureSpec, 400);
73 | setMeasuredDimension(widthMeasureSpec, MeasureSpec.makeMeasureSpec(400, MeasureSpec.EXACTLY));
74 | width = getWidth();
75 | }
76 |
77 |
78 | @Override
79 | protected void dispatchDraw(Canvas canvas) {
80 | canvas.drawPath(path, paint);
81 | super.dispatchDraw(canvas);
82 | }
83 |
84 | List animators = new ArrayList<>();
85 |
86 | @Override
87 | protected void onStateChange(int state) {
88 | this.state = state;
89 | for (Animator animator : animators) {
90 | animator.cancel();
91 | }
92 | animators.clear();
93 | stateImg.setVisibility(View.INVISIBLE);
94 | progress.setVisibility(View.INVISIBLE);
95 | ViewHelper.setAlpha(progress, 1f);
96 | switch (state) {
97 | case NONE:
98 | break;
99 | case PULLING:
100 | break;
101 | case LOOSENT_O_REFRESH:
102 | break;
103 | case REFRESHING:
104 | animators.add(AnimUtil.startShow(progress, 0.1f, 200, 0));
105 | animators.add(AnimUtil.startRotation(progress, ViewHelper.getRotation(progress) + 359.99f, 500, 0, -1));
106 | break;
107 | case REFRESH_CLONE:
108 | animators.add(AnimUtil.startShow(stateImg, 0.1f, 400, 200));
109 | animators.add(AnimUtil.startHide(progress));
110 | break;
111 |
112 | }
113 |
114 | }
115 |
116 | @Override
117 | public float getSpanHeight() {
118 | return loadBox.getHeight();
119 | }
120 |
121 | @Override
122 | public int getLayoutType() {
123 | return layoutType;
124 | }
125 |
126 | @Override
127 | public boolean onScroll(float y) {
128 | boolean intercept = super.onScroll(y);
129 | ViewHelper.setTranslationY(loadBox, 0.97f * y - loadBox.getHeight());
130 | if (!isLockState()) {
131 | ViewHelper.setRotation(progress, y * y * 48 / 31250);
132 | }
133 | path.reset();// 重置path
134 | if (y == 0) {
135 | invalidate();
136 | return intercept;
137 | }
138 | // 贝赛尔曲线的起始点
139 | path.moveTo(0, 0);
140 | // 设置贝赛尔曲线的操作点以及终止点
141 | path.quadTo(width / 2, 1.94f * y, width, 0);
142 | invalidate();
143 | return intercept;
144 | }
145 | }
146 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/view/MiFliingLayout.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.view;
2 |
3 | import android.content.Context;
4 | import android.support.v4.view.ViewCompat;
5 | import android.util.AttributeSet;
6 | import android.view.View;
7 |
8 | import com.ybao.pullrefreshview.layout.FlingLayout;
9 |
10 | /**
11 | * Created by Ybao on 16/7/30.
12 | */
13 | public class MiFliingLayout extends FlingLayout {
14 | public MiFliingLayout(Context context) {
15 | super(context);
16 | }
17 |
18 | public MiFliingLayout(Context context, AttributeSet attrs) {
19 | super(context, attrs);
20 | }
21 |
22 | public MiFliingLayout(Context context, AttributeSet attrs, int defStyle) {
23 | super(context, attrs, defStyle);
24 | }
25 |
26 |
27 | @Override
28 | protected boolean onScroll(float y) {
29 | View view = getPullable().getView();
30 | int heigth = view.getMeasuredHeight();
31 | if (y >= 0) {
32 | ViewCompat.setPivotY(view, 0);
33 | ViewCompat.setScaleY(view, (heigth + y) / heigth);
34 | } else {
35 | ViewCompat.setPivotY(view, heigth);
36 | ViewCompat.setScaleY(view, (heigth - y) / heigth);
37 | }
38 | return true;
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/view/NormalFooterView.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.view;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.view.animation.OvershootInterpolator;
8 | import android.widget.TextView;
9 |
10 | import com.nineoldandroids.animation.Animator;
11 | import com.nineoldandroids.view.ViewHelper;
12 | import com.ybao.pullrefreshview.layout.BaseFooterView;
13 | import com.ybao.pullrefreshview.simple.R;
14 | import com.ybao.pullrefreshview.simple.utils.AnimUtil;
15 | import com.ybao.pullrefreshview.support.type.LayoutType;
16 |
17 | import java.util.ArrayList;
18 | import java.util.List;
19 |
20 | /**
21 | * Created by Ybao on 2015/11/3 0003.
22 | */
23 | public class NormalFooterView extends BaseFooterView {
24 |
25 | TextView textView;
26 | View tagImg;
27 | View progress;
28 | View stateImg;
29 |
30 |
31 | public NormalFooterView(Context context) {
32 | this(context, null);
33 | }
34 |
35 | public NormalFooterView(Context context, AttributeSet attrs) {
36 | this(context, attrs, 0);
37 | }
38 |
39 | public NormalFooterView(Context context, AttributeSet attrs, int defStyleAttr) {
40 | super(context, attrs, defStyleAttr);
41 | init();
42 | }
43 |
44 | private void init() {
45 | LayoutInflater.from(getContext()).inflate(R.layout.view_footer_normal, this, true);
46 | textView = (TextView) findViewById(R.id.text);
47 | tagImg = findViewById(R.id.tag);
48 | progress = findViewById(R.id.progress);
49 | stateImg = findViewById(R.id.state);
50 | }
51 |
52 |
53 | List animators = new ArrayList<>();
54 | @Override
55 | protected void onStateChange(int state) {
56 | for (Animator animator : animators) {
57 | animator.cancel();
58 | }
59 | animators.clear();
60 | stateImg.setVisibility(View.INVISIBLE);
61 | progress.setVisibility(View.INVISIBLE);
62 | textView.setVisibility(View.VISIBLE);
63 | tagImg.setVisibility(View.VISIBLE);
64 | ViewHelper.setAlpha(textView, 1);
65 | ViewHelper.setAlpha(tagImg, 1);
66 | switch (state) {
67 | case NONE:
68 | break;
69 | case PULLING:
70 | textView.setText("上拉加载更多");
71 | animators.add(AnimUtil.startRotation(tagImg, 0));
72 | break;
73 | case LOOSENT_O_LOAD:
74 | textView.setText("松开加载");
75 | animators.add(AnimUtil.startRotation(tagImg, 180));
76 | break;
77 | case LOADING:
78 | textView.setText("正在加载");
79 | animators.add(AnimUtil.startShow(progress, 0.1f, 400, 200));
80 | animators.add(AnimUtil.startHide(textView));
81 | animators.add(AnimUtil.startHide(tagImg));
82 | break;
83 | case LOAD_CLONE:
84 | animators.add(AnimUtil.startScale(stateImg, 0.3f, 1f, 500, 50, new OvershootInterpolator()));
85 | animators.add(AnimUtil.startShow(stateImg, 0.1f, 300, 150));
86 | animators.add(AnimUtil.startHide(progress, 150, 0));
87 | textView.setVisibility(View.INVISIBLE);
88 | tagImg.setVisibility(View.INVISIBLE);
89 | textView.setText("加载完成");
90 | break;
91 |
92 | }
93 |
94 | }
95 |
96 | @Override
97 | public float getSpanHeight() {
98 | return getHeight();
99 | }
100 |
101 | @Override
102 | public int getLayoutType() {
103 | return LayoutType.LAYOUT_NORMAL;
104 | }
105 | }
106 |
--------------------------------------------------------------------------------
/simple/src/main/java/com/ybao/pullrefreshview/simple/view/NormalHeaderView.java:
--------------------------------------------------------------------------------
1 | package com.ybao.pullrefreshview.simple.view;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.widget.TextView;
8 |
9 | import com.nineoldandroids.animation.Animator;
10 | import com.nineoldandroids.view.ViewHelper;
11 | import com.ybao.pullrefreshview.layout.BaseHeaderView;
12 | import com.ybao.pullrefreshview.simple.R;
13 | import com.ybao.pullrefreshview.simple.utils.AnimUtil;
14 | import com.ybao.pullrefreshview.support.type.LayoutType;
15 |
16 | import java.util.ArrayList;
17 | import java.util.List;
18 |
19 | /**
20 | * Created by Ybao on 2015/11/3 0003.
21 | */
22 | public class NormalHeaderView extends BaseHeaderView {
23 | TextView textView;
24 | View tagImg;
25 | View progress;
26 | View stateImg;
27 |
28 |
29 | public NormalHeaderView(Context context) {
30 | this(context, null);
31 | }
32 |
33 | public NormalHeaderView(Context context, AttributeSet attrs) {
34 | this(context, attrs, 0);
35 | }
36 |
37 | public NormalHeaderView(Context context, AttributeSet attrs, int defStyleAttr) {
38 | super(context, attrs, defStyleAttr);
39 | init();
40 | }
41 |
42 | private void init() {
43 | LayoutInflater.from(getContext()).inflate(R.layout.view_header_normal, this, true);
44 | textView = (TextView) findViewById(R.id.text);
45 | tagImg = findViewById(R.id.tag);
46 | progress = findViewById(R.id.progress);
47 | stateImg = findViewById(R.id.state);
48 | }
49 |
50 | List animators = new ArrayList<>();
51 | @Override
52 | protected void onStateChange(int state) {
53 | if (textView == null || tagImg == null || progress == null || stateImg == null) {
54 | return;
55 | }
56 | for (Animator animator : animators) {
57 | animator.cancel();
58 | }
59 | animators.clear();
60 | stateImg.setVisibility(View.INVISIBLE);
61 | progress.setVisibility(View.INVISIBLE);
62 | textView.setVisibility(View.VISIBLE);
63 | tagImg.setVisibility(View.VISIBLE);
64 | ViewHelper.setAlpha(textView, 1);
65 | ViewHelper.setAlpha(tagImg, 1);
66 | ViewHelper.setTranslationY(stateImg, 0);
67 | ViewHelper.setTranslationY(progress, 0);
68 | switch (state) {
69 | case NONE:
70 | break;
71 | case PULLING:
72 | textView.setText("下拉刷新");
73 | animators.add(AnimUtil.startRotation(tagImg, 0));
74 | break;
75 | case LOOSENT_O_REFRESH:
76 | textView.setText("松开刷新");
77 | animators.add(AnimUtil.startRotation(tagImg, 180));
78 | break;
79 | case REFRESHING:
80 | textView.setText("正在刷新");
81 | animators.add(AnimUtil.startShow(progress, 0.1f, 400, 200));
82 | animators.add(AnimUtil.startHide(textView));
83 | animators.add(AnimUtil.startHide(tagImg));
84 | break;
85 | case REFRESH_CLONE:
86 | animators.add(AnimUtil.startFromY(stateImg, -2 * stateImg.getHeight()));
87 | animators.add(AnimUtil.startToY(progress, 2 * progress.getHeight()));
88 | stateImg.setVisibility(View.VISIBLE);
89 | progress.setVisibility(View.VISIBLE);
90 | textView.setVisibility(View.INVISIBLE);
91 | tagImg.setVisibility(View.INVISIBLE);
92 | textView.setText("刷新完成");
93 | break;
94 |
95 | }
96 |
97 | }
98 |
99 | @Override
100 | public float getSpanHeight() {
101 | return getHeight();
102 | }
103 |
104 |
105 | @Override
106 | public int getLayoutType() {
107 | return LayoutType.LAYOUT_NORMAL;
108 | }
109 | }
110 |
--------------------------------------------------------------------------------
/simple/src/main/res/anim/scale_in.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
15 |
--------------------------------------------------------------------------------
/simple/src/main/res/anim/scale_out.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
15 |
--------------------------------------------------------------------------------
/simple/src/main/res/drawable/bottom_shadow.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
--------------------------------------------------------------------------------
/simple/src/main/res/drawable/progress_large_black.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/simple/src/main/res/drawable/progress_large_white.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/simple/src/main/res/drawable/top_shadow.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/activity_all_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
20 |
21 |
26 |
27 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/activity_drawer_ep.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
15 |
16 |
20 |
21 |
22 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/activity_expand.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
15 |
16 |
21 |
22 |
27 |
28 |
33 |
34 |
39 |
40 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/activity_fling.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
13 |
14 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/activity_header.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
11 |
12 |
16 |
17 |
18 |
28 |
29 |
30 |
31 |
37 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
20 |
21 |
26 |
27 |
32 |
33 |
38 |
39 |
44 |
45 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/activity_mifling.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
13 |
14 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/activity_nestedscrolling.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
10 |
11 |
19 |
20 |
21 |
22 |
27 |
28 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/activity_normal_refresh.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
22 |
23 |
31 |
32 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/activity_normol_ep.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
15 |
19 |
20 |
21 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/activity_other.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
15 |
16 |
21 |
22 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/activity_recyclerview.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
14 |
18 |
19 |
20 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/activity_rg.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
15 |
16 |
20 |
21 |
22 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/activity_rg2.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
16 |
20 |
21 |
22 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/activity_scroller_ep.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
12 |
13 |
17 |
18 |
19 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/activity_scrollview.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
14 |
18 |
19 |
23 |
24 |
28 |
29 |
30 |
34 |
35 |
40 |
41 |
45 |
46 |
51 |
52 |
56 |
57 |
62 |
63 |
67 |
68 |
73 |
74 |
78 |
79 |
84 |
85 |
89 |
90 |
95 |
96 |
100 |
101 |
106 |
107 |
108 |
109 |
110 |
111 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/activity_textview.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
15 |
19 |
20 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/fragment0.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
16 |
17 |
21 |
22 |
23 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/fragment1.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
14 |
18 |
19 |
20 |
23 |
24 |
29 |
30 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/fragment2.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
14 |
18 |
19 |
24 |
25 |
29 |
30 |
31 |
35 |
36 |
41 |
42 |
46 |
47 |
52 |
53 |
57 |
58 |
63 |
64 |
68 |
69 |
74 |
75 |
79 |
80 |
85 |
86 |
90 |
91 |
96 |
97 |
101 |
102 |
107 |
108 |
109 |
110 |
111 |
112 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/fragment3.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
14 |
18 |
19 |
23 |
24 |
28 |
29 |
30 |
34 |
35 |
40 |
41 |
45 |
46 |
51 |
52 |
56 |
57 |
62 |
63 |
67 |
68 |
73 |
74 |
78 |
79 |
84 |
85 |
89 |
90 |
95 |
96 |
100 |
101 |
106 |
107 |
108 |
109 |
110 |
111 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/fragment4.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
14 |
18 |
19 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/item.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/view_footer_end.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
12 |
13 |
20 |
21 |
31 |
32 |
39 |
40 |
47 |
48 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/view_footer_expand.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
11 |
12 |
17 |
18 |
19 |
25 |
26 |
33 |
34 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/view_footer_lock.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
11 |
18 |
19 |
26 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/view_footer_normal.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
12 |
13 |
20 |
21 |
31 |
32 |
39 |
40 |
47 |
48 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/view_header_expand.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
12 |
13 |
18 |
19 |
20 |
26 |
27 |
34 |
35 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/view_header_lock.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
17 |
18 |
25 |
--------------------------------------------------------------------------------
/simple/src/main/res/layout/view_header_normal.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
20 |
21 |
31 |
32 |
33 |
40 |
41 |
48 |
49 |
--------------------------------------------------------------------------------
/simple/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/simple/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/simple/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/simple/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/simple/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/simple/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/simple/src/main/res/mipmap-xhdpi/ic_pull_down.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/simple/src/main/res/mipmap-xhdpi/ic_pull_down.png
--------------------------------------------------------------------------------
/simple/src/main/res/mipmap-xhdpi/ic_pull_up.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/simple/src/main/res/mipmap-xhdpi/ic_pull_up.png
--------------------------------------------------------------------------------
/simple/src/main/res/mipmap-xhdpi/id_load.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/simple/src/main/res/mipmap-xhdpi/id_load.png
--------------------------------------------------------------------------------
/simple/src/main/res/mipmap-xhdpi/id_load_b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/simple/src/main/res/mipmap-xhdpi/id_load_b.png
--------------------------------------------------------------------------------
/simple/src/main/res/mipmap-xhdpi/id_load_clone.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/simple/src/main/res/mipmap-xhdpi/id_load_clone.png
--------------------------------------------------------------------------------
/simple/src/main/res/mipmap-xhdpi/id_load_clone_b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/simple/src/main/res/mipmap-xhdpi/id_load_clone_b.png
--------------------------------------------------------------------------------
/simple/src/main/res/mipmap-xhdpi/img_header.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/simple/src/main/res/mipmap-xhdpi/img_header.png
--------------------------------------------------------------------------------
/simple/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/simple/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/simple/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/simple/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/simple/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/simple/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 |
7 |
--------------------------------------------------------------------------------
/simple/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 |
6 |
--------------------------------------------------------------------------------
/simple/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | PullRefreshView
3 |
4 |
--------------------------------------------------------------------------------
/simple/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
22 |
23 |
32 |
33 |
42 |
43 |
52 |
53 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/standardadapter/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/standardadapter/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 |
3 | android {
4 | compileSdkVersion ANDROID_BUILD_SDK_VERSION as int
5 | buildToolsVersion ANDROID_BUILD_TOOLS_VERSION
6 |
7 | defaultConfig {
8 | minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION as int
9 | targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION as int
10 | }
11 | buildTypes {
12 | release {
13 | minifyEnabled false
14 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
15 | }
16 | }
17 | }
18 |
19 | dependencies {
20 | compile 'com.android.support:recyclerview-v7:23.2.1'
21 | }
22 |
--------------------------------------------------------------------------------
/standardadapter/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 /Volumes/MacFiles/DevMode/AndroidMac/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 |
--------------------------------------------------------------------------------
/standardadapter/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/standardadapter/src/main/java/com/ybao/adapter/StandardAdapter.java:
--------------------------------------------------------------------------------
1 | package com.ybao.adapter;
2 |
3 | import android.database.DataSetObserver;
4 | import android.view.View;
5 | import android.view.ViewGroup;
6 | import android.widget.BaseAdapter;
7 |
8 | import java.util.List;
9 |
10 | /**
11 | * @author Ybao
12 | * @ClassName: tandardAdapter
13 | * @Description: TODO AbsListView 通用适配器
14 | * @date 2015年6月8日 下午5:10:18
15 | */
16 | public class StandardAdapter extends BaseAdapter {
17 | private List> mList;
18 |
19 | public StandardAdapter(List> mList) {
20 | this.mList = mList;
21 | }
22 |
23 | public StandardAdapter() {
24 | }
25 |
26 | public void setData(List> mList) {
27 | this.mList = mList;
28 | notifyDataSetChanged();
29 | }
30 |
31 | @Override
32 | public int getCount() {
33 | if (mList != null) {
34 | return mList.size();
35 | }
36 | return 0;
37 | }
38 |
39 | @Override
40 | public Object getItem(int arg0) {
41 | if (mList != null) {
42 | return mList.get(arg0);
43 | }
44 | return null;
45 | }
46 |
47 | @Override
48 | public long getItemId(int position) {
49 | return position;
50 | }
51 |
52 | public interface OnCreateViewListener {
53 | View CreateView(int position, View convertView, ViewGroup parent, List> mList);
54 | }
55 |
56 | private OnCreateViewListener mCreateViewListener;
57 |
58 | public void setOnCreateViewListener(OnCreateViewListener mCreateViewListener) {
59 | this.mCreateViewListener = mCreateViewListener;
60 | }
61 |
62 | @Override
63 | public View getView(int position, View convertView, ViewGroup parent) {
64 | if (mCreateViewListener != null) {
65 | return mCreateViewListener.CreateView(position, convertView, parent, mList);
66 | }
67 | return new View(parent.getContext());
68 | }
69 |
70 | @Override
71 | public void unregisterDataSetObserver(DataSetObserver observer) {
72 | if (observer != null) {
73 | super.unregisterDataSetObserver(observer);
74 | }
75 | }
76 |
77 | public List> getData() {
78 | return mList;
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/standardadapter/src/main/java/com/ybao/adapter/recyclerview/HeaderStandardAdapter.java:
--------------------------------------------------------------------------------
1 | package com.ybao.adapter.recyclerview;
2 |
3 | import android.support.v7.widget.GridLayoutManager;
4 | import android.support.v7.widget.RecyclerView;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 |
8 | import java.util.ArrayList;
9 | import java.util.List;
10 |
11 |
12 | /**
13 | * @author Ybao
14 | * @ClassName: HeaderStandardAdapter
15 | * @Description: TODO Recyclerview 轻松加头通用的适配器
16 | * @date 2016年7月22日 下午5:10:18
17 | */
18 | public class HeaderStandardAdapter extends StandardAdapter {
19 | public static final int TYPE_HEADER = 0;
20 | public static final int TYPE_NORMAL = 1;
21 | private List mHeaderViews;
22 | StandardAdapter standardAdapter;
23 |
24 | public HeaderStandardAdapter(StandardAdapter standardAdapter) {
25 | this.standardAdapter = standardAdapter;
26 | mHeaderViews = new ArrayList<>();
27 | }
28 |
29 | public void addHeaderView(View headerView) {
30 | if (headerView != null) {
31 | mHeaderViews.add(headerView);
32 | notifyItemInserted(0);
33 | }
34 | }
35 |
36 | public List getmHeaderViews() {
37 | return mHeaderViews;
38 | }
39 |
40 | @Override
41 | public void setData(List> mList) {
42 | standardAdapter.setData(mList);
43 | notifyDataSetChanged();
44 | }
45 |
46 | @Override
47 | public int getItemViewType(int position) {
48 | return position;
49 | }
50 |
51 | public int getViewType(int position) {
52 | if (position < mHeaderViews.size()) {
53 | return TYPE_HEADER;
54 | }
55 | return TYPE_NORMAL;
56 | }
57 |
58 | @Override
59 | public ItemViewHolder onCreateViewHolder(ViewGroup parent, int position) {
60 | int viewType = getViewType(position);
61 | ItemViewHolder holder;
62 | if (viewType != TYPE_NORMAL) {
63 | holder = new ItemViewHolder(mHeaderViews.get(position), false);
64 | } else {
65 | holder = standardAdapter.onCreateViewHolder(parent, standardAdapter.getItemViewType(position - mHeaderViews.size()));
66 | }
67 | return holder;
68 | }
69 |
70 |
71 | @Override
72 | public void onBindViewHolder(ItemViewHolder holder, int position) {
73 | if (getViewType(position) != TYPE_NORMAL) {
74 | return;
75 | }
76 | standardAdapter.onBindViewHolder(holder, position - mHeaderViews.size());
77 | holder.setItemClickListener(thisOnItemClickListener);
78 | }
79 |
80 | @Override
81 | public int getItemCount() {
82 | return standardAdapter.getItemCount() + mHeaderViews.size();
83 | }
84 |
85 | @Override
86 | public Object getItem(int arg0) {
87 | return standardAdapter.getItem(arg0 - mHeaderViews.size());
88 | }
89 |
90 | @Override
91 | public void onAttachedToRecyclerView(RecyclerView recyclerView) {
92 | super.onAttachedToRecyclerView(recyclerView);
93 | RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
94 | if (manager instanceof GridLayoutManager) {
95 | final GridLayoutManager gridManager = (GridLayoutManager) manager;
96 | gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
97 | @Override
98 | public int getSpanSize(int position) {
99 | return getViewType(position) != TYPE_NORMAL ? gridManager.getSpanCount() : 1;
100 | }
101 | });
102 | }
103 | }
104 | }
105 |
--------------------------------------------------------------------------------
/standardadapter/src/main/java/com/ybao/adapter/recyclerview/StandardAdapter.java:
--------------------------------------------------------------------------------
1 | /**
2 | * @Title: StandardAdapter.java
3 | * @Package appframe.widget.adapter.recyclerview
4 | * @Description: TODO
5 | * @author Ybao
6 | * @date 2015年6月8日 下午4:23:15
7 | * @version V1.0
8 | */
9 | package com.ybao.adapter.recyclerview;
10 |
11 | import android.support.v7.widget.RecyclerView;
12 | import android.support.v7.widget.RecyclerView.Adapter;
13 | import android.view.View;
14 | import android.view.ViewGroup;
15 |
16 | import java.util.List;
17 |
18 | /**
19 | * @author Ybao
20 | * @ClassName: StandardAdapter
21 | * @Description: TODO Recyclerview 通用的适配器
22 | * @date 2015年6月8日 下午4:23:15
23 | */
24 | public class StandardAdapter extends Adapter {
25 |
26 | private List> mList;
27 |
28 | public StandardAdapter() {
29 | }
30 |
31 | public StandardAdapter(List> mList) {
32 | this.mList = mList;
33 | }
34 |
35 | public void setData(List> mList) {
36 | this.mList = mList;
37 | notifyDataSetChanged();
38 | }
39 |
40 | @Override
41 | public int getItemCount() {
42 | if (mList != null) {
43 | return mList.size();
44 | }
45 | return 0;
46 | }
47 |
48 | @Override
49 | public void onBindViewHolder(ItemViewHolder holder, int position) {
50 | holder.setItemClickListener(thisOnItemClickListener);
51 | }
52 |
53 |
54 | @Override
55 | public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
56 | return null;
57 | }
58 |
59 | public Object getItem(int arg0) {
60 | if (mList != null && mList.size() > arg0 && arg0 >= 0) {
61 | return mList.get(arg0);
62 | }
63 | return null;
64 | }
65 |
66 | public List> getData() {
67 | return mList;
68 | }
69 |
70 |
71 | StandardAdapter.OnItemClickListener thisOnItemClickListener = new OnItemClickListener() {
72 | @Override
73 | public void onItemClick(View v, int position) {
74 | if (onItemClickListener != null) {
75 | onItemClickListener.onItemClick(v, position);
76 | }
77 |
78 | }
79 | };
80 |
81 | public static class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
82 | public ItemViewHolder(View view) {
83 | super(view);
84 | view.setOnClickListener(this);
85 | }
86 |
87 | protected ItemViewHolder(View view, boolean clickAble) {
88 | super(view);
89 | if (clickAble) {
90 | view.setOnClickListener(this);
91 | }
92 | }
93 |
94 | @Override
95 | public void onClick(View v) {
96 | int pos = getAdapterPosition();
97 | if (onItemClickListener != null) {
98 | onItemClickListener.onItemClick(v, pos);
99 | }
100 | }
101 |
102 | private OnItemClickListener onItemClickListener;
103 |
104 | public void setItemClickListener(OnItemClickListener onItemClickListener) {
105 | this.onItemClickListener = onItemClickListener;
106 | }
107 | }
108 |
109 | public interface OnItemClickListener {
110 | void onItemClick(View v, int position);
111 | }
112 |
113 | private OnItemClickListener onItemClickListener;
114 |
115 | public void setItemClickListener(OnItemClickListener onItemClickListener) {
116 | this.onItemClickListener = onItemClickListener;
117 | }
118 | }
119 |
--------------------------------------------------------------------------------
/standardadapter/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | standardadapter
3 |
4 |
--------------------------------------------------------------------------------