Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e58aa0d9 authored by Gilles Debunne's avatar Gilles Debunne Committed by Android (Google) Code Review
Browse files

Merge "More ExpandableListView fixes to take headers into account."

parents 351434bd 272f3a94
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -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
@@ -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 */
@@ -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() {
+39 −10
Original line number Diff line number Diff line
@@ -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)) {
@@ -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
@@ -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);
    }
    
    /**
@@ -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;
@@ -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);
    }

    /**
@@ -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();
    }
    
@@ -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();
@@ -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();