diff --git a/.gitignore b/.gitignore
index 3ce23fa..4ac6b31 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,4 +25,13 @@ horizontallistview/bin
horizontallistview/gen
sample/bin
sample/gen
-library/pom.xml
\ No newline at end of file
+library/pom.xml
+
+# Files to be ignored
+*~
+android-support-v4.jar
+R.java
+project.properties
+lint.xml
+.DS_STORE
+.factorypath
\ No newline at end of file
diff --git a/library/src/main/.classpath b/library/src/main/.classpath
new file mode 100644
index 0000000..9055b18
--- /dev/null
+++ b/library/src/main/.classpath
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/library/src/main/.project b/library/src/main/.project
new file mode 100644
index 0000000..4082740
--- /dev/null
+++ b/library/src/main/.project
@@ -0,0 +1,33 @@
+
+
+ main
+
+
+
+
+
+ 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/library/src/main/.settings/org.eclipse.jdt.core.prefs b/library/src/main/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..b080d2d
--- /dev/null
+++ b/library/src/main/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,4 @@
+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/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml
index 26fab17..6a96f1a 100644
--- a/library/src/main/AndroidManifest.xml
+++ b/library/src/main/AndroidManifest.xml
@@ -1,5 +1,10 @@
-
+
-
+
-
+
+
+
\ No newline at end of file
diff --git a/library/src/main/java/it/sephiroth/android/library/widget/AbsHListView.java b/library/src/main/java/it/sephiroth/android/library/widget/AbsHListView.java
index c47f4f3..c4db898 100644
--- a/library/src/main/java/it/sephiroth/android/library/widget/AbsHListView.java
+++ b/library/src/main/java/it/sephiroth/android/library/widget/AbsHListView.java
@@ -1,5 +1,14 @@
package it.sephiroth.android.library.widget;
+import it.sephiroth.android.library.R;
+import it.sephiroth.android.library.util.ViewHelperFactory;
+import it.sephiroth.android.library.util.ViewHelperFactory.ViewHelper;
+import it.sephiroth.android.library.util.v11.MultiChoiceModeListener;
+import it.sephiroth.android.library.util.v11.MultiChoiceModeWrapper;
+
+import java.util.ArrayList;
+import java.util.List;
+
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
@@ -46,20 +55,12 @@
import android.widget.ListAdapter;
import android.widget.ListView;
-import java.util.ArrayList;
-import java.util.List;
-
-import it.sephiroth.android.library.R;
-import it.sephiroth.android.library.util.ViewHelperFactory;
-import it.sephiroth.android.library.util.ViewHelperFactory.ViewHelper;
-import it.sephiroth.android.library.util.v11.MultiChoiceModeListener;
-import it.sephiroth.android.library.util.v11.MultiChoiceModeWrapper;
-
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public abstract class AbsHListView extends AdapterView implements ViewTreeObserver.OnGlobalLayoutListener,
ViewTreeObserver.OnTouchModeChangeListener {
private static final String TAG = "AbsListView";
+ public static int CHILD_WIDTH;
/**
* Disables the transcript mode.
@@ -3664,7 +3665,7 @@ void reportScrollStateChange( int newState ) {
}
}
}
-
+
/**
* Responsible for fling behavior. Use {@link #start(int)} to initiate a fling. Each frame of the fling is handled in
* {@link #run()}. A FlingRunnable will keep re-posting itself until the fling is done.
@@ -3717,12 +3718,31 @@ void start( int initialVelocity ) {
int initialX = initialVelocity < 0 ? Integer.MAX_VALUE : 0;
mLastFlingX = initialX;
mScroller.setInterpolator( null );
- mScroller.fling( initialX, 0, initialVelocity, 0, 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE );
+
+ mScroller.fling( initialX, 0, initialVelocity, 0, 0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE,getScrollX() );
mTouchMode = TOUCH_MODE_FLING;
- mViewHelper.postOnAnimation( this );
+ mViewHelper.postOnAnimation(this);
+ }
+
+ int getScrollX() {
+ View firstChild = getChildAt(0);
+ int scrollX = 0;
+ if (getFirstVisiblePosition() == 0) {
+ scrollX = (-firstChild.getLeft());
+ CHILD_WIDTH = (int) (firstChild.getMeasuredWidth() - (32 * getResources()
+ .getDisplayMetrics().density));
+ } else if (getFirstVisiblePosition() > 0) {
+ scrollX = (int) (-firstChild.getLeft()
+ + (firstChild.getMeasuredWidth() + (32 * getResources()
+ .getDisplayMetrics().density)) + (getFirstVisiblePosition() - 1)
+ * (firstChild.getMeasuredWidth()));
+
+ CHILD_WIDTH = firstChild.getMeasuredWidth();
+ }
+ return scrollX;
}
- void startSpringback() {
+ void startSpringback() {
if ( mScroller.springBack( getScrollX(), 0, 0, 0, 0, 0 ) ) {
mTouchMode = TOUCH_MODE_OVERFLING;
invalidate();
@@ -3735,7 +3755,7 @@ void startSpringback() {
void startOverfling( int initialVelocity ) {
mScroller.setInterpolator( null );
- mScroller.fling( getScrollX(), 0, initialVelocity, 0, Integer.MIN_VALUE, Integer.MAX_VALUE, 0, 0, getWidth(), 0 );
+ mScroller.fling( getScrollX(), 0, initialVelocity, 0, Integer.MIN_VALUE, Integer.MAX_VALUE, 0, 0, getWidth(), 0,getScrollX() );
mTouchMode = TOUCH_MODE_OVERFLING;
invalidate();
mViewHelper.postOnAnimation( this );
diff --git a/library/src/main/java/it/sephiroth/android/library/widget/OverScroller.java b/library/src/main/java/it/sephiroth/android/library/widget/OverScroller.java
index e664c99..a5f15cc 100644
--- a/library/src/main/java/it/sephiroth/android/library/widget/OverScroller.java
+++ b/library/src/main/java/it/sephiroth/android/library/widget/OverScroller.java
@@ -424,8 +424,8 @@ public boolean springBack(int startX, int startY, int minX, int maxX, int minY,
}
public void fling(int startX, int startY, int velocityX, int velocityY,
- int minX, int maxX, int minY, int maxY) {
- fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY, 0, 0);
+ int minX, int maxX, int minY, int maxY,int scrollX) {
+ fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY, 0, 0,scrollX);
}
/**
@@ -456,7 +456,7 @@ public void fling(int startX, int startY, int velocityX, int velocityY,
* direction will be possible.
*/
public void fling(int startX, int startY, int velocityX, int velocityY,
- int minX, int maxX, int minY, int maxY, int overX, int overY) {
+ int minX, int maxX, int minY, int maxY, int overX, int overY,int scrollX) {
// Continue a scroll or fling in progress
if (mFlywheel && !isFinished()) {
float oldVelocityX = mScrollerX.mCurrVelocity;
@@ -469,8 +469,8 @@ public void fling(int startX, int startY, int velocityX, int velocityY,
}
mMode = FLING_MODE;
- mScrollerX.fling(startX, velocityX, minX, maxX, overX);
- mScrollerY.fling(startY, velocityY, minY, maxY, overY);
+ mScrollerX.fling(startX, velocityX, minX, maxX, overX,scrollX);
+ mScrollerY.fling(startY, velocityY, minY, maxY, overY,scrollX);
}
/**
@@ -768,7 +768,7 @@ private void startSpringback(int start, int end, int velocity) {
mDuration = (int) (1000.0 * Math.sqrt(-2.0 * delta / mDeceleration));
}
- void fling(int start, int velocity, int min, int max, int over) {
+ void fling(int start, int velocity, int min, int max, int over,int scrollX) {
mOver = over;
mFinished = false;
mCurrVelocity = mVelocity = velocity;
@@ -789,9 +789,21 @@ void fling(int start, int velocity, int min, int max, int over) {
totalDistance = getSplineFlingDistance(velocity);
}
- mSplineDistance = (int) (totalDistance * Math.signum(velocity));
- mFinal = start + mSplineDistance;
+ mSplineDistance = (int) (totalDistance * 1.5 * Math
+ .signum(velocity));
+ int totalDistanceToScroll = mSplineDistance + scrollX;
+ int initPosition = scrollX / AbsHListView.CHILD_WIDTH;
+ int position = totalDistanceToScroll / AbsHListView.CHILD_WIDTH;
+ if (position == initPosition) {
+ mDuration = mSplineDuration = mSplineDuration + 100;
+ if (mSplineDistance > 0)
+ position = position + 1;
+
+ }
+ mSplineDistance = position * AbsHListView.CHILD_WIDTH - scrollX;
+ mFinal = start + mSplineDistance;
+
// Clamp to a valid final position
if (mFinal < min) {
adjustDuration(mStart, mFinal, min);
@@ -855,7 +867,7 @@ private void startAfterEdge(int start, int min, int max, int velocity) {
} else {
final double totalDistance = getSplineFlingDistance(velocity);
if (totalDistance > Math.abs(overDistance)) {
- fling(start, velocity, positive ? min : start, positive ? start : max, mOver);
+ fling(start, velocity, positive ? min : start, positive ? start : max, mOver,0);
} else {
startSpringback(start, edge, velocity);
}
diff --git a/library/src/main/project.properties b/library/src/main/project.properties
new file mode 100644
index 0000000..91d2b02
--- /dev/null
+++ b/library/src/main/project.properties
@@ -0,0 +1,15 @@
+# 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-19
+android.library=true