Fix issues with ListView.smoothScrollBy
Change-Id: I4a2752c56a1d2ad3227644f764d6be7a02c9eb8d
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 06880a1..e87455c 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -2849,8 +2849,9 @@
final int lastViewHeight = lastView.getHeight();
final int lastViewTop = lastView.getTop();
final int lastViewPixelsShowing = listHeight - lastViewTop;
+ final int extraScroll = lastPos < mItemCount - 1 ? mExtraScroll : mListPadding.bottom;
- smoothScrollBy(lastViewHeight - lastViewPixelsShowing + mExtraScroll,
+ smoothScrollBy(lastViewHeight - lastViewPixelsShowing + extraScroll,
mScrollDuration);
mLastSeenPos = lastPos;
@@ -2862,7 +2863,10 @@
case MOVE_DOWN_BOUND: {
final int nextViewIndex = 1;
- if (firstPos == mBoundPos || getChildCount() <= nextViewIndex) {
+ final int childCount = getChildCount();
+
+ if (firstPos == mBoundPos || childCount <= nextViewIndex
+ || firstPos + childCount >= mItemCount) {
return;
}
final int nextPos = firstPos + nextViewIndex;
@@ -2904,8 +2908,9 @@
return;
}
final int firstViewTop = firstView.getTop();
+ final int extraScroll = firstPos > 0 ? mExtraScroll : mListPadding.top;
- smoothScrollBy(firstViewTop - mExtraScroll, mScrollDuration);
+ smoothScrollBy(firstViewTop - extraScroll, mScrollDuration);
mLastSeenPos = firstPos;
@@ -3075,7 +3080,10 @@
final boolean down = incrementalDeltaY < 0;
- hideSelector();
+ final boolean inTouchMode = isInTouchMode();
+ if (inTouchMode) {
+ hideSelector();
+ }
final int headerViewsCount = getHeaderViewsCount();
final int footerViewsStart = mItemCount - getFooterViewsCount();
@@ -3138,7 +3146,7 @@
if (down) {
mFirstPosition += count;
}
-
+
invalidate();
final int absIncrementalDeltaY = Math.abs(incrementalDeltaY);
@@ -3146,6 +3154,10 @@
fillGap(down);
}
+ if (!inTouchMode && mSelectedPosition != INVALID_POSITION) {
+ positionSelector(getChildAt(mSelectedPosition - mFirstPosition));
+ }
+
mBlockLayoutRequests = false;
invokeOnItemScrollListener();