summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Adam Powell <adamp@google.com> 2013-03-22 01:14:28 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2013-03-22 01:14:28 +0000
commitef79366980ff229dd69b02ab7436ddc1039e8f27 (patch)
tree2437697f4b3f933d743bfc0958864838909031c1
parent86a1a245d285410d15f1995b5f72c0d0e566b2e9 (diff)
parent2a93911b87f7aac6d0dcceabc5983e81befeeda5 (diff)
Merge "Fix a stability regression in ListView arrow scrolling" into jb-mr2-dev
-rw-r--r--core/java/android/widget/ListView.java32
1 files changed, 29 insertions, 3 deletions
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index 38550a261120..4b62c2d2450f 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -2417,6 +2417,34 @@ public class ListView extends AbsListView {
}
/**
+ * Used by {@link #arrowScrollImpl(int)} to help determine the next selected position
+ * to move to. This can return a position currently not represented by a view on screen
+ * but only in the direction given.
+ *
+ * @param selectedPos Current selected position to move from
+ * @param direction Direction to move in
+ * @return Desired selected position after moving in the given direction
+ */
+ private final int nextSelectedPositionForDirection(int selectedPos, int direction) {
+ int nextSelected;
+ if (direction == View.FOCUS_DOWN) {
+ nextSelected = selectedPos != INVALID_POSITION && selectedPos >= mFirstPosition ?
+ selectedPos + 1 :
+ mFirstPosition;
+ } else {
+ final int lastPos = mFirstPosition + getChildCount() - 1;
+ nextSelected = selectedPos != INVALID_POSITION && selectedPos < lastPos?
+ selectedPos - 1 :
+ lastPos;
+ }
+
+ if (nextSelected < 0 || nextSelected >= mAdapter.getCount()) {
+ return INVALID_POSITION;
+ }
+ return lookForSelectablePosition(nextSelected, direction == View.FOCUS_DOWN);
+ }
+
+ /**
* Handle an arrow scroll going up or down. Take into account whether items are selectable,
* whether there are focusable items etc.
*
@@ -2431,9 +2459,7 @@ public class ListView extends AbsListView {
View selectedView = getSelectedView();
int selectedPos = mSelectedPosition;
- int nextSelectedPosition = (direction == View.FOCUS_DOWN) ?
- lookForSelectablePosition(selectedPos + 1, true) :
- lookForSelectablePosition(selectedPos - 1, false);
+ int nextSelectedPosition = nextSelectedPositionForDirection(selectedPos, direction);
int amountToScroll = amountToScroll(direction, nextSelectedPosition);
// if we are moving focus, we may OVERRIDE the default behavior