Loading core/java/android/widget/ExpandableListConnector.java +6 −6 Original line number Diff line number Diff line Loading @@ -67,7 +67,7 @@ class ExpandableListConnector extends BaseAdapter implements Filterable { private int mMaxExpGroupCount = Integer.MAX_VALUE; /** Change observer used to have ExpandableListAdapter changes pushed to us */ private DataSetObserver mDataSetObserver = new MyDataSetObserver(); private final DataSetObserver mDataSetObserver = new MyDataSetObserver(); /** * Constructs the connector Loading Loading @@ -849,7 +849,7 @@ class ExpandableListConnector extends BaseAdapter implements Filterable { * position to either a) group position for groups, or b) child position for * children */ static class GroupMetadata implements Parcelable, Comparable { static class GroupMetadata implements Parcelable, Comparable<GroupMetadata> { final static int REFRESH = -1; /** This group's flat list position */ Loading Loading @@ -885,12 +885,12 @@ class ExpandableListConnector extends BaseAdapter implements Filterable { return gm; } public int compareTo(Object another) { if (another == null || !(another instanceof GroupMetadata)) { throw new ClassCastException(); public int compareTo(GroupMetadata another) { if (another == null) { throw new IllegalArgumentException(); } return gPos - ((GroupMetadata) another).gPos; return gPos - another.gPos; } public int describeContents() { Loading core/java/android/widget/ExpandableListView.java +39 −10 Original line number Diff line number Diff line Loading @@ -389,7 +389,8 @@ public class ExpandableListView extends ListView { // Only proceed as possible child if the divider isn't above all items (if it is above // all items, then the item below it has to be a group) if (flatListPosition >= 0) { PositionMetadata pos = mConnector.getUnflattenedPos(flatListPosition); final int adjustedPosition = getFlatPositionForConnector(flatListPosition); PositionMetadata pos = mConnector.getUnflattenedPos(adjustedPosition); // If this item is a child, or it is a non-empty group that is expanded if ((pos.position.type == ExpandableListPosition.CHILD) || (pos.isExpanded() && pos.groupMetadata.lastChildFlPos != pos.groupMetadata.flPos)) { Loading Loading @@ -482,11 +483,37 @@ public class ExpandableListView extends ListView { return mAdapter; } /** * @param position An absolute (including header and footer) flat list position. * @return true if the position corresponds to a header or a footer item. */ private boolean isHeaderOrFooterPosition(int position) { final int footerViewsStart = mItemCount - getFooterViewsCount(); return (position < getHeaderViewsCount() || position >= footerViewsStart); } /** * Converts an absolute item flat position into a group/child flat position, shifting according * to the number of header items. * * @param flatListPosition The absolute flat position * @return A group/child flat position as expected by the connector. */ private int getFlatPositionForConnector(int flatListPosition) { return flatListPosition - getHeaderViewsCount(); } /** * Converts a group/child flat position into an absolute flat position, that takes into account * the possible headers. * * @param flatListPosition The child/group flat position * @return An absolute flat position. */ private int getAbsoluteFlatPosition(int flatListPosition) { return flatListPosition + getHeaderViewsCount(); } @Override public boolean performItemClick(View v, int position, long id) { // Ignore clicks in header/footers Loading @@ -496,8 +523,8 @@ public class ExpandableListView extends ListView { } // Internally handle the item click final int headerViewsCount = getHeaderViewsCount(); return handleItemClick(v, position - headerViewsCount, id); final int adjustedPosition = getFlatPositionForConnector(position); return handleItemClick(v, adjustedPosition, id); } /** Loading Loading @@ -711,8 +738,8 @@ public class ExpandableListView extends ListView { return PACKED_POSITION_VALUE_NULL; } final int shiftedPosition = flatListPosition - getHeaderViewsCount(); PositionMetadata pm = mConnector.getUnflattenedPos(shiftedPosition); final int adjustedPosition = getFlatPositionForConnector(flatListPosition); PositionMetadata pm = mConnector.getUnflattenedPos(adjustedPosition); long packedPos = pm.position.getPackedPosition(); pm.recycle(); return packedPos; Loading @@ -732,9 +759,9 @@ public class ExpandableListView extends ListView { public int getFlatListPosition(long packedPosition) { PositionMetadata pm = mConnector.getFlattenedPos(ExpandableListPosition .obtainPosition(packedPosition)); int retValue = pm.position.flatListPos; final int flatListPosition = pm.position.flatListPos; pm.recycle(); return retValue + getHeaderViewsCount(); return getAbsoluteFlatPosition(flatListPosition); } /** Loading Loading @@ -783,7 +810,8 @@ public class ExpandableListView extends ListView { .obtainGroupPosition(groupPosition); PositionMetadata pm = mConnector.getFlattenedPos(elGroupPos); elGroupPos.recycle(); super.setSelection(pm.position.flatListPos); final int absoluteFlatPosition = getAbsoluteFlatPosition(pm.position.flatListPos); super.setSelection(absoluteFlatPosition); pm.recycle(); } Loading Loading @@ -819,7 +847,8 @@ public class ExpandableListView extends ListView { } } super.setSelection(flatChildPos.position.flatListPos); int absoluteFlatPosition = getAbsoluteFlatPosition(flatChildPos.position.flatListPos); super.setSelection(absoluteFlatPosition); elChildPos.recycle(); flatChildPos.recycle(); Loading Loading @@ -937,7 +966,7 @@ public class ExpandableListView extends ListView { return new AdapterContextMenuInfo(view, flatListPosition, id); } final int adjustedPosition = flatListPosition - getHeaderViewsCount(); final int adjustedPosition = getFlatPositionForConnector(flatListPosition); PositionMetadata pm = mConnector.getUnflattenedPos(adjustedPosition); ExpandableListPosition pos = pm.position; pm.recycle(); Loading Loading
core/java/android/widget/ExpandableListConnector.java +6 −6 Original line number Diff line number Diff line Loading @@ -67,7 +67,7 @@ class ExpandableListConnector extends BaseAdapter implements Filterable { private int mMaxExpGroupCount = Integer.MAX_VALUE; /** Change observer used to have ExpandableListAdapter changes pushed to us */ private DataSetObserver mDataSetObserver = new MyDataSetObserver(); private final DataSetObserver mDataSetObserver = new MyDataSetObserver(); /** * Constructs the connector Loading Loading @@ -849,7 +849,7 @@ class ExpandableListConnector extends BaseAdapter implements Filterable { * position to either a) group position for groups, or b) child position for * children */ static class GroupMetadata implements Parcelable, Comparable { static class GroupMetadata implements Parcelable, Comparable<GroupMetadata> { final static int REFRESH = -1; /** This group's flat list position */ Loading Loading @@ -885,12 +885,12 @@ class ExpandableListConnector extends BaseAdapter implements Filterable { return gm; } public int compareTo(Object another) { if (another == null || !(another instanceof GroupMetadata)) { throw new ClassCastException(); public int compareTo(GroupMetadata another) { if (another == null) { throw new IllegalArgumentException(); } return gPos - ((GroupMetadata) another).gPos; return gPos - another.gPos; } public int describeContents() { Loading
core/java/android/widget/ExpandableListView.java +39 −10 Original line number Diff line number Diff line Loading @@ -389,7 +389,8 @@ public class ExpandableListView extends ListView { // Only proceed as possible child if the divider isn't above all items (if it is above // all items, then the item below it has to be a group) if (flatListPosition >= 0) { PositionMetadata pos = mConnector.getUnflattenedPos(flatListPosition); final int adjustedPosition = getFlatPositionForConnector(flatListPosition); PositionMetadata pos = mConnector.getUnflattenedPos(adjustedPosition); // If this item is a child, or it is a non-empty group that is expanded if ((pos.position.type == ExpandableListPosition.CHILD) || (pos.isExpanded() && pos.groupMetadata.lastChildFlPos != pos.groupMetadata.flPos)) { Loading Loading @@ -482,11 +483,37 @@ public class ExpandableListView extends ListView { return mAdapter; } /** * @param position An absolute (including header and footer) flat list position. * @return true if the position corresponds to a header or a footer item. */ private boolean isHeaderOrFooterPosition(int position) { final int footerViewsStart = mItemCount - getFooterViewsCount(); return (position < getHeaderViewsCount() || position >= footerViewsStart); } /** * Converts an absolute item flat position into a group/child flat position, shifting according * to the number of header items. * * @param flatListPosition The absolute flat position * @return A group/child flat position as expected by the connector. */ private int getFlatPositionForConnector(int flatListPosition) { return flatListPosition - getHeaderViewsCount(); } /** * Converts a group/child flat position into an absolute flat position, that takes into account * the possible headers. * * @param flatListPosition The child/group flat position * @return An absolute flat position. */ private int getAbsoluteFlatPosition(int flatListPosition) { return flatListPosition + getHeaderViewsCount(); } @Override public boolean performItemClick(View v, int position, long id) { // Ignore clicks in header/footers Loading @@ -496,8 +523,8 @@ public class ExpandableListView extends ListView { } // Internally handle the item click final int headerViewsCount = getHeaderViewsCount(); return handleItemClick(v, position - headerViewsCount, id); final int adjustedPosition = getFlatPositionForConnector(position); return handleItemClick(v, adjustedPosition, id); } /** Loading Loading @@ -711,8 +738,8 @@ public class ExpandableListView extends ListView { return PACKED_POSITION_VALUE_NULL; } final int shiftedPosition = flatListPosition - getHeaderViewsCount(); PositionMetadata pm = mConnector.getUnflattenedPos(shiftedPosition); final int adjustedPosition = getFlatPositionForConnector(flatListPosition); PositionMetadata pm = mConnector.getUnflattenedPos(adjustedPosition); long packedPos = pm.position.getPackedPosition(); pm.recycle(); return packedPos; Loading @@ -732,9 +759,9 @@ public class ExpandableListView extends ListView { public int getFlatListPosition(long packedPosition) { PositionMetadata pm = mConnector.getFlattenedPos(ExpandableListPosition .obtainPosition(packedPosition)); int retValue = pm.position.flatListPos; final int flatListPosition = pm.position.flatListPos; pm.recycle(); return retValue + getHeaderViewsCount(); return getAbsoluteFlatPosition(flatListPosition); } /** Loading Loading @@ -783,7 +810,8 @@ public class ExpandableListView extends ListView { .obtainGroupPosition(groupPosition); PositionMetadata pm = mConnector.getFlattenedPos(elGroupPos); elGroupPos.recycle(); super.setSelection(pm.position.flatListPos); final int absoluteFlatPosition = getAbsoluteFlatPosition(pm.position.flatListPos); super.setSelection(absoluteFlatPosition); pm.recycle(); } Loading Loading @@ -819,7 +847,8 @@ public class ExpandableListView extends ListView { } } super.setSelection(flatChildPos.position.flatListPos); int absoluteFlatPosition = getAbsoluteFlatPosition(flatChildPos.position.flatListPos); super.setSelection(absoluteFlatPosition); elChildPos.recycle(); flatChildPos.recycle(); Loading Loading @@ -937,7 +966,7 @@ public class ExpandableListView extends ListView { return new AdapterContextMenuInfo(view, flatListPosition, id); } final int adjustedPosition = flatListPosition - getHeaderViewsCount(); final int adjustedPosition = getFlatPositionForConnector(flatListPosition); PositionMetadata pm = mConnector.getUnflattenedPos(adjustedPosition); ExpandableListPosition pos = pm.position; pm.recycle(); Loading