summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/widget/AbsListView.java6
-rw-r--r--core/java/android/widget/ListView.java31
2 files changed, 30 insertions, 7 deletions
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index a1c3fa2..ce236c0 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -381,12 +381,12 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
/**
* Maximum distance to overscroll by
*/
- private int mOverscrollMax;
+ int mOverscrollMax;
/**
* Content height divided by this is the overscroll limit.
*/
- private static final int OVERSCROLL_LIMIT_DIVISOR = 3;
+ static final int OVERSCROLL_LIMIT_DIVISOR = 3;
/**
* Used to request a layout when we changed touch mode
@@ -2390,7 +2390,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
awakenScrollBars();
}
- private int getOverscrollMax() {
+ int getOverscrollMax() {
final int childCount = getChildCount();
if (childCount > 0) {
return Math.min(mOverscrollMax,
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index 0594844..27700fd 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -1250,10 +1250,19 @@ public class ListView extends AbsListView {
int findMotionRow(int y) {
int childCount = getChildCount();
if (childCount > 0) {
- for (int i = 0; i < childCount; i++) {
- View v = getChildAt(i);
- if (y <= v.getBottom()) {
- return mFirstPosition + i;
+ if (!mStackFromBottom) {
+ for (int i = 0; i < childCount; i++) {
+ View v = getChildAt(i);
+ if (y <= v.getBottom()) {
+ return mFirstPosition + i;
+ }
+ }
+ } else {
+ for (int i = childCount - 1; i >= 0; i--) {
+ View v = getChildAt(i);
+ if (y >= v.getTop()) {
+ return mFirstPosition + i;
+ }
}
}
}
@@ -3682,6 +3691,20 @@ public class ListView extends AbsListView {
mCheckedIdStates.clear();
}
}
+
+ @Override
+ int getOverscrollMax() {
+ if (mStackFromBottom) {
+ final int childCount = getChildCount();
+ if (childCount > 0) {
+ return Math.min(mOverscrollMax,
+ (getHeight() - getChildAt(0).getTop()) / OVERSCROLL_LIMIT_DIVISOR);
+ } else {
+ return mOverscrollMax;
+ }
+ }
+ return super.getOverscrollMax();
+ }
static class SavedState extends BaseSavedState {
SparseBooleanArray checkState;