Search in sources :

Example 26 with PositionMetadata

use of android.widget.ExpandableListConnector.PositionMetadata in project android_frameworks_base by AOSPA.

the class ExpandableListView method handleItemClick.

/**
     * This will either expand/collapse groups (if a group was clicked) or pass
     * on the click to the proper child (if a child was clicked)
     * 
     * @param position The flat list position. This has already been factored to
     *            remove the header/footer.
     * @param id The ListAdapter ID, not the group or child ID.
     */
boolean handleItemClick(View v, int position, long id) {
    final PositionMetadata posMetadata = mConnector.getUnflattenedPos(position);
    id = getChildOrGroupId(posMetadata.position);
    boolean returnValue;
    if (posMetadata.position.type == ExpandableListPosition.GROUP) {
        /* It's a group click, so pass on event */
        if (mOnGroupClickListener != null) {
            if (mOnGroupClickListener.onGroupClick(this, v, posMetadata.position.groupPos, id)) {
                posMetadata.recycle();
                return true;
            }
        }
        if (posMetadata.isExpanded()) {
            /* Collapse it */
            mConnector.collapseGroup(posMetadata);
            playSoundEffect(SoundEffectConstants.CLICK);
            if (mOnGroupCollapseListener != null) {
                mOnGroupCollapseListener.onGroupCollapse(posMetadata.position.groupPos);
            }
        } else {
            /* Expand it */
            mConnector.expandGroup(posMetadata);
            playSoundEffect(SoundEffectConstants.CLICK);
            if (mOnGroupExpandListener != null) {
                mOnGroupExpandListener.onGroupExpand(posMetadata.position.groupPos);
            }
            final int groupPos = posMetadata.position.groupPos;
            final int groupFlatPos = posMetadata.position.flatListPos;
            final int shiftedGroupPosition = groupFlatPos + getHeaderViewsCount();
            smoothScrollToPosition(shiftedGroupPosition + mAdapter.getChildrenCount(groupPos), shiftedGroupPosition);
        }
        returnValue = true;
    } else {
        /* It's a child, so pass on event */
        if (mOnChildClickListener != null) {
            playSoundEffect(SoundEffectConstants.CLICK);
            return mOnChildClickListener.onChildClick(this, v, posMetadata.position.groupPos, posMetadata.position.childPos, id);
        }
        returnValue = false;
    }
    posMetadata.recycle();
    return returnValue;
}
Also used : PositionMetadata(android.widget.ExpandableListConnector.PositionMetadata)

Example 27 with PositionMetadata

use of android.widget.ExpandableListConnector.PositionMetadata in project android_frameworks_base by AOSPA.

the class ExpandableListView method dispatchDraw.

@Override
protected void dispatchDraw(Canvas canvas) {
    // Draw children, etc.
    super.dispatchDraw(canvas);
    // If we have any indicators to draw, we do it here
    if ((mChildIndicator == null) && (mGroupIndicator == null)) {
        return;
    }
    int saveCount = 0;
    final boolean clipToPadding = (mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK;
    if (clipToPadding) {
        saveCount = canvas.save();
        final int scrollX = mScrollX;
        final int scrollY = mScrollY;
        canvas.clipRect(scrollX + mPaddingLeft, scrollY + mPaddingTop, scrollX + mRight - mLeft - mPaddingRight, scrollY + mBottom - mTop - mPaddingBottom);
    }
    final int headerViewsCount = getHeaderViewsCount();
    final int lastChildFlPos = mItemCount - getFooterViewsCount() - headerViewsCount - 1;
    final int myB = mBottom;
    PositionMetadata pos;
    View item;
    Drawable indicator;
    int t, b;
    // Start at a value that is neither child nor group
    int lastItemType = ~(ExpandableListPosition.CHILD | ExpandableListPosition.GROUP);
    final Rect indicatorRect = mIndicatorRect;
    // The "child" mentioned in the following two lines is this
    // View's child, not referring to an expandable list's
    // notion of a child (as opposed to a group)
    final int childCount = getChildCount();
    for (int i = 0, childFlPos = mFirstPosition - headerViewsCount; i < childCount; i++, childFlPos++) {
        if (childFlPos < 0) {
            // This child is header
            continue;
        } else if (childFlPos > lastChildFlPos) {
            // This child is footer, so are all subsequent children
            break;
        }
        item = getChildAt(i);
        t = item.getTop();
        b = item.getBottom();
        // This item isn't on the screen
        if ((b < 0) || (t > myB))
            continue;
        // Get more expandable list-related info for this item
        pos = mConnector.getUnflattenedPos(childFlPos);
        final boolean isLayoutRtl = isLayoutRtl();
        final int width = getWidth();
        // the left & right bounds
        if (pos.position.type != lastItemType) {
            if (pos.position.type == ExpandableListPosition.CHILD) {
                indicatorRect.left = (mChildIndicatorLeft == CHILD_INDICATOR_INHERIT) ? mIndicatorLeft : mChildIndicatorLeft;
                indicatorRect.right = (mChildIndicatorRight == CHILD_INDICATOR_INHERIT) ? mIndicatorRight : mChildIndicatorRight;
            } else {
                indicatorRect.left = mIndicatorLeft;
                indicatorRect.right = mIndicatorRight;
            }
            if (isLayoutRtl) {
                final int temp = indicatorRect.left;
                indicatorRect.left = width - indicatorRect.right;
                indicatorRect.right = width - temp;
                indicatorRect.left -= mPaddingRight;
                indicatorRect.right -= mPaddingRight;
            } else {
                indicatorRect.left += mPaddingLeft;
                indicatorRect.right += mPaddingLeft;
            }
            lastItemType = pos.position.type;
        }
        if (indicatorRect.left != indicatorRect.right) {
            // Use item's full height + the divider height
            if (mStackFromBottom) {
                // See ListView#dispatchDraw
                // - mDividerHeight;
                indicatorRect.top = t;
                indicatorRect.bottom = b;
            } else {
                indicatorRect.top = t;
                // + mDividerHeight;
                indicatorRect.bottom = b;
            }
            // Get the indicator (with its state set to the item's state)
            indicator = getIndicator(pos);
            if (indicator != null) {
                // Draw the indicator
                indicator.setBounds(indicatorRect);
                indicator.draw(canvas);
            }
        }
        pos.recycle();
    }
    if (clipToPadding) {
        canvas.restoreToCount(saveCount);
    }
}
Also used : Rect(android.graphics.Rect) PositionMetadata(android.widget.ExpandableListConnector.PositionMetadata) Drawable(android.graphics.drawable.Drawable) View(android.view.View)

Example 28 with PositionMetadata

use of android.widget.ExpandableListConnector.PositionMetadata in project android_frameworks_base by AOSPA.

the class ExpandableListView method drawDivider.

@Override
void drawDivider(Canvas canvas, Rect bounds, int childIndex) {
    int flatListPosition = childIndex + mFirstPosition;
    // all items, then the item below it has to be a group)
    if (flatListPosition >= 0) {
        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)) {
            // These are the cases where we draw the child divider
            final Drawable divider = mChildDivider;
            divider.setBounds(bounds);
            divider.draw(canvas);
            pos.recycle();
            return;
        }
        pos.recycle();
    }
    // Otherwise draw the default divider
    super.drawDivider(canvas, bounds, flatListPosition);
}
Also used : PositionMetadata(android.widget.ExpandableListConnector.PositionMetadata) Drawable(android.graphics.drawable.Drawable)

Example 29 with PositionMetadata

use of android.widget.ExpandableListConnector.PositionMetadata in project android_frameworks_base by AOSPA.

the class ExpandableListView method getExpandableListPosition.

/**
     * Converts a flat list position (the raw position of an item (child or group)
     * in the list) to a group and/or child position (represented in a
     * packed position). This is useful in situations where the caller needs to
     * use the underlying {@link ListView}'s methods. Use
     * {@link ExpandableListView#getPackedPositionType} ,
     * {@link ExpandableListView#getPackedPositionChild},
     * {@link ExpandableListView#getPackedPositionGroup} to unpack.
     * 
     * @param flatListPosition The flat list position to be converted.
     * @return The group and/or child position for the given flat list position
     *         in packed position representation. #PACKED_POSITION_VALUE_NULL if
     *         the position corresponds to a header or a footer item.
     */
public long getExpandableListPosition(int flatListPosition) {
    if (isHeaderOrFooterPosition(flatListPosition)) {
        return PACKED_POSITION_VALUE_NULL;
    }
    final int adjustedPosition = getFlatPositionForConnector(flatListPosition);
    PositionMetadata pm = mConnector.getUnflattenedPos(adjustedPosition);
    long packedPos = pm.position.getPackedPosition();
    pm.recycle();
    return packedPos;
}
Also used : PositionMetadata(android.widget.ExpandableListConnector.PositionMetadata)

Example 30 with PositionMetadata

use of android.widget.ExpandableListConnector.PositionMetadata in project android_frameworks_base by DirtyUnicorns.

the class ExpandableListView method drawDivider.

@Override
void drawDivider(Canvas canvas, Rect bounds, int childIndex) {
    int flatListPosition = childIndex + mFirstPosition;
    // all items, then the item below it has to be a group)
    if (flatListPosition >= 0) {
        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)) {
            // These are the cases where we draw the child divider
            final Drawable divider = mChildDivider;
            divider.setBounds(bounds);
            divider.draw(canvas);
            pos.recycle();
            return;
        }
        pos.recycle();
    }
    // Otherwise draw the default divider
    super.drawDivider(canvas, bounds, flatListPosition);
}
Also used : PositionMetadata(android.widget.ExpandableListConnector.PositionMetadata) Drawable(android.graphics.drawable.Drawable)

Aggregations

PositionMetadata (android.widget.ExpandableListConnector.PositionMetadata)63 Drawable (android.graphics.drawable.Drawable)14 Rect (android.graphics.Rect)7 View (android.view.View)7