Refactor AbsListView position scrollers for better abstraction

The AbsListView sub-scroller knows nothing about layout. That's now
handled by ListView and GridView, with subclasses of AbsListView using
the default PositionScroller. Removes unnecessary (unreleased) APIs.

Also fixes a bounds check that was using the item position rather than
the child view position.

BUG: 13006641
Change-Id: I2adb0f15623e32295facf81f5ada974083ba03ce
This commit is contained in:
Alan Viverette
2014-02-13 17:47:38 -08:00
parent d63b4314b8
commit d22db216fe
4 changed files with 584 additions and 517 deletions

View File

@@ -31628,12 +31628,10 @@ package android.widget {
method public int getCheckedItemPosition();
method public android.util.SparseBooleanArray getCheckedItemPositions();
method public int getChoiceMode();
method public int getFirstPositionForRow(int);
method public int getListPaddingBottom();
method public int getListPaddingLeft();
method public int getListPaddingRight();
method public int getListPaddingTop();
method public int getRowForPosition(int);
method public android.view.View getSelectedView();
method public android.graphics.drawable.Drawable getSelector();
method public java.lang.CharSequence getTextFilter();

File diff suppressed because it is too large Load Diff

View File

@@ -35,6 +35,8 @@ import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.CollectionInfo;
import android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo;
import android.view.animation.GridLayoutAnimationController;
import android.widget.AbsListView.AbsPositionScroller;
import android.widget.ListView.ListViewPositionScroller;
import android.widget.RemoteViews.RemoteView;
import java.lang.annotation.Retention;
@@ -1027,13 +1029,8 @@ public class GridView extends AbsListView {
}
@Override
public int getRowForPosition(int position) {
return position / mNumColumns;
}
@Override
public int getFirstPositionForRow(int row) {
return row * mNumColumns;
AbsPositionScroller createPositionScroller() {
return new GridViewPositionScroller();
}
@Override
@@ -2357,4 +2354,33 @@ public class GridView extends AbsListView {
final CollectionItemInfo itemInfo = CollectionItemInfo.obtain(column, 1, row, 1, isHeading);
info.setCollectionItemInfo(itemInfo);
}
/**
* Sub-position scroller that understands the layout of a GridView.
*/
class GridViewPositionScroller extends AbsSubPositionScroller {
@Override
public int getRowForPosition(int position) {
return position / mNumColumns;
}
@Override
public int getFirstPositionForRow(int row) {
return row * mNumColumns;
}
@Override
public int getHeightForRow(int row) {
final int firstRowPosition = row * mNumColumns;
final int lastRowPosition = Math.min(getCount(), firstRowPosition + mNumColumns);
int maxHeight = 0;
for (int i = firstRowPosition; i < lastRowPosition; i++) {
final int height = getHeightForPosition(i);
if (height > maxHeight) {
maxHeight = height;
}
}
return maxHeight;
}
}
}

View File

@@ -3775,13 +3775,8 @@ public class ListView extends AbsListView {
}
@Override
public int getRowForPosition(int position) {
return position;
}
@Override
public int getFirstPositionForRow(int row) {
return row;
AbsPositionScroller createPositionScroller() {
return new ListViewPositionScroller();
}
@Override
@@ -3810,4 +3805,24 @@ public class ListView extends AbsListView {
final CollectionItemInfo itemInfo = CollectionItemInfo.obtain(0, 1, position, 1, isHeading);
info.setCollectionItemInfo(itemInfo);
}
/**
* Sub-position scroller that understands the layout of a ListView.
*/
class ListViewPositionScroller extends AbsSubPositionScroller {
@Override
public int getRowForPosition(int position) {
return position;
}
@Override
public int getFirstPositionForRow(int row) {
return row;
}
@Override
public int getHeightForRow(int row) {
return getHeightForPosition(row);
}
}
}