diff options
| author | 2013-02-22 21:29:44 +0000 | |
|---|---|---|
| committer | 2013-02-22 21:29:44 +0000 | |
| commit | d61ff77ee10b2c956df153e08b850e852ff5df57 (patch) | |
| tree | b0e0c202ebfa8dddfb8f20e1b28c48489fa4b554 | |
| parent | 08a92a335fd84ca427b55c6c2d39f72970d82b76 (diff) | |
| parent | db68fac12daa2cf4a7568308995e218aed92728a (diff) | |
Merge "Fix ListView is not scrolled properly with arrows"
| -rw-r--r-- | core/java/android/widget/ListView.java | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index 69e3177e74b1..4436fbbf2a9e 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -2429,7 +2429,9 @@ public class ListView extends AbsListView { View selectedView = getSelectedView(); int selectedPos = mSelectedPosition; - int nextSelectedPosition = lookForSelectablePositionOnScreen(direction); + int nextSelectedPosition = (direction == View.FOCUS_DOWN) ? + lookForSelectablePosition(selectedPos + 1, true) : + lookForSelectablePosition(selectedPos - 1, false); int amountToScroll = amountToScroll(direction, nextSelectedPosition); // if we are moving focus, we may OVERRIDE the default behavior @@ -2641,14 +2643,18 @@ public class ListView extends AbsListView { final int listBottom = getHeight() - mListPadding.bottom; final int listTop = mListPadding.top; - final int numChildren = getChildCount(); + int numChildren = getChildCount(); if (direction == View.FOCUS_DOWN) { int indexToMakeVisible = numChildren - 1; if (nextSelectedPosition != INVALID_POSITION) { indexToMakeVisible = nextSelectedPosition - mFirstPosition; } - + while (numChildren <= indexToMakeVisible) { + // Child to view is not attached yet. + addViewBelow(getChildAt(numChildren - 1), mFirstPosition + numChildren - 1); + numChildren++; + } final int positionToMakeVisible = mFirstPosition + indexToMakeVisible; final View viewToMakeVisible = getChildAt(indexToMakeVisible); @@ -2682,6 +2688,12 @@ public class ListView extends AbsListView { if (nextSelectedPosition != INVALID_POSITION) { indexToMakeVisible = nextSelectedPosition - mFirstPosition; } + while (indexToMakeVisible < 0) { + // Child to view is not attached yet. + addViewAbove(getChildAt(0), mFirstPosition); + mFirstPosition--; + indexToMakeVisible = nextSelectedPosition - mFirstPosition; + } final int positionToMakeVisible = mFirstPosition + indexToMakeVisible; final View viewToMakeVisible = getChildAt(indexToMakeVisible); int goalTop = listTop; |