Merge "Fix bug 3324981 - Inconsistent/buggy FastScroll behavior" into honeycomb

This commit is contained in:
Adam Powell
2011-01-09 21:38:05 -08:00
committed by Android (Google) Code Review

View File

@@ -18,7 +18,6 @@ package android.widget;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
@@ -407,7 +406,10 @@ class FastScroller {
// Are there enough pages to require fast scroll? Recompute only if total count changes
if (mItemCount != totalItemCount && visibleItemCount > 0) {
mItemCount = totalItemCount;
mLongList = mAlwaysShow || mItemCount / visibleItemCount >= MIN_PAGES;
mLongList = mItemCount / visibleItemCount >= MIN_PAGES;
}
if (mAlwaysShow) {
mLongList = true;
}
if (!mLongList) {
if (mState != STATE_NONE) {
@@ -416,8 +418,8 @@ class FastScroller {
return;
}
if (totalItemCount - visibleItemCount > 0 && mState != STATE_DRAGGING ) {
mThumbY = ((mList.getHeight() - mThumbH) * firstVisibleItem)
/ (totalItemCount - visibleItemCount);
mThumbY = getThumbPositionForListPosition(firstVisibleItem, visibleItemCount,
totalItemCount);
if (mChangedBounds) {
resetThumbPos();
mChangedBounds = false;
@@ -579,6 +581,49 @@ class FastScroller {
}
}
private int getThumbPositionForListPosition(int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
if (mSectionIndexer == null) {
getSectionsFromIndexer();
}
if (mSectionIndexer == null) {
return ((mList.getHeight() - mThumbH) * firstVisibleItem)
/ (totalItemCount - visibleItemCount);
}
firstVisibleItem -= mListOffset;
if (firstVisibleItem < 0) {
return 0;
}
totalItemCount -= mListOffset;
final int trackHeight = mList.getHeight() - mThumbH;
final int section = mSectionIndexer.getSectionForPosition(firstVisibleItem);
final int sectionPos = mSectionIndexer.getPositionForSection(section);
final int nextSectionPos = mSectionIndexer.getPositionForSection(section + 1);
final int sectionCount = mSectionIndexer.getSections().length;
final int positionsInSection = nextSectionPos - sectionPos;
final View child = mList.getChildAt(0);
final float incrementalPos = firstVisibleItem +
(float) (mList.getPaddingTop() - child.getTop()) / child.getHeight();
final float posWithinSection = (incrementalPos - sectionPos) / positionsInSection;
int result = (int) ((section + posWithinSection) / sectionCount * trackHeight);
// Fake out the scrollbar for the last item. Since the section indexer won't
// ever actually move the list in this end space, make scrolling across the last item
// account for whatever space is remaining.
if (firstVisibleItem > 0 && firstVisibleItem + visibleItemCount == totalItemCount) {
final View lastChild = mList.getChildAt(visibleItemCount - 1);
final float lastItemVisible = (float) (mList.getHeight() - mList.getPaddingBottom()
- lastChild.getTop()) / lastChild.getHeight();
result += (trackHeight - result) * lastItemVisible;
}
return result;
}
private void cancelFling() {
// Cancel the list fling
MotionEvent cancelFling = MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0, 0, 0);