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; - } -}