diff --git a/.classpath b/.classpath
deleted file mode 100644
index b76ec6c..0000000
--- a/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9c4de58
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures
diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000..c32b86b
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+PullToRefreshAndLoad
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..96cc43e
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml
new file mode 100644
index 0000000..e7bedf3
--- /dev/null
+++ b/.idea/copyright/profiles_settings.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
new file mode 100644
index 0000000..5f5c08c
--- /dev/null
+++ b/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..8f712fe
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.7
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..4a4833d
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.project b/.project
deleted file mode 100644
index e847cf9..0000000
--- a/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
- PullToRefreshAndLoad
-
-
-
-
-
- com.android.ide.eclipse.adt.ResourceManagerBuilder
-
-
-
-
- com.android.ide.eclipse.adt.PreCompilerBuilder
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
- com.android.ide.eclipse.adt.ApkBuilder
-
-
-
-
-
- com.android.ide.eclipse.adt.AndroidNature
- org.eclipse.jdt.core.javanature
-
-
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 48ab4c6..0000000
--- a/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/PullToRefreshAndLoad.iml b/PullToRefreshAndLoad.iml
new file mode 100644
index 0000000..6f66645
--- /dev/null
+++ b/PullToRefreshAndLoad.iml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..9405f3f
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,19 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ repositories {
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:1.2.3'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ }
+}
diff --git a/download/simple-debug.apk b/download/simple-debug.apk
new file mode 100644
index 0000000..c209946
Binary files /dev/null and b/download/simple-debug.apk differ
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..1d3591c
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,18 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+# Default value: -Xmx10248m -XX:MaxPermSize=256m
+# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..8c0fb64
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..0c71e76
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Apr 10 15:27:10 PDT 2013
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000..91a7e26
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..8a0b282
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/ic_launcher-web.png b/ic_launcher-web.png
deleted file mode 100644
index a18cbb4..0000000
Binary files a/ic_launcher-web.png and /dev/null differ
diff --git a/library/.gitignore b/library/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/library/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/library/build.gradle b/library/build.gradle
new file mode 100644
index 0000000..b729c1e
--- /dev/null
+++ b/library/build.gradle
@@ -0,0 +1,24 @@
+apply plugin: 'com.android.library'
+
+android {
+ compileSdkVersion 22
+ buildToolsVersion "22.0.1"
+
+ defaultConfig {
+ minSdkVersion 10
+ targetSdkVersion 22
+ versionCode 1
+ versionName "1.0"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+ compile 'com.android.support:appcompat-v7:22.1.1'
+}
diff --git a/library/library.iml b/library/library.iml
new file mode 100644
index 0000000..310c744
--- /dev/null
+++ b/library/library.iml
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/proguard-project.txt b/library/proguard-rules.pro
similarity index 62%
rename from proguard-project.txt
rename to library/proguard-rules.pro
index f2fe155..41afecb 100644
--- a/proguard-project.txt
+++ b/library/proguard-rules.pro
@@ -1,11 +1,8 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
+# in D:\Android\sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
diff --git a/library/src/androidTest/java/cn/appem/library/ApplicationTest.java b/library/src/androidTest/java/cn/appem/library/ApplicationTest.java
new file mode 100644
index 0000000..1965ac0
--- /dev/null
+++ b/library/src/androidTest/java/cn/appem/library/ApplicationTest.java
@@ -0,0 +1,13 @@
+package cn.appem.library;
+
+import android.app.Application;
+import android.test.ApplicationTestCase;
+
+/**
+ * Testing Fundamentals
+ */
+public class ApplicationTest extends ApplicationTestCase {
+ public ApplicationTest() {
+ super(Application.class);
+ }
+}
\ No newline at end of file
diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..5bb56fe
--- /dev/null
+++ b/library/src/main/AndroidManifest.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/com/jingchen/pulltorefresh/PullToRefreshLayout.java b/library/src/main/java/com/jingchen/pulltorefresh/PullToRefreshLayout.java
similarity index 74%
rename from src/com/jingchen/pulltorefresh/PullToRefreshLayout.java
rename to library/src/main/java/com/jingchen/pulltorefresh/PullToRefreshLayout.java
index a5d5752..03e9931 100644
--- a/src/com/jingchen/pulltorefresh/PullToRefreshLayout.java
+++ b/library/src/main/java/com/jingchen/pulltorefresh/PullToRefreshLayout.java
@@ -1,689 +1,661 @@
-package com.jingchen.pulltorefresh;
-
-import java.util.Timer;
-import java.util.TimerTask;
-
-import android.app.Activity;
-import android.content.Context;
-import android.os.AsyncTask;
-import android.os.Handler;
-import android.os.Message;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.animation.AnimationUtils;
-import android.view.animation.LinearInterpolator;
-import android.view.animation.RotateAnimation;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
-
-import com.jingchen.pulltorefresh.pullableview.Pullable;
-
-/**
- * 自定义的布局,用来管理三个子控件,其中一个是下拉头,一个是包含内容的pullableView(可以是实现Pullable接口的的任何View),
- * 还有一个上拉头,更多详解见博客http://blog.csdn.net/zhongkejingwang/article/details/38868463
- *
- * @author 陈靖
- */
-public class PullToRefreshLayout extends RelativeLayout
-{
- public static final String TAG = "PullToRefreshLayout";
- // 初始状态
- public static final int INIT = 0;
- // 释放刷新
- public static final int RELEASE_TO_REFRESH = 1;
- // 正在刷新
- public static final int REFRESHING = 2;
- // 释放加载
- public static final int RELEASE_TO_LOAD = 3;
- // 正在加载
- public static final int LOADING = 4;
- // 操作完毕
- public static final int DONE = 5;
- // 当前状态
- private int state = INIT;
- // 刷新回调接口
- private OnRefreshListener mListener;
- // 刷新成功
- public static final int SUCCEED = 0;
- // 刷新失败
- public static final int FAIL = 1;
- // 按下Y坐标,上一个事件点Y坐标
- private float downY, lastY;
-
- // 下拉的距离。注意:pullDownY和pullUpY不可能同时不为0
- public float pullDownY = 0;
- // 上拉的距离
- private float pullUpY = 0;
-
- // 释放刷新的距离
- private float refreshDist = 200;
- // 释放加载的距离
- private float loadmoreDist = 200;
-
- private MyTimer timer;
- // 回滚速度
- public float MOVE_SPEED = 8;
- // 第一次执行布局
- private boolean isLayout = false;
- // 在刷新过程中滑动操作
- private boolean isTouch = false;
- // 手指滑动距离与下拉头的滑动距离比,中间会随正切函数变化
- private float radio = 2;
-
- // 下拉箭头的转180°动画
- private RotateAnimation rotateAnimation;
- // 均匀旋转动画
- private RotateAnimation refreshingAnimation;
-
- // 下拉头
- private View refreshView;
- // 下拉的箭头
- private View pullView;
- // 正在刷新的图标
- private View refreshingView;
- // 刷新结果图标
- private View refreshStateImageView;
- // 刷新结果:成功或失败
- private TextView refreshStateTextView;
-
- // 上拉头
- private View loadmoreView;
- // 上拉的箭头
- private View pullUpView;
- // 正在加载的图标
- private View loadingView;
- // 加载结果图标
- private View loadStateImageView;
- // 加载结果:成功或失败
- private TextView loadStateTextView;
-
- // 实现了Pullable接口的View
- private View pullableView;
- // 过滤多点触碰
- private int mEvents;
- // 这两个变量用来控制pull的方向,如果不加控制,当情况满足可上拉又可下拉时没法下拉
- private boolean canPullDown = true;
- private boolean canPullUp = true;
-
- private Context mContext;
-
- /**
- * 执行自动回滚的handler
- */
- Handler updateHandler = new Handler()
- {
-
- @Override
- public void handleMessage(Message msg)
- {
- // 回弹速度随下拉距离moveDeltaY增大而增大
- MOVE_SPEED = (float) (8 + 5 * Math.tan(Math.PI / 2
- / getMeasuredHeight() * (pullDownY + Math.abs(pullUpY))));
- if (!isTouch)
- {
- // 正在刷新,且没有往上推的话则悬停,显示"正在刷新..."
- if (state == REFRESHING && pullDownY <= refreshDist)
- {
- pullDownY = refreshDist;
- timer.cancel();
- } else if (state == LOADING && -pullUpY <= loadmoreDist)
- {
- pullUpY = -loadmoreDist;
- timer.cancel();
- }
-
- }
- if (pullDownY > 0)
- pullDownY -= MOVE_SPEED;
- else if (pullUpY < 0)
- pullUpY += MOVE_SPEED;
- if (pullDownY < 0)
- {
- // 已完成回弹
- pullDownY = 0;
- pullView.clearAnimation();
- // 隐藏下拉头时有可能还在刷新,只有当前状态不是正在刷新时才改变状态
- if (state != REFRESHING && state != LOADING)
- changeState(INIT);
- timer.cancel();
- requestLayout();
- }
- if (pullUpY > 0)
- {
- // 已完成回弹
- pullUpY = 0;
- pullUpView.clearAnimation();
- // 隐藏上拉头时有可能还在刷新,只有当前状态不是正在刷新时才改变状态
- if (state != REFRESHING && state != LOADING)
- changeState(INIT);
- timer.cancel();
- requestLayout();
- }
- Log.d("handle", "handle");
- // 刷新布局,会自动调用onLayout
- requestLayout();
- // 没有拖拉或者回弹完成
- if (pullDownY + Math.abs(pullUpY) == 0)
- timer.cancel();
- }
-
- };
-
- public void setOnRefreshListener(OnRefreshListener listener)
- {
- mListener = listener;
- }
-
- public PullToRefreshLayout(Context context)
- {
- super(context);
- initView(context);
- }
-
- public PullToRefreshLayout(Context context, AttributeSet attrs)
- {
- super(context, attrs);
- initView(context);
- }
-
- public PullToRefreshLayout(Context context, AttributeSet attrs, int defStyle)
- {
- super(context, attrs, defStyle);
- initView(context);
- }
-
- private void initView(Context context)
- {
- mContext = context;
- timer = new MyTimer(updateHandler);
- rotateAnimation = (RotateAnimation) AnimationUtils.loadAnimation(
- context, R.anim.reverse_anim);
- refreshingAnimation = (RotateAnimation) AnimationUtils.loadAnimation(
- context, R.anim.rotating);
- // 添加匀速转动动画
- LinearInterpolator lir = new LinearInterpolator();
- rotateAnimation.setInterpolator(lir);
- refreshingAnimation.setInterpolator(lir);
- }
-
- private void hide()
- {
- timer.schedule(5);
- }
-
- /**
- * 完成刷新操作,显示刷新结果。注意:刷新完成后一定要调用这个方法
- */
- /**
- * @param refreshResult
- * PullToRefreshLayout.SUCCEED代表成功,PullToRefreshLayout.FAIL代表失败
- */
- public void refreshFinish(int refreshResult)
- {
- refreshingView.clearAnimation();
- refreshingView.setVisibility(View.GONE);
- switch (refreshResult)
- {
- case SUCCEED:
- // 刷新成功
- refreshStateImageView.setVisibility(View.VISIBLE);
- refreshStateTextView.setText(R.string.refresh_succeed);
- refreshStateImageView
- .setBackgroundResource(R.drawable.refresh_succeed);
- break;
- case FAIL:
- default:
- // 刷新失败
- refreshStateImageView.setVisibility(View.VISIBLE);
- refreshStateTextView.setText(R.string.refresh_fail);
- refreshStateImageView
- .setBackgroundResource(R.drawable.refresh_failed);
- break;
- }
- if (pullDownY > 0)
- {
- // 刷新结果停留1秒
- new Handler()
- {
- @Override
- public void handleMessage(Message msg)
- {
- changeState(DONE);
- hide();
- }
- }.sendEmptyMessageDelayed(0, 1000);
- } else
- {
- changeState(DONE);
- hide();
- }
- }
-
- /**
- * 加载完毕,显示加载结果。注意:加载完成后一定要调用这个方法
- *
- * @param refreshResult
- * PullToRefreshLayout.SUCCEED代表成功,PullToRefreshLayout.FAIL代表失败
- */
- public void loadmoreFinish(int refreshResult)
- {
- loadingView.clearAnimation();
- loadingView.setVisibility(View.GONE);
- switch (refreshResult)
- {
- case SUCCEED:
- // 加载成功
- loadStateImageView.setVisibility(View.VISIBLE);
- loadStateTextView.setText(R.string.load_succeed);
- loadStateImageView.setBackgroundResource(R.drawable.load_succeed);
- break;
- case FAIL:
- default:
- // 加载失败
- loadStateImageView.setVisibility(View.VISIBLE);
- loadStateTextView.setText(R.string.load_fail);
- loadStateImageView.setBackgroundResource(R.drawable.load_failed);
- break;
- }
- if (pullUpY < 0)
- {
- // 刷新结果停留1秒
- new Handler()
- {
- @Override
- public void handleMessage(Message msg)
- {
- changeState(DONE);
- hide();
- }
- }.sendEmptyMessageDelayed(0, 1000);
- } else
- {
- changeState(DONE);
- hide();
- }
- }
-
- private void changeState(int to)
- {
- state = to;
- switch (state)
- {
- case INIT:
- // 下拉布局初始状态
- refreshStateImageView.setVisibility(View.GONE);
- refreshStateTextView.setText(R.string.pull_to_refresh);
- pullView.clearAnimation();
- pullView.setVisibility(View.VISIBLE);
- // 上拉布局初始状态
- loadStateImageView.setVisibility(View.GONE);
- loadStateTextView.setText(R.string.pullup_to_load);
- pullUpView.clearAnimation();
- pullUpView.setVisibility(View.VISIBLE);
- break;
- case RELEASE_TO_REFRESH:
- // 释放刷新状态
- refreshStateTextView.setText(R.string.release_to_refresh);
- pullView.startAnimation(rotateAnimation);
- break;
- case REFRESHING:
- // 正在刷新状态
- pullView.clearAnimation();
- refreshingView.setVisibility(View.VISIBLE);
- pullView.setVisibility(View.INVISIBLE);
- refreshingView.startAnimation(refreshingAnimation);
- refreshStateTextView.setText(R.string.refreshing);
- break;
- case RELEASE_TO_LOAD:
- // 释放加载状态
- loadStateTextView.setText(R.string.release_to_load);
- pullUpView.startAnimation(rotateAnimation);
- break;
- case LOADING:
- // 正在加载状态
- pullUpView.clearAnimation();
- loadingView.setVisibility(View.VISIBLE);
- pullUpView.setVisibility(View.INVISIBLE);
- loadingView.startAnimation(refreshingAnimation);
- loadStateTextView.setText(R.string.loading);
- break;
- case DONE:
- // 刷新或加载完毕,啥都不做
- break;
- }
- }
-
- /**
- * 不限制上拉或下拉
- */
- private void releasePull()
- {
- canPullDown = true;
- canPullUp = true;
- }
-
- /*
- * (非 Javadoc)由父控件决定是否分发事件,防止事件冲突
- *
- * @see android.view.ViewGroup#dispatchTouchEvent(android.view.MotionEvent)
- */
- @Override
- public boolean dispatchTouchEvent(MotionEvent ev)
- {
- switch (ev.getActionMasked())
- {
- case MotionEvent.ACTION_DOWN:
- downY = ev.getY();
- lastY = downY;
- timer.cancel();
- mEvents = 0;
- releasePull();
- break;
- case MotionEvent.ACTION_POINTER_DOWN:
- case MotionEvent.ACTION_POINTER_UP:
- // 过滤多点触碰
- mEvents = -1;
- break;
- case MotionEvent.ACTION_MOVE:
- if (mEvents == 0)
- {
- if (pullDownY > 0
- || (((Pullable) pullableView).canPullDown()
- && canPullDown && state != LOADING))
- {
- // 可以下拉,正在加载时不能下拉
- // 对实际滑动距离做缩小,造成用力拉的感觉
- pullDownY = pullDownY + (ev.getY() - lastY) / radio;
- if (pullDownY < 0)
- {
- pullDownY = 0;
- canPullDown = false;
- canPullUp = true;
- }
- if (pullDownY > getMeasuredHeight())
- pullDownY = getMeasuredHeight();
- if (state == REFRESHING)
- {
- // 正在刷新的时候触摸移动
- isTouch = true;
- }
- } else if (pullUpY < 0
- || (((Pullable) pullableView).canPullUp() && canPullUp && state != REFRESHING))
- {
- // 可以上拉,正在刷新时不能上拉
- pullUpY = pullUpY + (ev.getY() - lastY) / radio;
- if (pullUpY > 0)
- {
- pullUpY = 0;
- canPullDown = true;
- canPullUp = false;
- }
- if (pullUpY < -getMeasuredHeight())
- pullUpY = -getMeasuredHeight();
- if (state == LOADING)
- {
- // 正在加载的时候触摸移动
- isTouch = true;
- }
- } else
- releasePull();
- } else
- mEvents = 0;
- lastY = ev.getY();
- // 根据下拉距离改变比例
- radio = (float) (2 + 2 * Math.tan(Math.PI / 2 / getMeasuredHeight()
- * (pullDownY + Math.abs(pullUpY))));
- if (pullDownY > 0 || pullUpY < 0)
- requestLayout();
- if (pullDownY > 0)
- {
- if (pullDownY <= refreshDist
- && (state == RELEASE_TO_REFRESH || state == DONE))
- {
- // 如果下拉距离没达到刷新的距离且当前状态是释放刷新,改变状态为下拉刷新
- changeState(INIT);
- }
- if (pullDownY >= refreshDist && state == INIT)
- {
- // 如果下拉距离达到刷新的距离且当前状态是初始状态刷新,改变状态为释放刷新
- changeState(RELEASE_TO_REFRESH);
- }
- } else if (pullUpY < 0)
- {
- // 下面是判断上拉加载的,同上,注意pullUpY是负值
- if (-pullUpY <= loadmoreDist
- && (state == RELEASE_TO_LOAD || state == DONE))
- {
- changeState(INIT);
- }
- // 上拉操作
- if (-pullUpY >= loadmoreDist && state == INIT)
- {
- changeState(RELEASE_TO_LOAD);
- }
-
- }
- // 因为刷新和加载操作不能同时进行,所以pullDownY和pullUpY不会同时不为0,因此这里用(pullDownY +
- // Math.abs(pullUpY))就可以不对当前状态作区分了
- if ((pullDownY + Math.abs(pullUpY)) > 8)
- {
- // 防止下拉过程中误触发长按事件和点击事件
- ev.setAction(MotionEvent.ACTION_CANCEL);
- }
- break;
- case MotionEvent.ACTION_UP:
- if (pullDownY > refreshDist || -pullUpY > loadmoreDist)
- // 正在刷新时往下拉(正在加载时往上拉),释放后下拉头(上拉头)不隐藏
- {
- isTouch = false;
- }
- if (state == RELEASE_TO_REFRESH)
- {
- changeState(REFRESHING);
- // 刷新操作
- if (mListener != null)
- mListener.onRefresh(this);
- } else if (state == RELEASE_TO_LOAD)
- {
- changeState(LOADING);
- // 加载操作
- if (mListener != null)
- mListener.onLoadMore(this);
- }
- hide();
- default:
- break;
- }
- // 事件分发交给父类
- super.dispatchTouchEvent(ev);
- return true;
- }
-
- /**
- * @author chenjing 自动模拟手指滑动的task
- *
- */
- private class AutoRefreshAndLoadTask extends
- AsyncTask
- {
-
- @Override
- protected String doInBackground(Integer... params)
- {
- while (pullDownY < 4 / 3 * refreshDist)
- {
- pullDownY += MOVE_SPEED;
- publishProgress(pullDownY);
- try
- {
- Thread.sleep(params[0]);
- } catch (InterruptedException e)
- {
- e.printStackTrace();
- }
- }
- return null;
- }
-
- @Override
- protected void onPostExecute(String result)
- {
- changeState(REFRESHING);
- // 刷新操作
- if (mListener != null)
- mListener.onRefresh(PullToRefreshLayout.this);
- hide();
- }
-
- @Override
- protected void onProgressUpdate(Float... values)
- {
- if (pullDownY > refreshDist)
- changeState(RELEASE_TO_REFRESH);
- requestLayout();
- }
-
- }
-
- /**
- * 自动刷新
- */
- public void autoRefresh()
- {
- AutoRefreshAndLoadTask task = new AutoRefreshAndLoadTask();
- task.execute(20);
- }
-
- /**
- * 自动加载
- */
- public void autoLoad()
- {
- pullUpY = -loadmoreDist;
- requestLayout();
- changeState(LOADING);
- // 加载操作
- if (mListener != null)
- mListener.onLoadMore(this);
- }
-
- private void initView()
- {
- // 初始化下拉布局
- pullView = refreshView.findViewById(R.id.pull_icon);
- refreshStateTextView = (TextView) refreshView
- .findViewById(R.id.state_tv);
- refreshingView = refreshView.findViewById(R.id.refreshing_icon);
- refreshStateImageView = refreshView.findViewById(R.id.state_iv);
- // 初始化上拉布局
- pullUpView = loadmoreView.findViewById(R.id.pullup_icon);
- loadStateTextView = (TextView) loadmoreView
- .findViewById(R.id.loadstate_tv);
- loadingView = loadmoreView.findViewById(R.id.loading_icon);
- loadStateImageView = loadmoreView.findViewById(R.id.loadstate_iv);
- }
-
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b)
- {
- Log.d("Test", "Test");
- if (!isLayout)
- {
- // 这里是第一次进来的时候做一些初始化
- refreshView = getChildAt(0);
- pullableView = getChildAt(1);
- loadmoreView = getChildAt(2);
- isLayout = true;
- initView();
- refreshDist = ((ViewGroup) refreshView).getChildAt(0)
- .getMeasuredHeight();
- loadmoreDist = ((ViewGroup) loadmoreView).getChildAt(0)
- .getMeasuredHeight();
- }
- // 改变子控件的布局,这里直接用(pullDownY + pullUpY)作为偏移量,这样就可以不对当前状态作区分
- refreshView.layout(0,
- (int) (pullDownY + pullUpY) - refreshView.getMeasuredHeight(),
- refreshView.getMeasuredWidth(), (int) (pullDownY + pullUpY));
- pullableView.layout(0, (int) (pullDownY + pullUpY),
- pullableView.getMeasuredWidth(), (int) (pullDownY + pullUpY)
- + pullableView.getMeasuredHeight());
- loadmoreView.layout(0,
- (int) (pullDownY + pullUpY) + pullableView.getMeasuredHeight(),
- loadmoreView.getMeasuredWidth(),
- (int) (pullDownY + pullUpY) + pullableView.getMeasuredHeight()
- + loadmoreView.getMeasuredHeight());
- }
-
- class MyTimer
- {
- private Handler handler;
- private Timer timer;
- private MyTask mTask;
-
- public MyTimer(Handler handler)
- {
- this.handler = handler;
- timer = new Timer();
- }
-
- public void schedule(long period)
- {
- if (mTask != null)
- {
- mTask.cancel();
- mTask = null;
- }
- mTask = new MyTask(handler);
- timer.schedule(mTask, 0, period);
- }
-
- public void cancel()
- {
- if (mTask != null)
- {
- mTask.cancel();
- mTask = null;
- }
- }
-
- class MyTask extends TimerTask
- {
- private Handler handler;
-
- public MyTask(Handler handler)
- {
- this.handler = handler;
- }
-
- @Override
- public void run()
- {
- handler.obtainMessage().sendToTarget();
- }
-
- }
- }
-
- /**
- * 刷新加载回调接口
- *
- * @author chenjing
- *
- */
- public interface OnRefreshListener
- {
- /**
- * 刷新操作
- */
- void onRefresh(PullToRefreshLayout pullToRefreshLayout);
-
- /**
- * 加载操作
- */
- void onLoadMore(PullToRefreshLayout pullToRefreshLayout);
- }
-
-}
+package com.jingchen.pulltorefresh;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.Context;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.os.Message;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.AnimationUtils;
+import android.view.animation.LinearInterpolator;
+import android.view.animation.RotateAnimation;
+import android.webkit.WebView;
+import android.widget.GridView;
+import android.widget.ListView;
+import android.widget.RelativeLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+import com.jingchen.pulltorefresh.pullableview.Pullable;
+import com.jingchen.pulltorefresh.pullableview.PullableDefault;
+import com.jingchen.pulltorefresh.pullableview.PullableGridView;
+import com.jingchen.pulltorefresh.pullableview.PullableListView;
+import com.jingchen.pulltorefresh.pullableview.PullableScrollView;
+import com.jingchen.pulltorefresh.pullableview.PullableWebView;
+
+/**
+ * 自定义的布局,用来管理三个子控件,其中一个是下拉头,一个是包含内容的pullableView(可以是实现Pullable接口的的任何View),
+ * 还有一个上拉头,更多详解见博客http://blog.csdn.net/zhongkejingwang/article/details/38868463
+ *
+ * @author 陈靖
+ */
+public class PullToRefreshLayout extends RelativeLayout {
+ public static final String TAG = "PullToRefreshLayout";
+ // 初始状态
+ public static final int INIT = 0;
+ // 释放刷新
+ public static final int RELEASE_TO_REFRESH = 1;
+ // 正在刷新
+ public static final int REFRESHING = 2;
+ // 释放加载
+ public static final int RELEASE_TO_LOAD = 3;
+ // 正在加载
+ public static final int LOADING = 4;
+ // 操作完毕
+ public static final int DONE = 5;
+ // 当前状态
+ private int state = INIT;
+ // 刷新回调接口
+ private OnRefreshListener mListener;
+ // 刷新成功
+ public static final int SUCCEED = 0;
+ // 刷新失败
+ public static final int FAIL = 1;
+ // 按下Y坐标,上一个事件点Y坐标
+ private float downY, lastY;
+
+ // 下拉的距离。注意:pullDownY和pullUpY不可能同时不为0
+ public float pullDownY = 0;
+ // 上拉的距离
+ private float pullUpY = 0;
+
+ // 释放刷新的距离
+ private float refreshDist = 200;
+ // 释放加载的距离
+ private float loadmoreDist = 200;
+
+ private MyTimer timer;
+ // 回滚速度
+ public float MOVE_SPEED = 8;
+ // 第一次执行布局
+ private boolean isLayout = false;
+ // 在刷新过程中滑动操作
+ private boolean isTouch = false;
+ // 手指滑动距离与下拉头的滑动距离比,中间会随正切函数变化
+ private float radio = 2;
+
+ // 下拉箭头的转180°动画
+ private RotateAnimation rotateAnimation;
+ // 均匀旋转动画
+ private RotateAnimation refreshingAnimation;
+
+ // 下拉头
+ private View refreshView;
+ // 下拉的箭头
+ private View pullView;
+ // 正在刷新的图标
+ private View refreshingView;
+ // 刷新结果图标
+ private View refreshStateImageView;
+ // 刷新结果:成功或失败
+ private TextView refreshStateTextView;
+
+ // 上拉头
+ private View loadmoreView;
+ // 上拉的箭头
+ private View pullUpView;
+ // 正在加载的图标
+ private View loadingView;
+ // 加载结果图标
+ private View loadStateImageView;
+ // 加载结果:成功或失败
+ private TextView loadStateTextView;
+
+ // Pullable接口
+ private Pullable pullable;
+ private View mContentViewContainer;
+ // 过滤多点触碰
+ private int mEvents;
+ // 这两个变量用来控制pull的方向,如果不加控制,当情况满足可上拉又可下拉时没法下拉
+ private boolean canPullDown = true;
+ private boolean canPullUp = true;
+
+ private Context mContext;
+
+ /**
+ * 执行自动回滚的handler
+ */
+ Handler updateHandler = new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+ // 回弹速度随下拉距离moveDeltaY增大而增大
+ MOVE_SPEED = (float) (8 + 5 * Math.tan(Math.PI / 2
+ / getMeasuredHeight() * (pullDownY + Math.abs(pullUpY))));
+ if (!isTouch) {
+ // 正在刷新,且没有往上推的话则悬停,显示"正在刷新..."
+ if (state == REFRESHING && pullDownY <= refreshDist) {
+ pullDownY = refreshDist;
+ timer.cancel();
+ } else if (state == LOADING && -pullUpY <= loadmoreDist) {
+ pullUpY = -loadmoreDist;
+ timer.cancel();
+ }
+
+ }
+ if (pullDownY > 0)
+ pullDownY -= MOVE_SPEED;
+ else if (pullUpY < 0)
+ pullUpY += MOVE_SPEED;
+ if (pullDownY < 0) {
+ // 已完成回弹
+ pullDownY = 0;
+ pullView.clearAnimation();
+ // 隐藏下拉头时有可能还在刷新,只有当前状态不是正在刷新时才改变状态
+ if (state != REFRESHING && state != LOADING)
+ changeState(INIT);
+ timer.cancel();
+ requestLayout();
+ }
+ if (pullUpY > 0) {
+ // 已完成回弹
+ pullUpY = 0;
+ pullUpView.clearAnimation();
+ // 隐藏上拉头时有可能还在刷新,只有当前状态不是正在刷新时才改变状态
+ if (state != REFRESHING && state != LOADING)
+ changeState(INIT);
+ timer.cancel();
+ requestLayout();
+ }
+ Log.d("handle", "handle");
+ // 刷新布局,会自动调用onLayout
+ requestLayout();
+ // 没有拖拉或者回弹完成
+ if (pullDownY + Math.abs(pullUpY) == 0)
+ timer.cancel();
+ }
+
+ };
+
+ public void setOnRefreshListener(OnRefreshListener listener) {
+ mListener = listener;
+ }
+
+ public PullToRefreshLayout(Context context) {
+ super(context);
+ initView(context);
+ }
+
+ public PullToRefreshLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ initView(context);
+ }
+
+ public PullToRefreshLayout(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ initView(context);
+ }
+
+ private void initView(Context context) {
+ mContext = context;
+ timer = new MyTimer(updateHandler);
+ rotateAnimation = (RotateAnimation) AnimationUtils.loadAnimation(
+ context, R.anim.reverse_anim);
+ refreshingAnimation = (RotateAnimation) AnimationUtils.loadAnimation(
+ context, R.anim.rotating);
+ // 添加匀速转动动画
+ LinearInterpolator lir = new LinearInterpolator();
+ rotateAnimation.setInterpolator(lir);
+ refreshingAnimation.setInterpolator(lir);
+ }
+
+ private void hide() {
+ timer.schedule(5);
+ }
+
+ /**
+ * 完成刷新操作,显示刷新结果。注意:刷新完成后一定要调用这个方法
+ *
+ * @param refreshResult
+ * PullToRefreshLayout.SUCCEED代表成功,PullToRefreshLayout.FAIL代表失败
+ */
+ public void refreshFinish(int refreshResult) {
+ refreshingView.clearAnimation();
+ refreshingView.setVisibility(View.GONE);
+ switch (refreshResult) {
+ case SUCCEED:
+ // 刷新成功
+ refreshStateImageView.setVisibility(View.VISIBLE);
+ refreshStateTextView.setText(R.string.refresh_succeed);
+ refreshStateImageView
+ .setBackgroundResource(R.drawable.refresh_succeed);
+ break;
+ case FAIL:
+ default:
+ // 刷新失败
+ refreshStateImageView.setVisibility(View.VISIBLE);
+ refreshStateTextView.setText(R.string.refresh_fail);
+ refreshStateImageView
+ .setBackgroundResource(R.drawable.refresh_failed);
+ break;
+ }
+ if (pullDownY > 0) {
+ // 刷新结果停留1秒
+ new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ changeState(DONE);
+ hide();
+ }
+ }.sendEmptyMessageDelayed(0, 1000);
+ } else {
+ changeState(DONE);
+ hide();
+ }
+ }
+
+ /**
+ * 加载完毕,显示加载结果。注意:加载完成后一定要调用这个方法
+ *
+ * @param refreshResult
+ * PullToRefreshLayout.SUCCEED代表成功,PullToRefreshLayout.FAIL代表失败
+ */
+ public void loadmoreFinish(int refreshResult) {
+ loadingView.clearAnimation();
+ loadingView.setVisibility(View.GONE);
+ switch (refreshResult) {
+ case SUCCEED:
+ // 加载成功
+ loadStateImageView.setVisibility(View.VISIBLE);
+ loadStateTextView.setText(R.string.load_succeed);
+ loadStateImageView.setBackgroundResource(R.drawable.load_succeed);
+ break;
+ case FAIL:
+ default:
+ // 加载失败
+ loadStateImageView.setVisibility(View.VISIBLE);
+ loadStateTextView.setText(R.string.load_fail);
+ loadStateImageView.setBackgroundResource(R.drawable.load_failed);
+ break;
+ }
+ if (pullUpY < 0) {
+ // 刷新结果停留1秒
+ new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ changeState(DONE);
+ hide();
+ }
+ }.sendEmptyMessageDelayed(0, 1000);
+ } else {
+ changeState(DONE);
+ hide();
+ }
+ }
+
+ private void changeState(int to) {
+ state = to;
+ switch (state) {
+ case INIT:
+ // 下拉布局初始状态
+ refreshStateImageView.setVisibility(View.GONE);
+ refreshStateTextView.setText(R.string.pull_to_refresh);
+ pullView.clearAnimation();
+ pullView.setVisibility(View.VISIBLE);
+ // 上拉布局初始状态
+ if (loadmoreView == null)
+ return;
+ loadStateImageView.setVisibility(View.GONE);
+ loadStateTextView.setText(R.string.pullup_to_load);
+ pullUpView.clearAnimation();
+ pullUpView.setVisibility(View.VISIBLE);
+ break;
+ case RELEASE_TO_REFRESH:
+ // 释放刷新状态
+ refreshStateTextView.setText(R.string.release_to_refresh);
+ pullView.startAnimation(rotateAnimation);
+ break;
+ case REFRESHING:
+ // 正在刷新状态
+ pullView.clearAnimation();
+ refreshingView.setVisibility(View.VISIBLE);
+ pullView.setVisibility(View.INVISIBLE);
+ refreshingView.startAnimation(refreshingAnimation);
+ refreshStateTextView.setText(R.string.refreshing);
+ break;
+ case RELEASE_TO_LOAD:
+ // 释放加载状态
+ loadStateTextView.setText(R.string.release_to_load);
+ pullUpView.startAnimation(rotateAnimation);
+ break;
+ case LOADING:
+ // 正在加载状态
+ pullUpView.clearAnimation();
+ loadingView.setVisibility(View.VISIBLE);
+ pullUpView.setVisibility(View.INVISIBLE);
+ loadingView.startAnimation(refreshingAnimation);
+ loadStateTextView.setText(R.string.loading);
+ break;
+ case DONE:
+ // 刷新或加载完毕,啥都不做
+ break;
+ }
+ }
+
+ /**
+ * 不限制上拉或下拉
+ */
+ private void releasePull() {
+ canPullDown = true;
+ canPullUp = true;
+ }
+
+ /*
+ * (非 Javadoc)由父控件决定是否分发事件,防止事件冲突
+ *
+ * @see android.view.ViewGroup#dispatchTouchEvent(android.view.MotionEvent)
+ */
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent ev) {
+ switch (ev.getActionMasked()) {
+ case MotionEvent.ACTION_DOWN:
+ downY = ev.getY();
+ lastY = downY;
+ timer.cancel();
+ mEvents = 0;
+ releasePull();
+ break;
+ case MotionEvent.ACTION_POINTER_DOWN:
+ case MotionEvent.ACTION_POINTER_UP:
+ // 过滤多点触碰
+ mEvents = -1;
+ break;
+ case MotionEvent.ACTION_MOVE:
+ if (mEvents == 0) {
+ if (pullDownY > 0
+ || (pullable.canPullDown() && canPullDown && state != LOADING)) {
+ // 可以下拉,正在加载时不能下拉
+ // 对实际滑动距离做缩小,造成用力拉的感觉
+ pullDownY = pullDownY + (ev.getY() - lastY) / radio;
+ if (pullDownY < 0) {
+ pullDownY = 0;
+ canPullDown = false;
+ canPullUp = true;
+ }
+ if (pullDownY > getMeasuredHeight())
+ pullDownY = getMeasuredHeight();
+ if (state == REFRESHING) {
+ // 正在刷新的时候触摸移动
+ isTouch = true;
+ }
+ } else if (pullUpY < 0
+ || (pullable.canPullUp() && canPullUp && state != REFRESHING)) {
+ // 可以上拉,正在刷新时不能上拉
+ pullUpY = pullUpY + (ev.getY() - lastY) / radio;
+ if (pullUpY > 0) {
+ pullUpY = 0;
+ canPullDown = true;
+ canPullUp = false;
+ }
+ if (pullUpY < -getMeasuredHeight())
+ pullUpY = -getMeasuredHeight();
+ if (state == LOADING) {
+ // 正在加载的时候触摸移动
+ isTouch = true;
+ }
+ } else
+ releasePull();
+ } else
+ mEvents = 0;
+ lastY = ev.getY();
+ // 根据下拉距离改变比例
+ radio = (float) (2 + 2 * Math.tan(Math.PI / 2 / getMeasuredHeight()
+ * (pullDownY + Math.abs(pullUpY))));
+ if (pullDownY > 0 || pullUpY < 0)
+ requestLayout();
+ if (pullDownY > 0) {
+ if (pullDownY <= refreshDist
+ && (state == RELEASE_TO_REFRESH || state == DONE)) {
+ // 如果下拉距离没达到刷新的距离且当前状态是释放刷新,改变状态为下拉刷新
+ changeState(INIT);
+ }
+ if (pullDownY >= refreshDist && state == INIT) {
+ // 如果下拉距离达到刷新的距离且当前状态是初始状态刷新,改变状态为释放刷新
+ changeState(RELEASE_TO_REFRESH);
+ }
+ } else if (pullUpY < 0) {
+ // 下面是判断上拉加载的,同上,注意pullUpY是负值
+ if (-pullUpY <= loadmoreDist
+ && (state == RELEASE_TO_LOAD || state == DONE)) {
+ changeState(INIT);
+ }
+ // 上拉操作
+ if (-pullUpY >= loadmoreDist && state == INIT) {
+ changeState(RELEASE_TO_LOAD);
+ }
+
+ }
+ // 因为刷新和加载操作不能同时进行,所以pullDownY和pullUpY不会同时不为0,因此这里用(pullDownY +
+ // Math.abs(pullUpY))就可以不对当前状态作区分了
+ if ((pullDownY + Math.abs(pullUpY)) > 8) {
+ // 防止下拉过程中误触发长按事件和点击事件
+ ev.setAction(MotionEvent.ACTION_CANCEL);
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ if (pullDownY > refreshDist || -pullUpY > loadmoreDist)
+ // 正在刷新时往下拉(正在加载时往上拉),释放后下拉头(上拉头)不隐藏
+ {
+ isTouch = false;
+ }
+ if (state == RELEASE_TO_REFRESH) {
+ changeState(REFRESHING);
+ // 刷新操作
+ if (mListener != null)
+ mListener.onRefresh(this);
+ } else if (state == RELEASE_TO_LOAD) {
+ changeState(LOADING);
+ // 加载操作
+ if (mListener != null)
+ mListener.onLoadMore(this);
+ }
+ hide();
+ default:
+ break;
+ }
+ // 事件分发交给父类
+ super.dispatchTouchEvent(ev);
+ return true;
+ }
+
+ /**
+ * @author chenjing 自动模拟手指滑动的task
+ *
+ */
+ private class AutoRefreshAndLoadTask extends
+ AsyncTask {
+
+ @Override
+ protected String doInBackground(Integer... params) {
+ while (pullDownY < 4 / 3 * refreshDist) {
+ pullDownY += MOVE_SPEED;
+ publishProgress(pullDownY);
+ try {
+ Thread.sleep(params[0]);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(String result) {
+ changeState(REFRESHING);
+ // 刷新操作
+ if (mListener != null)
+ mListener.onRefresh(PullToRefreshLayout.this);
+ hide();
+ }
+
+ @Override
+ protected void onProgressUpdate(Float... values) {
+ if (pullDownY > refreshDist)
+ changeState(RELEASE_TO_REFRESH);
+ requestLayout();
+ }
+
+ }
+
+ /**
+ * 自动刷新
+ */
+ public void autoRefresh() {
+ AutoRefreshAndLoadTask task = new AutoRefreshAndLoadTask();
+ task.execute(20);
+ }
+
+ /**
+ * 自动加载
+ */
+ public void autoLoad() {
+ pullUpY = -loadmoreDist;
+ requestLayout();
+ changeState(LOADING);
+ // 加载操作
+ if (mListener != null)
+ mListener.onLoadMore(this);
+ }
+
+ private void initView() {
+ // 初始化下拉布局
+ pullView = refreshView.findViewById(R.id.pull_icon);
+ refreshStateTextView = (TextView) refreshView
+ .findViewById(R.id.state_tv);
+ refreshingView = refreshView.findViewById(R.id.refreshing_icon);
+ refreshStateImageView = refreshView.findViewById(R.id.state_iv);
+ // 初始化上拉布局
+ if (loadmoreView != null) {
+ pullUpView = loadmoreView.findViewById(R.id.pullup_icon);
+ loadStateTextView = (TextView) loadmoreView
+ .findViewById(R.id.loadstate_tv);
+ loadingView = loadmoreView.findViewById(R.id.loading_icon);
+ loadStateImageView = loadmoreView.findViewById(R.id.loadstate_iv);
+ }
+ }
+
+ @SuppressLint("DrawAllocation")
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ Log.d("Test", "Test");
+ if (!isLayout) {
+ // 这里是第一次进来的时候做一些初始化
+ refreshView = getChildAt(0);
+ mContentViewContainer = getChildAt(1);
+ loadmoreView = getChildAt(2);
+
+ if (mContentViewContainer instanceof ListView) {
+ Log.i(TAG, "ListView");
+ pullable = new PullableListView(mContentViewContainer);
+ } else if (mContentViewContainer instanceof GridView) {
+ Log.i(TAG, "GridView");
+ pullable = new PullableGridView(mContentViewContainer);
+ } else if (mContentViewContainer instanceof ScrollView) {
+ Log.i(TAG, "ScrollView");
+ pullable = new PullableScrollView(mContentViewContainer);
+ } else if (mContentViewContainer instanceof WebView) {
+ Log.i(TAG, "WebView");
+ pullable = new PullableWebView(mContentViewContainer);
+ } else
+ pullable = new PullableDefault();
+
+ if (loadmoreView == null) {
+ pullable.setPullUp(false);
+ }
+ isLayout = true;
+ initView();
+ refreshDist = ((ViewGroup) refreshView).getChildAt(0)
+ .getMeasuredHeight();
+ if (loadmoreView != null)
+ loadmoreDist = ((ViewGroup) loadmoreView).getChildAt(0)
+ .getMeasuredHeight();
+ }
+ // 改变子控件的布局,这里直接用(pullDownY + pullUpY)作为偏移量,这样就可以不对当前状态作区分
+ refreshView.layout(0,
+ (int) (pullDownY + pullUpY) - refreshView.getMeasuredHeight(),
+ refreshView.getMeasuredWidth(), (int) (pullDownY + pullUpY));
+ mContentViewContainer.layout(
+ 0,
+ (int) (pullDownY + pullUpY),
+ mContentViewContainer.getMeasuredWidth(),
+ (int) (pullDownY + pullUpY)
+ + mContentViewContainer.getMeasuredHeight());
+ if (loadmoreView != null)
+ loadmoreView.layout(
+ 0,
+ (int) (pullDownY + pullUpY)
+ + mContentViewContainer.getMeasuredHeight(),
+ loadmoreView.getMeasuredWidth(),
+ (int) (pullDownY + pullUpY)
+ + mContentViewContainer.getMeasuredHeight()
+ + loadmoreView.getMeasuredHeight());
+ }
+
+ class MyTimer {
+ private Handler handler;
+ private Timer timer;
+ private MyTask mTask;
+
+ public MyTimer(Handler handler) {
+ this.handler = handler;
+ timer = new Timer();
+ }
+
+ public void schedule(long period) {
+ if (mTask != null) {
+ mTask.cancel();
+ mTask = null;
+ }
+ mTask = new MyTask(handler);
+ timer.schedule(mTask, 0, period);
+ }
+
+ public void cancel() {
+ if (mTask != null) {
+ mTask.cancel();
+ mTask = null;
+ }
+ }
+
+ class MyTask extends TimerTask {
+ private Handler handler;
+
+ public MyTask(Handler handler) {
+ this.handler = handler;
+ }
+
+ @Override
+ public void run() {
+ handler.obtainMessage().sendToTarget();
+ }
+
+ }
+ }
+
+ /**
+ * 刷新加载回调接口
+ *
+ * @author chenjing
+ *
+ */
+ public interface OnRefreshListener {
+ /**
+ * 刷新操作
+ */
+ void onRefresh(PullToRefreshLayout pullToRefreshLayout);
+
+ /**
+ * 加载操作
+ */
+ void onLoadMore(PullToRefreshLayout pullToRefreshLayout);
+ }
+
+}
diff --git a/library/src/main/java/com/jingchen/pulltorefresh/pullableview/Pullable.java b/library/src/main/java/com/jingchen/pulltorefresh/pullableview/Pullable.java
new file mode 100644
index 0000000..b4472eb
--- /dev/null
+++ b/library/src/main/java/com/jingchen/pulltorefresh/pullableview/Pullable.java
@@ -0,0 +1,35 @@
+package com.jingchen.pulltorefresh.pullableview;
+
+public abstract class Pullable {
+ /**
+ * 判断是否可以下拉,如果不需要下拉功能可以直接return false
+ *
+ * @return true如果可以下拉否则返回false
+ */
+ public abstract boolean canPullDown();
+
+ /**
+ * 判断是否可以上拉,如果不需要上拉功能可以直接return false
+ *
+ * @return true如果可以上拉否则返回false
+ */
+ public abstract boolean canPullUp();
+
+ /**
+ * 设置是否可以上拉
+ */
+ final public void setPullUp(boolean flag) {
+ canPullUp = flag;
+ }
+
+ /**
+ * 设置是否可以下拉
+ *
+ * @param flag
+ */
+ final public void setPullDown(boolean flag) {
+ canPullDown = flag;
+ }
+
+ protected boolean canPullUp = true, canPullDown = true;
+}
diff --git a/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableDefault.java b/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableDefault.java
new file mode 100644
index 0000000..e4c3b07
--- /dev/null
+++ b/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableDefault.java
@@ -0,0 +1,26 @@
+package com.jingchen.pulltorefresh.pullableview;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+public class PullableDefault extends Pullable {
+
+ public PullableDefault() {
+ }
+
+ @Override
+ public boolean canPullDown() {
+ if (!canPullDown)
+ return false;
+ return true;
+ }
+
+ @Override
+ public boolean canPullUp() {
+ if (!canPullUp)
+ return false;
+ return true;
+ }
+
+}
diff --git a/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableExpandableListView.java b/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableExpandableListView.java
new file mode 100644
index 0000000..9b94ed5
--- /dev/null
+++ b/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableExpandableListView.java
@@ -0,0 +1,49 @@
+package com.jingchen.pulltorefresh.pullableview;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ExpandableListView;
+
+public class PullableExpandableListView extends Pullable {
+ private ExpandableListView mContent;
+
+ public PullableExpandableListView(View view) {
+ mContent = (ExpandableListView) view;
+ }
+
+ @Override
+ public boolean canPullDown() {
+ if (!canPullDown)
+ return false;
+ if (mContent.getCount() == 0) {
+ // 没有item的时候也可以下拉刷新
+ return true;
+ } else if (mContent.getFirstVisiblePosition() == 0
+ && mContent.getChildAt(0).getTop() >= 0) {
+ // 滑到顶部了
+ return true;
+ } else
+ return false;
+ }
+
+ @Override
+ public boolean canPullUp() {
+ if (!canPullUp)
+ return false;
+ if (mContent.getCount() == 0) {
+ // 没有item的时候也可以上拉加载
+ return true;
+ } else if (mContent.getLastVisiblePosition() == (mContent.getCount() - 1)) {
+ // 滑到底部了
+ if (mContent.getChildAt(mContent.getLastVisiblePosition()
+ - mContent.getFirstVisiblePosition()) != null
+ && mContent.getChildAt(
+ mContent.getLastVisiblePosition()
+ - mContent.getFirstVisiblePosition())
+ .getBottom() <= mContent.getMeasuredHeight())
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableGridView.java b/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableGridView.java
new file mode 100644
index 0000000..d97a0fe
--- /dev/null
+++ b/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableGridView.java
@@ -0,0 +1,45 @@
+package com.jingchen.pulltorefresh.pullableview;
+
+import android.view.View;
+import android.widget.GridView;
+
+public class PullableGridView extends Pullable {
+ private GridView mContent;
+ public PullableGridView(View view) {
+ mContent=(GridView) view;
+ }
+
+ @Override
+ public boolean canPullDown() {
+ if (!canPullDown)
+ return false;
+ if (mContent.getCount() == 0) {
+ // 没有item的时候也可以下拉刷新
+ return true;
+ } else if (mContent.getFirstVisiblePosition() == 0
+ && mContent.getChildAt(0).getTop() >= 0) {
+ // 滑到顶部了
+ return true;
+ } else
+ return false;
+ }
+
+ @Override
+ public boolean canPullUp() {
+ if (!canPullUp)
+ return false;
+ if (mContent.getCount() == 0) {
+ // 没有item的时候也可以上拉加载
+ return true;
+ } else if (mContent.getLastVisiblePosition() == (mContent.getCount() - 1)) {
+ // 滑到底部了
+ if (mContent.getChildAt(mContent.getLastVisiblePosition() - mContent.getFirstVisiblePosition()) != null
+ && mContent.getChildAt(
+ mContent.getLastVisiblePosition()
+ - mContent.getFirstVisiblePosition()).getBottom() <= mContent.getMeasuredHeight())
+ return true;
+ }
+ return false;
+ }
+
+}
diff --git a/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableListView.java b/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableListView.java
new file mode 100644
index 0000000..629b303
--- /dev/null
+++ b/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableListView.java
@@ -0,0 +1,46 @@
+package com.jingchen.pulltorefresh.pullableview;
+
+import android.view.View;
+import android.widget.ListView;
+
+public class PullableListView extends Pullable {
+ private ListView mContent;
+
+ public PullableListView(View listView) {
+ mContent = (ListView)listView;
+ }
+
+ @Override
+ public boolean canPullDown() {
+ if (!canPullDown)
+ return false;
+ if (mContent.getCount() == 0) {
+ // 没有item的时候也可以下拉刷新
+ return true;
+ } else if (mContent.getFirstVisiblePosition() == 0
+ && mContent.getChildAt(0).getTop() >= 0) {
+ // 滑到ListView的顶部了
+ return true;
+ } else
+ return false;
+ }
+
+ public boolean canPullUp() {
+ if (!canPullUp)
+ return false;
+ if (mContent.getCount() == 0) {
+ // 没有item的时候也可以上拉加载
+ return true;
+ } else if (mContent.getLastVisiblePosition() == (mContent.getCount() - 1)) {
+ // 滑到底部了
+ if (mContent.getChildAt(mContent.getLastVisiblePosition()
+ - mContent.getFirstVisiblePosition()) != null
+ && mContent.getChildAt(
+ mContent.getLastVisiblePosition()
+ - mContent.getFirstVisiblePosition())
+ .getBottom() <= mContent.getMeasuredHeight())
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableScrollView.java b/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableScrollView.java
new file mode 100644
index 0000000..9187e0e
--- /dev/null
+++ b/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableScrollView.java
@@ -0,0 +1,35 @@
+package com.jingchen.pulltorefresh.pullableview;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ScrollView;
+
+public class PullableScrollView extends Pullable {
+ private ScrollView mContent;
+
+ public PullableScrollView(View view) {
+ mContent = (ScrollView) view;
+ }
+
+ @Override
+ public boolean canPullDown() {
+ if (!canPullDown)
+ return false;
+ if (mContent.getScrollY() == 0)
+ return true;
+ else
+ return false;
+ }
+
+ @Override
+ public boolean canPullUp() {
+ if (!canPullUp)
+ return false;
+ if (mContent.getScrollY() >= (mContent.getChildAt(0).getHeight() - mContent
+ .getMeasuredHeight()))
+ return true;
+ else
+ return false;
+ }
+}
diff --git a/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableWebView.java b/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableWebView.java
new file mode 100644
index 0000000..0ebc104
--- /dev/null
+++ b/library/src/main/java/com/jingchen/pulltorefresh/pullableview/PullableWebView.java
@@ -0,0 +1,33 @@
+package com.jingchen.pulltorefresh.pullableview;
+
+import android.view.View;
+import android.webkit.WebView;
+
+public class PullableWebView extends Pullable {
+ private WebView mContent;
+
+ public PullableWebView(View view) {
+ mContent = (WebView) view;
+ }
+
+ @Override
+ public boolean canPullDown() {
+ if (!canPullDown)
+ return false;
+ if (mContent.getScrollY() == 0)
+ return true;
+ else
+ return false;
+ }
+
+ @Override
+ public boolean canPullUp() {
+ if (!canPullUp)
+ return false;
+ if (mContent.getScrollY() >= mContent.getContentHeight()
+ * mContent.getScale() - mContent.getMeasuredHeight())
+ return true;
+ else
+ return false;
+ }
+}
diff --git a/res/anim/reverse_anim.xml b/library/src/main/res/anim/reverse_anim.xml
similarity index 96%
rename from res/anim/reverse_anim.xml
rename to library/src/main/res/anim/reverse_anim.xml
index 9c93a3a..1920915 100644
--- a/res/anim/reverse_anim.xml
+++ b/library/src/main/res/anim/reverse_anim.xml
@@ -1,11 +1,11 @@
-
-
-
+
+
+
\ No newline at end of file
diff --git a/res/anim/rotating.xml b/library/src/main/res/anim/rotating.xml
similarity index 96%
rename from res/anim/rotating.xml
rename to library/src/main/res/anim/rotating.xml
index d61254d..8fffa49 100644
--- a/res/anim/rotating.xml
+++ b/library/src/main/res/anim/rotating.xml
@@ -1,11 +1,11 @@
-
-
-
+
+
+
\ No newline at end of file
diff --git a/res/drawable-xhdpi/load_failed.png b/library/src/main/res/drawable-xhdpi/load_failed.png
similarity index 100%
rename from res/drawable-xhdpi/load_failed.png
rename to library/src/main/res/drawable-xhdpi/load_failed.png
diff --git a/res/drawable-xhdpi/load_succeed.png b/library/src/main/res/drawable-xhdpi/load_succeed.png
similarity index 100%
rename from res/drawable-xhdpi/load_succeed.png
rename to library/src/main/res/drawable-xhdpi/load_succeed.png
diff --git a/res/drawable-xhdpi/loading.png b/library/src/main/res/drawable-xhdpi/loading.png
similarity index 100%
rename from res/drawable-xhdpi/loading.png
rename to library/src/main/res/drawable-xhdpi/loading.png
diff --git a/res/drawable-xhdpi/pull_icon_big.png b/library/src/main/res/drawable-xhdpi/pull_icon_big.png
similarity index 100%
rename from res/drawable-xhdpi/pull_icon_big.png
rename to library/src/main/res/drawable-xhdpi/pull_icon_big.png
diff --git a/res/drawable-xhdpi/pullup_icon_big.png b/library/src/main/res/drawable-xhdpi/pullup_icon_big.png
similarity index 100%
rename from res/drawable-xhdpi/pullup_icon_big.png
rename to library/src/main/res/drawable-xhdpi/pullup_icon_big.png
diff --git a/res/drawable-xhdpi/refresh_failed.png b/library/src/main/res/drawable-xhdpi/refresh_failed.png
similarity index 100%
rename from res/drawable-xhdpi/refresh_failed.png
rename to library/src/main/res/drawable-xhdpi/refresh_failed.png
diff --git a/res/drawable-xhdpi/refresh_succeed.png b/library/src/main/res/drawable-xhdpi/refresh_succeed.png
similarity index 100%
rename from res/drawable-xhdpi/refresh_succeed.png
rename to library/src/main/res/drawable-xhdpi/refresh_succeed.png
diff --git a/res/drawable-xhdpi/refreshing.png b/library/src/main/res/drawable-xhdpi/refreshing.png
similarity index 100%
rename from res/drawable-xhdpi/refreshing.png
rename to library/src/main/res/drawable-xhdpi/refreshing.png
diff --git a/res/layout/load_more.xml b/library/src/main/res/layout/load_more.xml
similarity index 97%
rename from res/layout/load_more.xml
rename to library/src/main/res/layout/load_more.xml
index 89a3bed..86afacd 100644
--- a/res/layout/load_more.xml
+++ b/library/src/main/res/layout/load_more.xml
@@ -1,57 +1,57 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/refresh_head.xml b/library/src/main/res/layout/refresh_head.xml
similarity index 97%
rename from res/layout/refresh_head.xml
rename to library/src/main/res/layout/refresh_head.xml
index aa0e03c..db85ab4 100644
--- a/res/layout/refresh_head.xml
+++ b/library/src/main/res/layout/refresh_head.xml
@@ -1,57 +1,57 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/values/color.xml b/library/src/main/res/values/color.xml
similarity index 97%
rename from res/values/color.xml
rename to library/src/main/res/values/color.xml
index 0931be6..35438ae 100644
--- a/res/values/color.xml
+++ b/library/src/main/res/values/color.xml
@@ -1,7 +1,7 @@
-
-
- #FFFFFF
- #000000
- #aaaaaa
- #6593cb
-
+
+
+ #FFFFFF
+ #000000
+ #aaaaaa
+ #6593cb
+
diff --git a/res/values/strings.xml b/library/src/main/res/values/strings.xml
similarity index 83%
rename from res/values/strings.xml
rename to library/src/main/res/values/strings.xml
index 9404e0c..109c826 100644
--- a/res/values/strings.xml
+++ b/library/src/main/res/values/strings.xml
@@ -1,8 +1,7 @@
- 通用版下拉刷新上拉加载控件
- 这里是HeadView
+ PullToRefreshAndLoad
下拉刷新
释放立即刷新
正在刷新...
diff --git a/libs/android-support-v4.jar b/libs/android-support-v4.jar
deleted file mode 100644
index 9056828..0000000
Binary files a/libs/android-support-v4.jar and /dev/null differ
diff --git a/project.properties b/project.properties
deleted file mode 100644
index 85aac54..0000000
--- a/project.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-8
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..126fb4e
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include ':library', ':simple'
diff --git a/simple/.gitignore b/simple/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/simple/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/simple/build.gradle b/simple/build.gradle
new file mode 100644
index 0000000..ca7713f
--- /dev/null
+++ b/simple/build.gradle
@@ -0,0 +1,26 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 22
+ buildToolsVersion "22.0.1"
+
+ defaultConfig {
+ applicationId "com.jingchen.pulltorefresh.simple"
+ minSdkVersion 10
+ targetSdkVersion 22
+ versionCode 1
+ versionName "1.0"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+ compile 'com.android.support:appcompat-v7:22.1.1'
+ compile project(':library')
+}
diff --git a/simple/proguard-rules.pro b/simple/proguard-rules.pro
new file mode 100644
index 0000000..41afecb
--- /dev/null
+++ b/simple/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in D:\Android\sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/simple/simple.iml b/simple/simple.iml
new file mode 100644
index 0000000..9f0e2e4
--- /dev/null
+++ b/simple/simple.iml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/simple/src/androidTest/java/cn/appem/simple/ApplicationTest.java b/simple/src/androidTest/java/cn/appem/simple/ApplicationTest.java
new file mode 100644
index 0000000..c6dec75
--- /dev/null
+++ b/simple/src/androidTest/java/cn/appem/simple/ApplicationTest.java
@@ -0,0 +1,13 @@
+package cn.appem.simple;
+
+import android.app.Application;
+import android.test.ApplicationTestCase;
+
+/**
+ * Testing Fundamentals
+ */
+public class ApplicationTest extends ApplicationTestCase {
+ public ApplicationTest() {
+ super(Application.class);
+ }
+}
\ No newline at end of file
diff --git a/AndroidManifest.xml b/simple/src/main/AndroidManifest.xml
similarity index 53%
rename from AndroidManifest.xml
rename to simple/src/main/AndroidManifest.xml
index 19100e3..a0e2192 100644
--- a/AndroidManifest.xml
+++ b/simple/src/main/AndroidManifest.xml
@@ -1,6 +1,6 @@
@@ -15,7 +15,7 @@
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
@@ -23,19 +23,19 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/src/com/jingchen/pulltorefresh/MainActivity.java b/simple/src/main/java/com/jingchen/pulltorefresh/simple/MainActivity.java
similarity index 81%
rename from src/com/jingchen/pulltorefresh/MainActivity.java
rename to simple/src/main/java/com/jingchen/pulltorefresh/simple/MainActivity.java
index e074308..2624276 100644
--- a/src/com/jingchen/pulltorefresh/MainActivity.java
+++ b/simple/src/main/java/com/jingchen/pulltorefresh/simple/MainActivity.java
@@ -1,122 +1,123 @@
-package com.jingchen.pulltorefresh;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.AdapterView.OnItemLongClickListener;
-import android.widget.ListView;
-import android.widget.Toast;
-
-import com.jingchen.pulltorefresh.activity.PullableExpandableListViewActivity;
-import com.jingchen.pulltorefresh.activity.PullableGridViewActivity;
-import com.jingchen.pulltorefresh.activity.PullableImageViewActivity;
-import com.jingchen.pulltorefresh.activity.PullableListViewActivity;
-import com.jingchen.pulltorefresh.activity.PullableScrollViewActivity;
-import com.jingchen.pulltorefresh.activity.PullableTextViewActivity;
-import com.jingchen.pulltorefresh.activity.PullableWebViewActivity;
-
-/**
- * 更多详解见博客http://blog.csdn.net/zhongkejingwang/article/details/38868463
- *
- * @author 陈靖
- *
- */
-public class MainActivity extends Activity
-{
- private ListView listView;
-
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- ((PullToRefreshLayout) findViewById(R.id.refresh_view))
- .setOnRefreshListener(new MyListener());
- listView = (ListView) findViewById(R.id.content_view);
- initListView();
- }
-
- /**
- * ListView初始化方法
- */
- private void initListView()
- {
- List items = new ArrayList();
- items.add("可下拉刷新上拉加载的ListView");
- items.add("可下拉刷新上拉加载的GridView");
- items.add("可下拉刷新上拉加载的ExpandableListView");
- items.add("可下拉刷新上拉加载的SrcollView");
- items.add("可下拉刷新上拉加载的WebView");
- items.add("可下拉刷新上拉加载的ImageView");
- items.add("可下拉刷新上拉加载的TextView");
- MyAdapter adapter = new MyAdapter(this, items);
- listView.setAdapter(adapter);
- listView.setOnItemLongClickListener(new OnItemLongClickListener()
- {
-
- @Override
- public boolean onItemLongClick(AdapterView> parent, View view,
- int position, long id)
- {
- Toast.makeText(
- MainActivity.this,
- " LongClick on "
- + parent.getAdapter().getItemId(position),
- Toast.LENGTH_SHORT).show();
- return true;
- }
- });
- listView.setOnItemClickListener(new OnItemClickListener()
- {
-
- @Override
- public void onItemClick(AdapterView> parent, View view,
- int position, long id)
- {
-
- Intent it = new Intent();
- switch (position)
- {
- case 0:
- it.setClass(MainActivity.this,
- PullableListViewActivity.class);
- break;
- case 1:
- it.setClass(MainActivity.this,
- PullableGridViewActivity.class);
- break;
- case 2:
- it.setClass(MainActivity.this,
- PullableExpandableListViewActivity.class);
- break;
- case 3:
- it.setClass(MainActivity.this,
- PullableScrollViewActivity.class);
- break;
- case 4:
- it.setClass(MainActivity.this,
- PullableWebViewActivity.class);
- break;
- case 5:
- it.setClass(MainActivity.this,
- PullableImageViewActivity.class);
- break;
- case 6:
- it.setClass(MainActivity.this,
- PullableTextViewActivity.class);
- break;
-
- default:
- break;
- }
- startActivity(it);
- }
- });
- }
-}
+package com.jingchen.pulltorefresh.simple;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.AdapterView.OnItemLongClickListener;
+import android.widget.ListView;
+import android.widget.Toast;
+
+import com.jingchen.pulltorefresh.PullToRefreshLayout;
+import com.jingchen.pulltorefresh.simple.activity.PullableExpandableListViewActivity;
+import com.jingchen.pulltorefresh.simple.activity.PullableGridViewActivity;
+import com.jingchen.pulltorefresh.simple.activity.PullableImageViewActivity;
+import com.jingchen.pulltorefresh.simple.activity.PullableListViewActivity;
+import com.jingchen.pulltorefresh.simple.activity.PullableScrollViewActivity;
+import com.jingchen.pulltorefresh.simple.activity.PullableTextViewActivity;
+import com.jingchen.pulltorefresh.simple.activity.PullableWebViewActivity;
+
+/**
+ * 更多详解见博客http://blog.csdn.net/zhongkejingwang/article/details/38868463
+ *
+ * @author 陈靖
+ *
+ */
+public class MainActivity extends Activity
+{
+ private ListView listView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ ((PullToRefreshLayout) findViewById(R.id.refresh_view))
+ .setOnRefreshListener(new MyListener());
+ listView = (ListView) findViewById(R.id.content_view);
+ initListView();
+ }
+
+ /**
+ * ListView初始化方法
+ */
+ private void initListView()
+ {
+ List items = new ArrayList();
+ items.add("可下拉刷新上拉加载的ListView");
+ items.add("可下拉刷新上拉加载的GridView");
+ items.add("可下拉刷新上拉加载的ExpandableListView");
+ items.add("可下拉刷新上拉加载的SrcollView");
+ items.add("可下拉刷新上拉加载的WebView");
+ items.add("可下拉刷新上拉加载的ImageView");
+ items.add("可下拉刷新上拉加载的TextView");
+ MyAdapter adapter = new MyAdapter(this, items);
+ listView.setAdapter(adapter);
+ listView.setOnItemLongClickListener(new OnItemLongClickListener()
+ {
+
+ @Override
+ public boolean onItemLongClick(AdapterView> parent, View view,
+ int position, long id)
+ {
+ Toast.makeText(
+ MainActivity.this,
+ " LongClick on "
+ + parent.getAdapter().getItemId(position),
+ Toast.LENGTH_SHORT).show();
+ return true;
+ }
+ });
+ listView.setOnItemClickListener(new OnItemClickListener()
+ {
+
+ @Override
+ public void onItemClick(AdapterView> parent, View view,
+ int position, long id)
+ {
+
+ Intent it = new Intent();
+ switch (position)
+ {
+ case 0:
+ it.setClass(MainActivity.this,
+ PullableListViewActivity.class);
+ break;
+ case 1:
+ it.setClass(MainActivity.this,
+ PullableGridViewActivity.class);
+ break;
+ case 2:
+ it.setClass(MainActivity.this,
+ PullableExpandableListViewActivity.class);
+ break;
+ case 3:
+ it.setClass(MainActivity.this,
+ PullableScrollViewActivity.class);
+ break;
+ case 4:
+ it.setClass(MainActivity.this,
+ PullableWebViewActivity.class);
+ break;
+ case 5:
+ it.setClass(MainActivity.this,
+ PullableImageViewActivity.class);
+ break;
+ case 6:
+ it.setClass(MainActivity.this,
+ PullableTextViewActivity.class);
+ break;
+
+ default:
+ break;
+ }
+ startActivity(it);
+ }
+ });
+ }
+}
diff --git a/src/com/jingchen/pulltorefresh/MyAdapter.java b/simple/src/main/java/com/jingchen/pulltorefresh/simple/MyAdapter.java
similarity index 91%
rename from src/com/jingchen/pulltorefresh/MyAdapter.java
rename to simple/src/main/java/com/jingchen/pulltorefresh/simple/MyAdapter.java
index 19f0232..a4c507f 100644
--- a/src/com/jingchen/pulltorefresh/MyAdapter.java
+++ b/simple/src/main/java/com/jingchen/pulltorefresh/simple/MyAdapter.java
@@ -1,45 +1,45 @@
-package com.jingchen.pulltorefresh;
-
-import java.util.List;
-
-import android.content.Context;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.TextView;
-
-public class MyAdapter extends BaseAdapter {
- List items;
- Context context;
-
- public MyAdapter(Context context, List items) {
- this.context = context;
- this.items = items;
- }
-
- @Override
- public int getCount() {
- return items.size();
- }
-
- @Override
- public Object getItem(int position) {
- return items.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- View view = LayoutInflater.from(context).inflate(
- R.layout.list_item_layout, null);
- TextView tv = (TextView) view.findViewById(R.id.tv);
- tv.setText(items.get(position));
- return view;
- }
-
-}
+package com.jingchen.pulltorefresh.simple;
+
+import java.util.List;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.TextView;
+
+public class MyAdapter extends BaseAdapter {
+ List items;
+ Context context;
+
+ public MyAdapter(Context context, List items) {
+ this.context = context;
+ this.items = items;
+ }
+
+ @Override
+ public int getCount() {
+ return items.size();
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return items.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ View view = LayoutInflater.from(context).inflate(
+ R.layout.list_item_layout, null);
+ TextView tv = (TextView) view.findViewById(R.id.tv);
+ tv.setText(items.get(position));
+ return view;
+ }
+
+}
diff --git a/src/com/jingchen/pulltorefresh/MyListener.java b/simple/src/main/java/com/jingchen/pulltorefresh/simple/MyListener.java
similarity index 90%
rename from src/com/jingchen/pulltorefresh/MyListener.java
rename to simple/src/main/java/com/jingchen/pulltorefresh/simple/MyListener.java
index 83e229c..8d06843 100644
--- a/src/com/jingchen/pulltorefresh/MyListener.java
+++ b/simple/src/main/java/com/jingchen/pulltorefresh/simple/MyListener.java
@@ -1,41 +1,42 @@
-package com.jingchen.pulltorefresh;
-
-import android.os.Handler;
-import android.os.Message;
-
-import com.jingchen.pulltorefresh.PullToRefreshLayout.OnRefreshListener;
-
-public class MyListener implements OnRefreshListener
-{
-
- @Override
- public void onRefresh(final PullToRefreshLayout pullToRefreshLayout)
- {
- // 下拉刷新操作
- new Handler()
- {
- @Override
- public void handleMessage(Message msg)
- {
- // 千万别忘了告诉控件刷新完毕了哦!
- pullToRefreshLayout.refreshFinish(PullToRefreshLayout.SUCCEED);
- }
- }.sendEmptyMessageDelayed(0, 5000);
- }
-
- @Override
- public void onLoadMore(final PullToRefreshLayout pullToRefreshLayout)
- {
- // 加载操作
- new Handler()
- {
- @Override
- public void handleMessage(Message msg)
- {
- // 千万别忘了告诉控件加载完毕了哦!
- pullToRefreshLayout.loadmoreFinish(PullToRefreshLayout.SUCCEED);
- }
- }.sendEmptyMessageDelayed(0, 5000);
- }
-
-}
+package com.jingchen.pulltorefresh.simple;
+
+import android.os.Handler;
+import android.os.Message;
+
+import com.jingchen.pulltorefresh.PullToRefreshLayout;
+import com.jingchen.pulltorefresh.PullToRefreshLayout.OnRefreshListener;
+
+public class MyListener implements OnRefreshListener
+{
+
+ @Override
+ public void onRefresh(final PullToRefreshLayout pullToRefreshLayout)
+ {
+ // 下拉刷新操作
+ new Handler()
+ {
+ @Override
+ public void handleMessage(Message msg)
+ {
+ // 千万别忘了告诉控件刷新完毕了哦!
+ pullToRefreshLayout.refreshFinish(PullToRefreshLayout.SUCCEED);
+ }
+ }.sendEmptyMessageDelayed(0, 5000);
+ }
+
+ @Override
+ public void onLoadMore(final PullToRefreshLayout pullToRefreshLayout)
+ {
+ // 加载操作
+ new Handler()
+ {
+ @Override
+ public void handleMessage(Message msg)
+ {
+ // 千万别忘了告诉控件加载完毕了哦!
+ pullToRefreshLayout.loadmoreFinish(PullToRefreshLayout.SUCCEED);
+ }
+ }.sendEmptyMessageDelayed(0, 5000);
+ }
+
+}
diff --git a/src/com/jingchen/pulltorefresh/activity/PullableExpandableListViewActivity.java b/simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableExpandableListViewActivity.java
similarity index 93%
rename from src/com/jingchen/pulltorefresh/activity/PullableExpandableListViewActivity.java
rename to simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableExpandableListViewActivity.java
index 414f7f6..ecf5fbe 100644
--- a/src/com/jingchen/pulltorefresh/activity/PullableExpandableListViewActivity.java
+++ b/simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableExpandableListViewActivity.java
@@ -1,191 +1,191 @@
-package com.jingchen.pulltorefresh.activity;
-
-import android.app.Activity;
-import android.content.Context;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemLongClickListener;
-import android.widget.BaseExpandableListAdapter;
-import android.widget.ExpandableListView;
-import android.widget.ExpandableListView.OnChildClickListener;
-import android.widget.ExpandableListView.OnGroupClickListener;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.jingchen.pulltorefresh.MyListener;
-import com.jingchen.pulltorefresh.PullToRefreshLayout;
-import com.jingchen.pulltorefresh.R;
-
-public class PullableExpandableListViewActivity extends Activity
-{
- ExpandableListView expandableListView;
-
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_expandablelistview);
- ((PullToRefreshLayout) findViewById(R.id.refresh_view))
- .setOnRefreshListener(new MyListener());
- expandableListView = (ExpandableListView) findViewById(R.id.content_view);
- initExpandableListView();
- }
-
- /**
- * ExpandableListView初始化方法
- */
- private void initExpandableListView()
- {
- expandableListView.setAdapter(new ExpandableListAdapter(this));
- expandableListView.setOnChildClickListener(new OnChildClickListener()
- {
-
- @Override
- public boolean onChildClick(ExpandableListView parent, View v,
- int groupPosition, int childPosition, long id)
- {
- Toast.makeText(
- PullableExpandableListViewActivity.this,
- " Click on group " + groupPosition + " item "
- + childPosition, Toast.LENGTH_SHORT).show();
- return true;
- }
- });
- expandableListView
- .setOnItemLongClickListener(new OnItemLongClickListener()
- {
-
- @Override
- public boolean onItemLongClick(AdapterView> parent,
- View view, int position, long id)
- {
- Toast.makeText(
- PullableExpandableListViewActivity.this,
- "LongClick on "
- + parent.getAdapter().getItemId(
- position), Toast.LENGTH_SHORT)
- .show();
- return true;
- }
- });
- expandableListView.setOnGroupClickListener(new OnGroupClickListener()
- {
-
- @Override
- public boolean onGroupClick(ExpandableListView parent, View v,
- int groupPosition, long id)
- {
- if (parent.isGroupExpanded(groupPosition))
- {
- // 如果展开则关闭
- parent.collapseGroup(groupPosition);
- } else
- {
- // 如果关闭则打开,注意这里是手动打开不要默认滚动否则会有bug
- parent.expandGroup(groupPosition);
- }
- return true;
- }
- });
- }
-
- class ExpandableListAdapter extends BaseExpandableListAdapter
- {
- private String[] groupsStrings;// = new String[] { "这里是group 0",
- // "这里是group 1", "这里是group 2" };
- private String[][] groupItems;
- private Context context;
-
- public ExpandableListAdapter(Context context)
- {
- this.context = context;
- groupsStrings = new String[8];
- for (int i = 0; i < groupsStrings.length; i++)
- {
- groupsStrings[i] = new String("这里是group " + i);
- }
- groupItems = new String[8][8];
- for (int i = 0; i < groupItems.length; i++)
- for (int j = 0; j < groupItems[i].length; j++)
- {
- groupItems[i][j] = new String("这里是group " + i + "里的item "
- + j);
- }
- }
-
- @Override
- public int getGroupCount()
- {
- return groupsStrings.length;
- }
-
- @Override
- public int getChildrenCount(int groupPosition)
- {
- return groupItems[groupPosition].length;
- }
-
- @Override
- public Object getGroup(int groupPosition)
- {
- return groupsStrings[groupPosition];
- }
-
- @Override
- public Object getChild(int groupPosition, int childPosition)
- {
- return groupItems[groupPosition][childPosition];
- }
-
- @Override
- public long getGroupId(int groupPosition)
- {
- return groupPosition;
- }
-
- @Override
- public long getChildId(int groupPosition, int childPosition)
- {
- return childPosition;
- }
-
- @Override
- public boolean hasStableIds()
- {
- return true;
- }
-
- @Override
- public View getGroupView(int groupPosition, boolean isExpanded,
- View convertView, ViewGroup parent)
- {
- View view = LayoutInflater.from(context).inflate(
- R.layout.list_item_layout, null);
- TextView tv = (TextView) view.findViewById(R.id.tv);
- tv.setText(groupsStrings[groupPosition]);
- return view;
- }
-
- @Override
- public View getChildView(int groupPosition, int childPosition,
- boolean isLastChild, View convertView, ViewGroup parent)
- {
- View view = LayoutInflater.from(context).inflate(
- R.layout.list_item_layout, null);
- TextView tv = (TextView) view.findViewById(R.id.tv);
- tv.setText(groupItems[groupPosition][childPosition]);
- return view;
- }
-
- @Override
- public boolean isChildSelectable(int groupPosition, int childPosition)
- {
- return true;
- }
-
- }
-
-}
+package com.jingchen.pulltorefresh.simple.activity;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemLongClickListener;
+import android.widget.BaseExpandableListAdapter;
+import android.widget.ExpandableListView;
+import android.widget.ExpandableListView.OnChildClickListener;
+import android.widget.ExpandableListView.OnGroupClickListener;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.jingchen.pulltorefresh.simple.MyListener;
+import com.jingchen.pulltorefresh.PullToRefreshLayout;
+import com.jingchen.pulltorefresh.simple.R;
+
+public class PullableExpandableListViewActivity extends Activity
+{
+ ExpandableListView expandableListView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_expandablelistview);
+ ((PullToRefreshLayout) findViewById(R.id.refresh_view))
+ .setOnRefreshListener(new MyListener());
+ expandableListView = (ExpandableListView) findViewById(R.id.content_view);
+ initExpandableListView();
+ }
+
+ /**
+ * ExpandableListView初始化方法
+ */
+ private void initExpandableListView()
+ {
+ expandableListView.setAdapter(new ExpandableListAdapter(this));
+ expandableListView.setOnChildClickListener(new OnChildClickListener()
+ {
+
+ @Override
+ public boolean onChildClick(ExpandableListView parent, View v,
+ int groupPosition, int childPosition, long id)
+ {
+ Toast.makeText(
+ PullableExpandableListViewActivity.this,
+ " Click on group " + groupPosition + " item "
+ + childPosition, Toast.LENGTH_SHORT).show();
+ return true;
+ }
+ });
+ expandableListView
+ .setOnItemLongClickListener(new OnItemLongClickListener()
+ {
+
+ @Override
+ public boolean onItemLongClick(AdapterView> parent,
+ View view, int position, long id)
+ {
+ Toast.makeText(
+ PullableExpandableListViewActivity.this,
+ "LongClick on "
+ + parent.getAdapter().getItemId(
+ position), Toast.LENGTH_SHORT)
+ .show();
+ return true;
+ }
+ });
+ expandableListView.setOnGroupClickListener(new OnGroupClickListener()
+ {
+
+ @Override
+ public boolean onGroupClick(ExpandableListView parent, View v,
+ int groupPosition, long id)
+ {
+ if (parent.isGroupExpanded(groupPosition))
+ {
+ // 如果展开则关闭
+ parent.collapseGroup(groupPosition);
+ } else
+ {
+ // 如果关闭则打开,注意这里是手动打开不要默认滚动否则会有bug
+ parent.expandGroup(groupPosition);
+ }
+ return true;
+ }
+ });
+ }
+
+ class ExpandableListAdapter extends BaseExpandableListAdapter
+ {
+ private String[] groupsStrings;// = new String[] { "这里是group 0",
+ // "这里是group 1", "这里是group 2" };
+ private String[][] groupItems;
+ private Context context;
+
+ public ExpandableListAdapter(Context context)
+ {
+ this.context = context;
+ groupsStrings = new String[8];
+ for (int i = 0; i < groupsStrings.length; i++)
+ {
+ groupsStrings[i] = new String("这里是group " + i);
+ }
+ groupItems = new String[8][8];
+ for (int i = 0; i < groupItems.length; i++)
+ for (int j = 0; j < groupItems[i].length; j++)
+ {
+ groupItems[i][j] = new String("这里是group " + i + "里的item "
+ + j);
+ }
+ }
+
+ @Override
+ public int getGroupCount()
+ {
+ return groupsStrings.length;
+ }
+
+ @Override
+ public int getChildrenCount(int groupPosition)
+ {
+ return groupItems[groupPosition].length;
+ }
+
+ @Override
+ public Object getGroup(int groupPosition)
+ {
+ return groupsStrings[groupPosition];
+ }
+
+ @Override
+ public Object getChild(int groupPosition, int childPosition)
+ {
+ return groupItems[groupPosition][childPosition];
+ }
+
+ @Override
+ public long getGroupId(int groupPosition)
+ {
+ return groupPosition;
+ }
+
+ @Override
+ public long getChildId(int groupPosition, int childPosition)
+ {
+ return childPosition;
+ }
+
+ @Override
+ public boolean hasStableIds()
+ {
+ return true;
+ }
+
+ @Override
+ public View getGroupView(int groupPosition, boolean isExpanded,
+ View convertView, ViewGroup parent)
+ {
+ View view = LayoutInflater.from(context).inflate(
+ R.layout.list_item_layout, null);
+ TextView tv = (TextView) view.findViewById(R.id.tv);
+ tv.setText(groupsStrings[groupPosition]);
+ return view;
+ }
+
+ @Override
+ public View getChildView(int groupPosition, int childPosition,
+ boolean isLastChild, View convertView, ViewGroup parent)
+ {
+ View view = LayoutInflater.from(context).inflate(
+ R.layout.list_item_layout, null);
+ TextView tv = (TextView) view.findViewById(R.id.tv);
+ tv.setText(groupItems[groupPosition][childPosition]);
+ return view;
+ }
+
+ @Override
+ public boolean isChildSelectable(int groupPosition, int childPosition)
+ {
+ return true;
+ }
+
+ }
+
+}
diff --git a/src/com/jingchen/pulltorefresh/activity/PullableGridViewActivity.java b/simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableGridViewActivity.java
similarity index 87%
rename from src/com/jingchen/pulltorefresh/activity/PullableGridViewActivity.java
rename to simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableGridViewActivity.java
index 10c04d2..de95b74 100644
--- a/src/com/jingchen/pulltorefresh/activity/PullableGridViewActivity.java
+++ b/simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableGridViewActivity.java
@@ -1,75 +1,75 @@
-package com.jingchen.pulltorefresh.activity;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.AdapterView.OnItemLongClickListener;
-import android.widget.GridView;
-import android.widget.Toast;
-
-import com.jingchen.pulltorefresh.MyAdapter;
-import com.jingchen.pulltorefresh.MyListener;
-import com.jingchen.pulltorefresh.PullToRefreshLayout;
-import com.jingchen.pulltorefresh.R;
-
-public class PullableGridViewActivity extends Activity
-{
- GridView gridView;
-
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_gridview);
- ((PullToRefreshLayout) findViewById(R.id.refresh_view))
- .setOnRefreshListener(new MyListener());
- gridView = (GridView) findViewById(R.id.content_view);
- initGridView();
- }
-
- /**
- * GridView初始化方法
- */
- private void initGridView()
- {
- List items = new ArrayList();
- for (int i = 0; i < 30; i++)
- {
- items.add("这里是item " + i);
- }
- MyAdapter adapter = new MyAdapter(this, items);
- gridView.setAdapter(adapter);
- gridView.setOnItemLongClickListener(new OnItemLongClickListener()
- {
-
- @Override
- public boolean onItemLongClick(AdapterView> parent, View view,
- int position, long id)
- {
- Toast.makeText(
- PullableGridViewActivity.this,
- "LongClick on "
- + parent.getAdapter().getItemId(position),
- Toast.LENGTH_SHORT).show();
- return true;
- }
- });
- gridView.setOnItemClickListener(new OnItemClickListener()
- {
-
- @Override
- public void onItemClick(AdapterView> parent, View view,
- int position, long id)
- {
- Toast.makeText(PullableGridViewActivity.this,
- " Click on " + parent.getAdapter().getItemId(position),
- Toast.LENGTH_SHORT).show();
- }
- });
- }
-}
+package com.jingchen.pulltorefresh.simple.activity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.AdapterView.OnItemLongClickListener;
+import android.widget.GridView;
+import android.widget.Toast;
+
+import com.jingchen.pulltorefresh.simple.MyAdapter;
+import com.jingchen.pulltorefresh.simple.MyListener;
+import com.jingchen.pulltorefresh.PullToRefreshLayout;
+import com.jingchen.pulltorefresh.simple.R;
+
+public class PullableGridViewActivity extends Activity
+{
+ GridView gridView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_gridview);
+ ((PullToRefreshLayout) findViewById(R.id.refresh_view))
+ .setOnRefreshListener(new MyListener());
+ gridView = (GridView) findViewById(R.id.content_view);
+ initGridView();
+ }
+
+ /**
+ * GridView初始化方法
+ */
+ private void initGridView()
+ {
+ List items = new ArrayList();
+ for (int i = 0; i < 30; i++)
+ {
+ items.add("这里是item " + i);
+ }
+ MyAdapter adapter = new MyAdapter(this, items);
+ gridView.setAdapter(adapter);
+ gridView.setOnItemLongClickListener(new OnItemLongClickListener()
+ {
+
+ @Override
+ public boolean onItemLongClick(AdapterView> parent, View view,
+ int position, long id)
+ {
+ Toast.makeText(
+ PullableGridViewActivity.this,
+ "LongClick on "
+ + parent.getAdapter().getItemId(position),
+ Toast.LENGTH_SHORT).show();
+ return true;
+ }
+ });
+ gridView.setOnItemClickListener(new OnItemClickListener()
+ {
+
+ @Override
+ public void onItemClick(AdapterView> parent, View view,
+ int position, long id)
+ {
+ Toast.makeText(PullableGridViewActivity.this,
+ " Click on " + parent.getAdapter().getItemId(position),
+ Toast.LENGTH_SHORT).show();
+ }
+ });
+ }
+}
diff --git a/src/com/jingchen/pulltorefresh/activity/PullableImageViewActivity.java b/simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableImageViewActivity.java
similarity index 74%
rename from src/com/jingchen/pulltorefresh/activity/PullableImageViewActivity.java
rename to simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableImageViewActivity.java
index 6acdc20..53bcb60 100644
--- a/src/com/jingchen/pulltorefresh/activity/PullableImageViewActivity.java
+++ b/simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableImageViewActivity.java
@@ -1,20 +1,20 @@
-package com.jingchen.pulltorefresh.activity;
-
-import com.jingchen.pulltorefresh.MyListener;
-import com.jingchen.pulltorefresh.PullToRefreshLayout;
-import com.jingchen.pulltorefresh.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class PullableImageViewActivity extends Activity
-{
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_imageview);
- ((PullToRefreshLayout) findViewById(R.id.refresh_view))
- .setOnRefreshListener(new MyListener());
- }
-}
+package com.jingchen.pulltorefresh.simple.activity;
+
+import com.jingchen.pulltorefresh.simple.MyListener;
+import com.jingchen.pulltorefresh.PullToRefreshLayout;
+import com.jingchen.pulltorefresh.simple.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class PullableImageViewActivity extends Activity
+{
+ @Override
+ protected void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_imageview);
+ ((PullToRefreshLayout) findViewById(R.id.refresh_view))
+ .setOnRefreshListener(new MyListener());
+ }
+}
diff --git a/src/com/jingchen/pulltorefresh/activity/PullableListViewActivity.java b/simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableListViewActivity.java
similarity index 72%
rename from src/com/jingchen/pulltorefresh/activity/PullableListViewActivity.java
rename to simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableListViewActivity.java
index ead7be6..03f99a2 100644
--- a/src/com/jingchen/pulltorefresh/activity/PullableListViewActivity.java
+++ b/simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableListViewActivity.java
@@ -1,90 +1,78 @@
-package com.jingchen.pulltorefresh.activity;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.AdapterView.OnItemLongClickListener;
-import android.widget.ListView;
-import android.widget.Toast;
-
-import com.jingchen.pulltorefresh.MyAdapter;
-import com.jingchen.pulltorefresh.MyListener;
-import com.jingchen.pulltorefresh.PullToRefreshLayout;
-import com.jingchen.pulltorefresh.R;
-
-public class PullableListViewActivity extends Activity
-{
- private ListView listView;
- private PullToRefreshLayout ptrl;
- private boolean isFirstIn = true;
-
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_listview);
- ptrl = ((PullToRefreshLayout) findViewById(R.id.refresh_view));
- ptrl.setOnRefreshListener(new MyListener());
- listView = (ListView) findViewById(R.id.content_view);
- initListView();
- }
-
- @Override
- public void onWindowFocusChanged(boolean hasFocus)
- {
- super.onWindowFocusChanged(hasFocus);
- // 第一次进入自动刷新
- if (isFirstIn)
- {
- ptrl.autoRefresh();
- isFirstIn = false;
- }
- }
-
- /**
- * ListView初始化方法
- */
- private void initListView()
- {
- List items = new ArrayList();
- for (int i = 0; i < 30; i++)
- {
- items.add("这里是item " + i);
- }
- MyAdapter adapter = new MyAdapter(this, items);
- listView.setAdapter(adapter);
- listView.setOnItemLongClickListener(new OnItemLongClickListener()
- {
-
- @Override
- public boolean onItemLongClick(AdapterView> parent, View view,
- int position, long id)
- {
- Toast.makeText(
- PullableListViewActivity.this,
- "LongClick on "
- + parent.getAdapter().getItemId(position),
- Toast.LENGTH_SHORT).show();
- return true;
- }
- });
- listView.setOnItemClickListener(new OnItemClickListener()
- {
-
- @Override
- public void onItemClick(AdapterView> parent, View view,
- int position, long id)
- {
- Toast.makeText(PullableListViewActivity.this,
- " Click on " + parent.getAdapter().getItemId(position),
- Toast.LENGTH_SHORT).show();
- }
- });
- }
-
-}
+package com.jingchen.pulltorefresh.simple.activity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.AdapterView.OnItemLongClickListener;
+import android.widget.ListView;
+import android.widget.Toast;
+
+import com.jingchen.pulltorefresh.simple.MyAdapter;
+import com.jingchen.pulltorefresh.simple.MyListener;
+import com.jingchen.pulltorefresh.PullToRefreshLayout;
+import com.jingchen.pulltorefresh.simple.R;
+
+public class PullableListViewActivity extends Activity {
+ private ListView listView;
+ private PullToRefreshLayout ptrl;
+ private boolean isFirstIn = true;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_listview);
+ ptrl = ((PullToRefreshLayout) findViewById(R.id.refresh_view));
+ ptrl.setOnRefreshListener(new MyListener());
+ listView = (ListView) findViewById(R.id.content_view);
+ initListView();
+ }
+
+ @Override
+ public void onWindowFocusChanged(boolean hasFocus) {
+ super.onWindowFocusChanged(hasFocus);
+ // 第一次进入自动刷新
+ if (isFirstIn) {
+ ptrl.autoRefresh();
+ isFirstIn = false;
+ }
+ }
+
+ /**
+ * ListView初始化方法
+ */
+ private void initListView() {
+ List items = new ArrayList();
+ for (int i = 0; i < 30; i++) {
+ items.add("这里是item " + i);
+ }
+ MyAdapter adapter = new MyAdapter(this, items);
+ listView.setAdapter(adapter);
+ listView.setOnItemLongClickListener(new OnItemLongClickListener() {
+ @Override
+ public boolean onItemLongClick(AdapterView> parent, View view,
+ int position, long id) {
+ Toast.makeText(
+ PullableListViewActivity.this,
+ "LongClick on "
+ + parent.getAdapter().getItemId(position),
+ Toast.LENGTH_SHORT).show();
+ return true;
+ }
+ });
+ listView.setOnItemClickListener(new OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> parent, View view,
+ int position, long id) {
+ Toast.makeText(PullableListViewActivity.this,
+ " Click on " + parent.getAdapter().getItemId(position),
+ Toast.LENGTH_SHORT).show();
+ }
+ });
+ }
+
+}
diff --git a/src/com/jingchen/pulltorefresh/activity/PullableScrollViewActivity.java b/simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableScrollViewActivity.java
similarity index 74%
rename from src/com/jingchen/pulltorefresh/activity/PullableScrollViewActivity.java
rename to simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableScrollViewActivity.java
index afe0cd8..f502de1 100644
--- a/src/com/jingchen/pulltorefresh/activity/PullableScrollViewActivity.java
+++ b/simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableScrollViewActivity.java
@@ -1,20 +1,20 @@
-package com.jingchen.pulltorefresh.activity;
-
-import com.jingchen.pulltorefresh.MyListener;
-import com.jingchen.pulltorefresh.PullToRefreshLayout;
-import com.jingchen.pulltorefresh.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class PullableScrollViewActivity extends Activity
-{
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_scrollview);
- ((PullToRefreshLayout) findViewById(R.id.refresh_view))
- .setOnRefreshListener(new MyListener());
- }
-}
+package com.jingchen.pulltorefresh.simple.activity;
+
+import com.jingchen.pulltorefresh.simple.MyListener;
+import com.jingchen.pulltorefresh.PullToRefreshLayout;
+import com.jingchen.pulltorefresh.simple.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class PullableScrollViewActivity extends Activity
+{
+ @Override
+ protected void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_scrollview);
+ ((PullToRefreshLayout) findViewById(R.id.refresh_view))
+ .setOnRefreshListener(new MyListener());
+ }
+}
diff --git a/src/com/jingchen/pulltorefresh/activity/PullableTextViewActivity.java b/simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableTextViewActivity.java
similarity index 74%
rename from src/com/jingchen/pulltorefresh/activity/PullableTextViewActivity.java
rename to simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableTextViewActivity.java
index 65ec432..9b1cec8 100644
--- a/src/com/jingchen/pulltorefresh/activity/PullableTextViewActivity.java
+++ b/simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableTextViewActivity.java
@@ -1,20 +1,20 @@
-package com.jingchen.pulltorefresh.activity;
-
-import com.jingchen.pulltorefresh.MyListener;
-import com.jingchen.pulltorefresh.PullToRefreshLayout;
-import com.jingchen.pulltorefresh.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-public class PullableTextViewActivity extends Activity
-{
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_textview);
- ((PullToRefreshLayout) findViewById(R.id.refresh_view))
- .setOnRefreshListener(new MyListener());
- }
-}
+package com.jingchen.pulltorefresh.simple.activity;
+
+import com.jingchen.pulltorefresh.simple.MyListener;
+import com.jingchen.pulltorefresh.PullToRefreshLayout;
+import com.jingchen.pulltorefresh.simple.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class PullableTextViewActivity extends Activity
+{
+ @Override
+ protected void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_textview);
+ ((PullToRefreshLayout) findViewById(R.id.refresh_view))
+ .setOnRefreshListener(new MyListener());
+ }
+}
diff --git a/simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableWebViewActivity.java b/simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableWebViewActivity.java
new file mode 100644
index 0000000..c659935
--- /dev/null
+++ b/simple/src/main/java/com/jingchen/pulltorefresh/simple/activity/PullableWebViewActivity.java
@@ -0,0 +1,23 @@
+package com.jingchen.pulltorefresh.simple.activity;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.webkit.WebView;
+
+import com.jingchen.pulltorefresh.simple.MyListener;
+import com.jingchen.pulltorefresh.PullToRefreshLayout;
+import com.jingchen.pulltorefresh.simple.R;
+
+public class PullableWebViewActivity extends Activity {
+ WebView webView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_webview);
+ ((PullToRefreshLayout) findViewById(R.id.refresh_view))
+ .setOnRefreshListener(new MyListener());
+ webView = (WebView) findViewById(R.id.content_view);
+ webView.loadUrl("http://blog.csdn.net/zhongkejingwang");
+ }
+}
diff --git a/res/drawable-hdpi/ic_launcher.png b/simple/src/main/res/drawable-hdpi/ic_launcher.png
similarity index 100%
rename from res/drawable-hdpi/ic_launcher.png
rename to simple/src/main/res/drawable-hdpi/ic_launcher.png
diff --git a/res/drawable-mdpi/ic_launcher.png b/simple/src/main/res/drawable-mdpi/ic_launcher.png
similarity index 100%
rename from res/drawable-mdpi/ic_launcher.png
rename to simple/src/main/res/drawable-mdpi/ic_launcher.png
diff --git a/res/drawable-xhdpi/h.jpg b/simple/src/main/res/drawable-xhdpi/h.jpg
similarity index 100%
rename from res/drawable-xhdpi/h.jpg
rename to simple/src/main/res/drawable-xhdpi/h.jpg
diff --git a/res/drawable-xhdpi/i.jpg b/simple/src/main/res/drawable-xhdpi/i.jpg
similarity index 100%
rename from res/drawable-xhdpi/i.jpg
rename to simple/src/main/res/drawable-xhdpi/i.jpg
diff --git a/res/drawable-xhdpi/ic_launcher.png b/simple/src/main/res/drawable-xhdpi/ic_launcher.png
similarity index 100%
rename from res/drawable-xhdpi/ic_launcher.png
rename to simple/src/main/res/drawable-xhdpi/ic_launcher.png
diff --git a/res/drawable-xhdpi/j.jpg b/simple/src/main/res/drawable-xhdpi/j.jpg
similarity index 100%
rename from res/drawable-xhdpi/j.jpg
rename to simple/src/main/res/drawable-xhdpi/j.jpg
diff --git a/res/drawable-xhdpi/k.jpg b/simple/src/main/res/drawable-xhdpi/k.jpg
similarity index 100%
rename from res/drawable-xhdpi/k.jpg
rename to simple/src/main/res/drawable-xhdpi/k.jpg
diff --git a/res/drawable-xhdpi/l.jpg b/simple/src/main/res/drawable-xhdpi/l.jpg
similarity index 100%
rename from res/drawable-xhdpi/l.jpg
rename to simple/src/main/res/drawable-xhdpi/l.jpg
diff --git a/simple/src/main/res/drawable-xhdpi/load_failed.png b/simple/src/main/res/drawable-xhdpi/load_failed.png
new file mode 100644
index 0000000..23ba502
Binary files /dev/null and b/simple/src/main/res/drawable-xhdpi/load_failed.png differ
diff --git a/simple/src/main/res/drawable-xhdpi/load_succeed.png b/simple/src/main/res/drawable-xhdpi/load_succeed.png
new file mode 100644
index 0000000..0584ace
Binary files /dev/null and b/simple/src/main/res/drawable-xhdpi/load_succeed.png differ
diff --git a/simple/src/main/res/drawable-xhdpi/loading.png b/simple/src/main/res/drawable-xhdpi/loading.png
new file mode 100644
index 0000000..25fb10e
Binary files /dev/null and b/simple/src/main/res/drawable-xhdpi/loading.png differ
diff --git a/res/drawable-xhdpi/m.jpg b/simple/src/main/res/drawable-xhdpi/m.jpg
similarity index 100%
rename from res/drawable-xhdpi/m.jpg
rename to simple/src/main/res/drawable-xhdpi/m.jpg
diff --git a/simple/src/main/res/drawable-xhdpi/pull_icon_big.png b/simple/src/main/res/drawable-xhdpi/pull_icon_big.png
new file mode 100644
index 0000000..4d9385e
Binary files /dev/null and b/simple/src/main/res/drawable-xhdpi/pull_icon_big.png differ
diff --git a/simple/src/main/res/drawable-xhdpi/pullup_icon_big.png b/simple/src/main/res/drawable-xhdpi/pullup_icon_big.png
new file mode 100644
index 0000000..eb8fbaf
Binary files /dev/null and b/simple/src/main/res/drawable-xhdpi/pullup_icon_big.png differ
diff --git a/simple/src/main/res/drawable-xhdpi/refresh_failed.png b/simple/src/main/res/drawable-xhdpi/refresh_failed.png
new file mode 100644
index 0000000..23ba502
Binary files /dev/null and b/simple/src/main/res/drawable-xhdpi/refresh_failed.png differ
diff --git a/simple/src/main/res/drawable-xhdpi/refresh_succeed.png b/simple/src/main/res/drawable-xhdpi/refresh_succeed.png
new file mode 100644
index 0000000..0584ace
Binary files /dev/null and b/simple/src/main/res/drawable-xhdpi/refresh_succeed.png differ
diff --git a/simple/src/main/res/drawable-xhdpi/refreshing.png b/simple/src/main/res/drawable-xhdpi/refreshing.png
new file mode 100644
index 0000000..25fb10e
Binary files /dev/null and b/simple/src/main/res/drawable-xhdpi/refreshing.png differ
diff --git a/res/drawable-xxhdpi/ic_launcher.png b/simple/src/main/res/drawable-xxhdpi/ic_launcher.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_launcher.png
rename to simple/src/main/res/drawable-xxhdpi/ic_launcher.png
diff --git a/res/layout/activity_expandablelistview.xml b/simple/src/main/res/layout/activity_expandablelistview.xml
similarity index 87%
rename from res/layout/activity_expandablelistview.xml
rename to simple/src/main/res/layout/activity_expandablelistview.xml
index cb132a2..369a2a2 100644
--- a/res/layout/activity_expandablelistview.xml
+++ b/simple/src/main/res/layout/activity_expandablelistview.xml
@@ -1,19 +1,19 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/activity_gridview.xml b/simple/src/main/res/layout/activity_gridview.xml
similarity index 90%
rename from res/layout/activity_gridview.xml
rename to simple/src/main/res/layout/activity_gridview.xml
index 4294102..0bb22a8 100644
--- a/res/layout/activity_gridview.xml
+++ b/simple/src/main/res/layout/activity_gridview.xml
@@ -1,23 +1,23 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/activity_imageview.xml b/simple/src/main/res/layout/activity_imageview.xml
similarity index 88%
rename from res/layout/activity_imageview.xml
rename to simple/src/main/res/layout/activity_imageview.xml
index 1af364d..aa55751 100644
--- a/res/layout/activity_imageview.xml
+++ b/simple/src/main/res/layout/activity_imageview.xml
@@ -1,17 +1,17 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/activity_listview.xml b/simple/src/main/res/layout/activity_listview.xml
similarity index 89%
rename from res/layout/activity_listview.xml
rename to simple/src/main/res/layout/activity_listview.xml
index 910312e..8422ba2 100644
--- a/res/layout/activity_listview.xml
+++ b/simple/src/main/res/layout/activity_listview.xml
@@ -1,19 +1,19 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/activity_main.xml b/simple/src/main/res/layout/activity_main.xml
similarity index 93%
rename from res/layout/activity_main.xml
rename to simple/src/main/res/layout/activity_main.xml
index f0af3c3..0f2b8f0 100644
--- a/res/layout/activity_main.xml
+++ b/simple/src/main/res/layout/activity_main.xml
@@ -1,85 +1,84 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/activity_scrollview.xml b/simple/src/main/res/layout/activity_scrollview.xml
similarity index 92%
rename from res/layout/activity_scrollview.xml
rename to simple/src/main/res/layout/activity_scrollview.xml
index fb90680..2a791db 100644
--- a/res/layout/activity_scrollview.xml
+++ b/simple/src/main/res/layout/activity_scrollview.xml
@@ -1,56 +1,56 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/activity_textview.xml b/simple/src/main/res/layout/activity_textview.xml
similarity index 90%
rename from res/layout/activity_textview.xml
rename to simple/src/main/res/layout/activity_textview.xml
index 6da0e71..7b86905 100644
--- a/res/layout/activity_textview.xml
+++ b/simple/src/main/res/layout/activity_textview.xml
@@ -1,22 +1,22 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/activity_webview.xml b/simple/src/main/res/layout/activity_webview.xml
similarity index 87%
rename from res/layout/activity_webview.xml
rename to simple/src/main/res/layout/activity_webview.xml
index b6ca29f..d6b5f45 100644
--- a/res/layout/activity_webview.xml
+++ b/simple/src/main/res/layout/activity_webview.xml
@@ -1,16 +1,16 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/list_item_layout.xml b/simple/src/main/res/layout/list_item_layout.xml
similarity index 97%
rename from res/layout/list_item_layout.xml
rename to simple/src/main/res/layout/list_item_layout.xml
index f4df03c..d557a63 100644
--- a/res/layout/list_item_layout.xml
+++ b/simple/src/main/res/layout/list_item_layout.xml
@@ -1,16 +1,16 @@
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/simple/src/main/res/layout/load_more.xml b/simple/src/main/res/layout/load_more.xml
new file mode 100644
index 0000000..86afacd
--- /dev/null
+++ b/simple/src/main/res/layout/load_more.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/simple/src/main/res/layout/refresh_head.xml b/simple/src/main/res/layout/refresh_head.xml
new file mode 100644
index 0000000..db85ab4
--- /dev/null
+++ b/simple/src/main/res/layout/refresh_head.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/values-sw600dp/dimens.xml b/simple/src/main/res/values-sw600dp/dimens.xml
similarity index 96%
rename from res/values-sw600dp/dimens.xml
rename to simple/src/main/res/values-sw600dp/dimens.xml
index c876987..44f01db 100644
--- a/res/values-sw600dp/dimens.xml
+++ b/simple/src/main/res/values-sw600dp/dimens.xml
@@ -1,8 +1,8 @@
-
-
-
-
-
+ screen margins) for sw600dp devices (e.g. 7" tablets) here.
+ -->
+
+
diff --git a/res/values-sw720dp-land/dimens.xml b/simple/src/main/res/values-sw720dp-land/dimens.xml
similarity index 97%
rename from res/values-sw720dp-land/dimens.xml
rename to simple/src/main/res/values-sw720dp-land/dimens.xml
index 0df3067..61e3fa8 100644
--- a/res/values-sw720dp-land/dimens.xml
+++ b/simple/src/main/res/values-sw720dp-land/dimens.xml
@@ -1,9 +1,9 @@
-
-
-
- 128dp
-
-
+ screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here.
+ -->
+ 128dp
+
+
diff --git a/simple/src/main/res/values/color.xml b/simple/src/main/res/values/color.xml
new file mode 100644
index 0000000..35438ae
--- /dev/null
+++ b/simple/src/main/res/values/color.xml
@@ -0,0 +1,7 @@
+
+
+ #FFFFFF
+ #000000
+ #aaaaaa
+ #6593cb
+
diff --git a/res/values/dimens.xml b/simple/src/main/res/values/dimens.xml
similarity index 96%
rename from res/values/dimens.xml
rename to simple/src/main/res/values/dimens.xml
index 2e0e2ae..55c1e59 100644
--- a/res/values/dimens.xml
+++ b/simple/src/main/res/values/dimens.xml
@@ -1,7 +1,7 @@
-
-
-
- 16dp
- 16dp
-
-
+
+
+
+ 16dp
+ 16dp
+
+
diff --git a/simple/src/main/res/values/strings.xml b/simple/src/main/res/values/strings.xml
new file mode 100644
index 0000000..fda62c4
--- /dev/null
+++ b/simple/src/main/res/values/strings.xml
@@ -0,0 +1,7 @@
+
+
+
+ 通用版下拉刷新上拉加载控件
+ 这里是HeadView
+
+
\ No newline at end of file
diff --git a/res/values/styles.xml b/simple/src/main/res/values/styles.xml
similarity index 89%
rename from res/values/styles.xml
rename to simple/src/main/res/values/styles.xml
index 1f56fa2..f11f745 100644
--- a/res/values/styles.xml
+++ b/simple/src/main/res/values/styles.xml
@@ -1,3 +1,3 @@
-
-
-
+
+
+
diff --git a/src/com/jingchen/pulltorefresh/activity/PullableWebViewActivity.java b/src/com/jingchen/pulltorefresh/activity/PullableWebViewActivity.java
deleted file mode 100644
index 5282d64..0000000
--- a/src/com/jingchen/pulltorefresh/activity/PullableWebViewActivity.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.jingchen.pulltorefresh.activity;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.webkit.WebView;
-
-import com.jingchen.pulltorefresh.MyListener;
-import com.jingchen.pulltorefresh.PullToRefreshLayout;
-import com.jingchen.pulltorefresh.R;
-
-public class PullableWebViewActivity extends Activity
-{
- WebView webView;
-
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_webview);
- ((PullToRefreshLayout) findViewById(R.id.refresh_view))
- .setOnRefreshListener(new MyListener());
- webView = (WebView) findViewById(R.id.content_view);
- webView.loadUrl("http://blog.csdn.net/zhongkejingwang");
- }
-}
diff --git a/src/com/jingchen/pulltorefresh/pullableview/Pullable.java b/src/com/jingchen/pulltorefresh/pullableview/Pullable.java
deleted file mode 100644
index 7f306f3..0000000
--- a/src/com/jingchen/pulltorefresh/pullableview/Pullable.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.jingchen.pulltorefresh.pullableview;
-
-public interface Pullable
-{
- /**
- * 判断是否可以下拉,如果不需要下拉功能可以直接return false
- *
- * @return true如果可以下拉否则返回false
- */
- boolean canPullDown();
-
- /**
- * 判断是否可以上拉,如果不需要上拉功能可以直接return false
- *
- * @return true如果可以上拉否则返回false
- */
- boolean canPullUp();
-}
diff --git a/src/com/jingchen/pulltorefresh/pullableview/PullableExpandableListView.java b/src/com/jingchen/pulltorefresh/pullableview/PullableExpandableListView.java
deleted file mode 100644
index 1c72001..0000000
--- a/src/com/jingchen/pulltorefresh/pullableview/PullableExpandableListView.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.jingchen.pulltorefresh.pullableview;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.ExpandableListView;
-
-public class PullableExpandableListView extends ExpandableListView implements
- Pullable
-{
-
- public PullableExpandableListView(Context context)
- {
- super(context);
- }
-
- public PullableExpandableListView(Context context, AttributeSet attrs)
- {
- super(context, attrs);
- }
-
- public PullableExpandableListView(Context context, AttributeSet attrs,
- int defStyle)
- {
- super(context, attrs, defStyle);
- }
-
- @Override
- public boolean canPullDown()
- {
- if (getCount() == 0)
- {
- // 没有item的时候也可以下拉刷新
- return true;
- } else if (getFirstVisiblePosition() == 0
- && getChildAt(0).getTop() >= 0)
- {
- // 滑到顶部了
- return true;
- } else
- return false;
- }
-
- @Override
- public boolean canPullUp()
- {
- if (getCount() == 0)
- {
- // 没有item的时候也可以上拉加载
- return true;
- } else if (getLastVisiblePosition() == (getCount() - 1))
- {
- // 滑到底部了
- if (getChildAt(getLastVisiblePosition() - getFirstVisiblePosition()) != null
- && getChildAt(
- getLastVisiblePosition()
- - getFirstVisiblePosition()).getBottom() <= getMeasuredHeight())
- return true;
- }
- return false;
- }
-
-}
diff --git a/src/com/jingchen/pulltorefresh/pullableview/PullableGridView.java b/src/com/jingchen/pulltorefresh/pullableview/PullableGridView.java
deleted file mode 100644
index f9cc969..0000000
--- a/src/com/jingchen/pulltorefresh/pullableview/PullableGridView.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.jingchen.pulltorefresh.pullableview;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.GridView;
-
-public class PullableGridView extends GridView implements Pullable
-{
-
- public PullableGridView(Context context)
- {
- super(context);
- }
-
- public PullableGridView(Context context, AttributeSet attrs)
- {
- super(context, attrs);
- }
-
- public PullableGridView(Context context, AttributeSet attrs, int defStyle)
- {
- super(context, attrs, defStyle);
- }
-
- @Override
- public boolean canPullDown()
- {
- if (getCount() == 0)
- {
- // 没有item的时候也可以下拉刷新
- return true;
- } else if (getFirstVisiblePosition() == 0
- && getChildAt(0).getTop() >= 0)
- {
- // 滑到顶部了
- return true;
- } else
- return false;
- }
-
- @Override
- public boolean canPullUp()
- {
- if (getCount() == 0)
- {
- // 没有item的时候也可以上拉加载
- return true;
- } else if (getLastVisiblePosition() == (getCount() - 1))
- {
- // 滑到底部了
- if (getChildAt(getLastVisiblePosition() - getFirstVisiblePosition()) != null
- && getChildAt(
- getLastVisiblePosition()
- - getFirstVisiblePosition()).getBottom() <= getMeasuredHeight())
- return true;
- }
- return false;
- }
-
-}
diff --git a/src/com/jingchen/pulltorefresh/pullableview/PullableImageView.java b/src/com/jingchen/pulltorefresh/pullableview/PullableImageView.java
deleted file mode 100644
index 5747627..0000000
--- a/src/com/jingchen/pulltorefresh/pullableview/PullableImageView.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.jingchen.pulltorefresh.pullableview;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.ImageView;
-
-
-public class PullableImageView extends ImageView implements Pullable
-{
-
- public PullableImageView(Context context)
- {
- super(context);
- }
-
- public PullableImageView(Context context, AttributeSet attrs)
- {
- super(context, attrs);
- }
-
- public PullableImageView(Context context, AttributeSet attrs, int defStyle)
- {
- super(context, attrs, defStyle);
- }
-
- @Override
- public boolean canPullDown()
- {
- return true;
- }
-
- @Override
- public boolean canPullUp()
- {
- return true;
- }
-
-}
diff --git a/src/com/jingchen/pulltorefresh/pullableview/PullableListView.java b/src/com/jingchen/pulltorefresh/pullableview/PullableListView.java
deleted file mode 100644
index 5cf43ce..0000000
--- a/src/com/jingchen/pulltorefresh/pullableview/PullableListView.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.jingchen.pulltorefresh.pullableview;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.widget.ListView;
-
-public class PullableListView extends ListView implements Pullable
-{
-
- public PullableListView(Context context)
- {
- super(context);
- }
-
- public PullableListView(Context context, AttributeSet attrs)
- {
- super(context, attrs);
- }
-
- public PullableListView(Context context, AttributeSet attrs, int defStyle)
- {
- super(context, attrs, defStyle);
- }
-
- @Override
- public boolean canPullDown()
- {
- if (getCount() == 0)
- {
- // 没有item的时候也可以下拉刷新
- return true;
- } else if (getFirstVisiblePosition() == 0
- && getChildAt(0).getTop() >= 0)
- {
- // 滑到ListView的顶部了
- return true;
- } else
- return false;
- }
-
- @Override
- public boolean canPullUp()
- {
- if (getCount() == 0)
- {
- // 没有item的时候也可以上拉加载
- return true;
- } else if (getLastVisiblePosition() == (getCount() - 1))
- {
- // 滑到底部了
- if (getChildAt(getLastVisiblePosition() - getFirstVisiblePosition()) != null
- && getChildAt(
- getLastVisiblePosition()
- - getFirstVisiblePosition()).getBottom() <= getMeasuredHeight())
- return true;
- }
- return false;
- }
-}
diff --git a/src/com/jingchen/pulltorefresh/pullableview/PullableScrollView.java b/src/com/jingchen/pulltorefresh/pullableview/PullableScrollView.java
deleted file mode 100644
index 34cf801..0000000
--- a/src/com/jingchen/pulltorefresh/pullableview/PullableScrollView.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.jingchen.pulltorefresh.pullableview;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.ScrollView;
-
-public class PullableScrollView extends ScrollView implements Pullable
-{
-
- public PullableScrollView(Context context)
- {
- super(context);
- }
-
- public PullableScrollView(Context context, AttributeSet attrs)
- {
- super(context, attrs);
- }
-
- public PullableScrollView(Context context, AttributeSet attrs, int defStyle)
- {
- super(context, attrs, defStyle);
- }
-
- @Override
- public boolean canPullDown()
- {
- if (getScrollY() == 0)
- return true;
- else
- return false;
- }
-
- @Override
- public boolean canPullUp()
- {
- if (getScrollY() >= (getChildAt(0).getHeight() - getMeasuredHeight()))
- return true;
- else
- return false;
- }
-
-}
diff --git a/src/com/jingchen/pulltorefresh/pullableview/PullableTextView.java b/src/com/jingchen/pulltorefresh/pullableview/PullableTextView.java
deleted file mode 100644
index 054d635..0000000
--- a/src/com/jingchen/pulltorefresh/pullableview/PullableTextView.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.jingchen.pulltorefresh.pullableview;
-
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.widget.TextView;
-
-public class PullableTextView extends TextView implements Pullable
-{
-
- public PullableTextView(Context context)
- {
- super(context);
- }
-
- public PullableTextView(Context context, AttributeSet attrs)
- {
- super(context, attrs);
- }
-
- public PullableTextView(Context context, AttributeSet attrs, int defStyle)
- {
- super(context, attrs, defStyle);
- }
-
- @Override
- public boolean canPullDown()
- {
- return true;
- }
-
- @Override
- public boolean canPullUp()
- {
- return true;
- }
-
-}
diff --git a/src/com/jingchen/pulltorefresh/pullableview/PullableWebView.java b/src/com/jingchen/pulltorefresh/pullableview/PullableWebView.java
deleted file mode 100644
index 8fb52b4..0000000
--- a/src/com/jingchen/pulltorefresh/pullableview/PullableWebView.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.jingchen.pulltorefresh.pullableview;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.webkit.WebView;
-
-public class PullableWebView extends WebView implements Pullable
-{
-
- public PullableWebView(Context context)
- {
- super(context);
- }
-
- public PullableWebView(Context context, AttributeSet attrs)
- {
- super(context, attrs);
- }
-
- public PullableWebView(Context context, AttributeSet attrs, int defStyle)
- {
- super(context, attrs, defStyle);
- }
-
- @Override
- public boolean canPullDown()
- {
- if (getScrollY() == 0)
- return true;
- else
- return false;
- }
-
- @Override
- public boolean canPullUp()
- {
- if (getScrollY() >= getContentHeight() * getScale()
- - getMeasuredHeight())
- return true;
- else
- return false;
- }
-}