ExpandableListView.java revision fd0d627569cb250f7060a83161cc845b9616e5a1
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.R; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.ColorDrawable; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextMenu; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.SoundEffectConstants; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextMenu.ContextMenuInfo; 36fd0d627569cb250f7060a83161cc845b9616e5a1Jeff Sharkeyimport android.widget.AdapterView.AdapterContextMenuInfo; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ExpandableListConnector.PositionMetadata; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A view that shows items in a vertically scrolling two-level list. This 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * differs from the {@link ListView} by allowing two levels: groups which can 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * individually be expanded to show its children. The items come from the 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ExpandableListAdapter} associated with this view. 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Expandable lists are able to show an indicator beside each item to display 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the item's current state (the states are usually one of expanded group, 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * collapsed group, child, or last child). Use 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setChildIndicator(Drawable)} or {@link #setGroupIndicator(Drawable)} 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (or the corresponding XML attributes) to set these indicators (see the docs 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for each method to see additional state that each Drawable can have). The 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * default style for an {@link ExpandableListView} provides indicators which 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be shown next to Views given to the {@link ExpandableListView}. The 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * layouts android.R.layout.simple_expandable_list_item_1 and 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android.R.layout.simple_expandable_list_item_2 (which should be used with 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SimpleCursorTreeAdapter}) contain the preferred position information 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for indicators. 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The context menu information set by an {@link ExpandableListView} will be a 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ExpandableListContextMenuInfo} object with 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ExpandableListContextMenuInfo#packedPosition} being a packed position 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that can be used with {@link #getPackedPositionType(long)} and the other 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * similar methods. 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <em><b>Note:</b></em> You cannot use the value <code>wrap_content</code> 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for the <code>android:layout_height</code> attribute of a 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ExpandableListView in XML if the parent's size is also not strictly specified 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (for example, if the parent were ScrollView you could not specify 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wrap_content since it also can be any length. However, you can use 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wrap_content if the ExpandableListView parent has a specific size, such as 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 100 pixels. 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ExpandableListView_groupIndicator 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ExpandableListView_indicatorLeft 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ExpandableListView_indicatorRight 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ExpandableListView_childIndicator 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ExpandableListView_childIndicatorLeft 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ExpandableListView_childIndicatorRight 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ExpandableListView_childDivider 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ExpandableListView extends ListView { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The packed position represents a group. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PACKED_POSITION_TYPE_GROUP = 0; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The packed position represents a child. 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PACKED_POSITION_TYPE_CHILD = 1; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The packed position represents a neither/null/no preference. 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PACKED_POSITION_TYPE_NULL = 2; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The value for a packed position that represents neither/null/no 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preference. This value is not otherwise possible since a group type 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (first bit 0) should not have a child position filled. 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final long PACKED_POSITION_VALUE_NULL = 0x00000000FFFFFFFFL; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The mask (in packed position representation) for the child */ 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final long PACKED_POSITION_MASK_CHILD = 0x00000000FFFFFFFFL; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The mask (in packed position representation) for the group */ 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final long PACKED_POSITION_MASK_GROUP = 0x7FFFFFFF00000000L; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The mask (in packed position representation) for the type */ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final long PACKED_POSITION_MASK_TYPE = 0x8000000000000000L; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The shift amount (in packed position representation) for the group */ 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final long PACKED_POSITION_SHIFT_GROUP = 32; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The shift amount (in packed position representation) for the type */ 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final long PACKED_POSITION_SHIFT_TYPE = 63; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The mask (in integer child position representation) for the child */ 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final long PACKED_POSITION_INT_MASK_CHILD = 0xFFFFFFFF; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The mask (in integer group position representation) for the group */ 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final long PACKED_POSITION_INT_MASK_GROUP = 0x7FFFFFFF; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Serves as the glue/translator between a ListView and an ExpandableListView */ 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ExpandableListConnector mConnector; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Gives us Views through group+child positions */ 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ExpandableListAdapter mAdapter; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Left bound for drawing the indicator. */ 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mIndicatorLeft; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Right bound for drawing the indicator. */ 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mIndicatorRight; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Left bound for drawing the indicator of a child. Value of 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #CHILD_INDICATOR_INHERIT} means use mIndicatorLeft. 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mChildIndicatorLeft; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Right bound for drawing the indicator of a child. Value of 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #CHILD_INDICATOR_INHERIT} means use mIndicatorRight. 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mChildIndicatorRight; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Denotes when a child indicator should inherit this bound from the generic 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * indicator bounds 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int CHILD_INDICATOR_INHERIT = -1; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The indicator drawn next to a group. */ 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mGroupIndicator; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The indicator drawn next to a child. */ 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mChildIndicator; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[] EMPTY_STATE_SET = {}; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** State indicating the group is expanded. */ 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[] GROUP_EXPANDED_STATE_SET = 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {R.attr.state_expanded}; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** State indicating the group is empty (has no children). */ 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[] GROUP_EMPTY_STATE_SET = 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {R.attr.state_empty}; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** State indicating the group is expanded and empty (has no children). */ 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[] GROUP_EXPANDED_EMPTY_STATE_SET = 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {R.attr.state_expanded, R.attr.state_empty}; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** States for the group where the 0th bit is expanded and 1st bit is empty. */ 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[][] GROUP_STATE_SETS = { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EMPTY_STATE_SET, // 00 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GROUP_EXPANDED_STATE_SET, // 01 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GROUP_EMPTY_STATE_SET, // 10 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GROUP_EXPANDED_EMPTY_STATE_SET // 11 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** State indicating the child is the last within its group. */ 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[] CHILD_LAST_STATE_SET = 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {R.attr.state_last}; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Drawable to be used as a divider when it is adjacent to any children */ 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mChildDivider; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mClipChildDivider; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Bounds of the indicator to be drawn 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Rect mIndicatorRect = new Rect(); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ExpandableListView(Context context) { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, null); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ExpandableListView(Context context, AttributeSet attrs) { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, attrs, com.android.internal.R.attr.expandableListViewStyle); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ExpandableListView(Context context, AttributeSet attrs, int defStyle) { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.ExpandableListView, defStyle, 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupIndicator = a 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getDrawable(com.android.internal.R.styleable.ExpandableListView_groupIndicator); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildIndicator = a 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getDrawable(com.android.internal.R.styleable.ExpandableListView_childIndicator); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndicatorLeft = a 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getDimensionPixelSize(com.android.internal.R.styleable.ExpandableListView_indicatorLeft, 0); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndicatorRight = a 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getDimensionPixelSize(com.android.internal.R.styleable.ExpandableListView_indicatorRight, 0); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildIndicatorLeft = a.getDimensionPixelSize( 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.ExpandableListView_childIndicatorLeft, CHILD_INDICATOR_INHERIT); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildIndicatorRight = a.getDimensionPixelSize( 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.ExpandableListView_childIndicatorRight, CHILD_INDICATOR_INHERIT); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildDivider = a.getDrawable(com.android.internal.R.styleable.ExpandableListView_childDivider); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dispatchDraw(Canvas canvas) { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Draw children, etc. 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dispatchDraw(canvas); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we have any indicators to draw, we do it here 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mChildIndicator == null) && (mGroupIndicator == null)) { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int saveCount = 0; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean clipToPadding = (mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clipToPadding) { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project saveCount = canvas.save(); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int scrollX = mScrollX; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int scrollY = mScrollY; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.clipRect(scrollX + mPaddingLeft, scrollY + mPaddingTop, 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scrollX + mRight - mLeft - mPaddingRight, 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scrollY + mBottom - mTop - mPaddingBottom); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int headerViewsCount = getHeaderViewsCount(); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int lastChildFlPos = mItemCount - getFooterViewsCount() - headerViewsCount - 1; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int myB = mBottom; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PositionMetadata pos; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View item; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable indicator; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int t, b; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Start at a value that is neither child nor group 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int lastItemType = ~(ExpandableListPosition.CHILD | ExpandableListPosition.GROUP); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect indicatorRect = mIndicatorRect; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The "child" mentioned in the following two lines is this 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // View's child, not referring to an expandable list's 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // notion of a child (as opposed to a group) 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int childCount = getChildCount(); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, childFlPos = mFirstPosition - headerViewsCount; i < childCount; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++, childFlPos++) { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (childFlPos < 0) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This child is header 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (childFlPos > lastChildFlPos) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This child is footer, so are all subsequent children 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item = getChildAt(i); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = item.getTop(); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b = item.getBottom(); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This item isn't on the screen 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((b < 0) || (t > myB)) continue; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get more expandable list-related info for this item 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos = mConnector.getUnflattenedPos(childFlPos); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this item type and the previous item type are different, then we need to change 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the left & right bounds 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos.position.type != lastItemType) { 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos.position.type == ExpandableListPosition.CHILD) { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicatorRect.left = (mChildIndicatorLeft == CHILD_INDICATOR_INHERIT) ? 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndicatorLeft : mChildIndicatorLeft; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicatorRect.right = (mChildIndicatorRight == CHILD_INDICATOR_INHERIT) ? 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndicatorRight : mChildIndicatorRight; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicatorRect.left = mIndicatorLeft; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicatorRect.right = mIndicatorRight; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastItemType = pos.position.type; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (indicatorRect.left != indicatorRect.right) { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Use item's full height + the divider height 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mStackFromBottom) { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // See ListView#dispatchDraw 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicatorRect.top = t;// - mDividerHeight; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicatorRect.bottom = b; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicatorRect.top = t; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicatorRect.bottom = b;// + mDividerHeight; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get the indicator (with its state set to the item's state) 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicator = getIndicator(pos); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (indicator != null) { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Draw the indicator 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicator.setBounds(indicatorRect); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicator.draw(canvas); 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos.recycle(); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clipToPadding) { 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.restoreToCount(saveCount); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the indicator for the item at the given position. If the indicator 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is stateful, the state will be given to the indicator. 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pos The flat list position of the item whose indicator 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should be returned. 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The indicator in the proper state. 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable getIndicator(PositionMetadata pos) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable indicator; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pos.position.type == ExpandableListPosition.GROUP) { 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicator = mGroupIndicator; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (indicator != null && indicator.isStateful()) { 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Empty check based on availability of data. If the groupMetadata isn't null, 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we do a check on it. Otherwise, the group is collapsed so we consider it 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // empty for performance reasons. 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isEmpty = (pos.groupMetadata == null) || 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (pos.groupMetadata.lastChildFlPos == pos.groupMetadata.flPos); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int stateSetIndex = 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (pos.isExpanded() ? 1 : 0) | // Expanded? 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (isEmpty ? 2 : 0); // Empty? 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicator.setState(GROUP_STATE_SETS[stateSetIndex]); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicator = mChildIndicator; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (indicator != null && indicator.isStateful()) { 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // No need for a state sets array for the child since it only has two states 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int stateSet[] = pos.position.flatListPos == pos.groupMetadata.lastChildFlPos 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? CHILD_LAST_STATE_SET 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : EMPTY_STATE_SET; 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicator.setState(stateSet); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return indicator; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the drawable that will be drawn adjacent to every child in the list. This will 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be drawn using the same height as the normal divider ({@link #setDivider(Drawable)}) or 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if it does not have an intrinsic height, the height set by {@link #setDividerHeight(int)}. 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param childDivider The drawable to use. 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setChildDivider(Drawable childDivider) { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildDivider = childDivider; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClipChildDivider = childDivider != null && childDivider instanceof ColorDrawable; 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void drawDivider(Canvas canvas, Rect bounds, int childIndex) { 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flatListPosition = childIndex + mFirstPosition; 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Only proceed as possible child if the divider isn't above all items (if it is above 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // all items, then the item below it has to be a group) 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (flatListPosition >= 0) { 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PositionMetadata pos = mConnector.getUnflattenedPos(flatListPosition); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this item is a child, or it is a non-empty group that is expanded 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((pos.position.type == ExpandableListPosition.CHILD) || (pos.isExpanded() && 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos.groupMetadata.lastChildFlPos != pos.groupMetadata.flPos)) { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These are the cases where we draw the child divider 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Drawable divider = mChildDivider; 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean clip = mClipChildDivider; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!clip) { 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project divider.setBounds(bounds); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.save(); 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.clipRect(bounds); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project divider.draw(canvas); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clip) { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.restore(); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos.recycle(); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos.recycle(); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Otherwise draw the default divider 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.drawDivider(canvas, bounds, flatListPosition); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This overloaded method should not be used, instead use 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setAdapter(ExpandableListAdapter)}. 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAdapter(ListAdapter adapter) { 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException( 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "For ExpandableListView, use setAdapter(ExpandableListAdapter) instead of " + 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "setAdapter(ListAdapter)"); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method should not be used, use {@link #getExpandableListAdapter()}. 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ListAdapter getAdapter() { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The developer should never really call this method on an 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ExpandableListView, so it would be nice to throw a RuntimeException, 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but AdapterView calls this 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.getAdapter(); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Register a callback to be invoked when an item has been clicked and the 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * caller prefers to receive a ListView-style position instead of a group 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and/or child position. In most cases, the caller should use 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setOnGroupClickListener} and/or {@link #setOnChildClickListener}. 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p /> 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnItemClickListener(OnItemClickListener l) { 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setOnItemClickListener(l); 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the adapter that provides data to this view. 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param adapter The adapter that provides data to this view. 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAdapter(ExpandableListAdapter adapter) { 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Set member variable 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAdapter = adapter; 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (adapter != null) { 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Create the connector 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConnector = new ExpandableListConnector(adapter); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConnector = null; 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Link the ListView (superclass) to the expandable list data through the connector 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setAdapter(mConnector); 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the adapter that provides data to this view. 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The adapter that provides data to this view. 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ExpandableListAdapter getExpandableListAdapter() { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAdapter; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean performItemClick(View v, int position, long id) { 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore clicks in header/footers 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int headerViewsCount = getHeaderViewsCount(); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int footerViewsStart = mItemCount - getFooterViewsCount(); 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (position < headerViewsCount || position >= footerViewsStart) { 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Clicked on a header/footer, so ignore pass it on to super 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.performItemClick(v, position, id); 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Internally handle the item click 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return handleItemClick(v, position - headerViewsCount, id); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This will either expand/collapse groups (if a group was clicked) or pass 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on the click to the proper child (if a child was clicked) 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param position The flat list position. This has already been factored to 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remove the header/footer. 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The ListAdapter ID, not the group or child ID. 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean handleItemClick(View v, int position, long id) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final PositionMetadata posMetadata = mConnector.getUnflattenedPos(position); 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project id = getChildOrGroupId(posMetadata.position); 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean returnValue; 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (posMetadata.position.type == ExpandableListPosition.GROUP) { 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* It's a group, so handle collapsing/expanding */ 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (posMetadata.isExpanded()) { 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Collapse it */ 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConnector.collapseGroup(posMetadata); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project playSoundEffect(SoundEffectConstants.CLICK); 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnGroupCollapseListener != null) { 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnGroupCollapseListener.onGroupCollapse(posMetadata.position.groupPos); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* It's a group click, so pass on event */ 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnGroupClickListener != null) { 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnGroupClickListener.onGroupClick(this, v, 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project posMetadata.position.groupPos, id)) { 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project posMetadata.recycle(); 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Expand it */ 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConnector.expandGroup(posMetadata); 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project playSoundEffect(SoundEffectConstants.CLICK); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnGroupExpandListener != null) { 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnGroupExpandListener.onGroupExpand(posMetadata.position.groupPos); 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project returnValue = true; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* It's a child, so pass on event */ 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnChildClickListener != null) { 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project playSoundEffect(SoundEffectConstants.CLICK); 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOnChildClickListener.onChildClick(this, v, posMetadata.position.groupPos, 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project posMetadata.position.childPos, id); 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project returnValue = false; 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project posMetadata.recycle(); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return returnValue; 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Expand a group in the grouped list view 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param groupPos the group to be expanded 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the group was expanded, false otherwise (if the group 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * was already expanded, this will return false) 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean expandGroup(int groupPos) { 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean retValue = mConnector.expandGroup(groupPos); 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnGroupExpandListener != null) { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnGroupExpandListener.onGroupExpand(groupPos); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return retValue; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Collapse a group in the grouped list view 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param groupPos position of the group to collapse 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the group was collapsed, false otherwise (if the group 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * was already collapsed, this will return false) 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean collapseGroup(int groupPos) { 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean retValue = mConnector.collapseGroup(groupPos); 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnGroupCollapseListener != null) { 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnGroupCollapseListener.onGroupCollapse(groupPos); 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return retValue; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Used for being notified when a group is collapsed */ 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnGroupCollapseListener { 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Callback method to be invoked when a group in this expandable list has 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been collapsed. 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param groupPosition The group position that was collapsed 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onGroupCollapse(int groupPosition); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private OnGroupCollapseListener mOnGroupCollapseListener; 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnGroupCollapseListener( 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OnGroupCollapseListener onGroupCollapseListener) { 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnGroupCollapseListener = onGroupCollapseListener; 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Used for being notified when a group is expanded */ 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnGroupExpandListener { 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Callback method to be invoked when a group in this expandable list has 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been expanded. 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param groupPosition The group position that was expanded 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onGroupExpand(int groupPosition); 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private OnGroupExpandListener mOnGroupExpandListener; 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnGroupExpandListener( 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OnGroupExpandListener onGroupExpandListener) { 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnGroupExpandListener = onGroupExpandListener; 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Interface definition for a callback to be invoked when a group in this 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * expandable list has been clicked. 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnGroupClickListener { 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Callback method to be invoked when a group in this expandable list has 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been clicked. 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parent The ExpandableListConnector where the click happened 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param v The view within the expandable list/ListView that was clicked 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param groupPosition The group position that was clicked 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The row id of the group that was clicked 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the click was handled 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long id); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private OnGroupClickListener mOnGroupClickListener; 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnGroupClickListener(OnGroupClickListener onGroupClickListener) { 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnGroupClickListener = onGroupClickListener; 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Interface definition for a callback to be invoked when a child in this 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * expandable list has been clicked. 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnChildClickListener { 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Callback method to be invoked when a child in this expandable list has 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been clicked. 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parent The ExpandableListView where the click happened 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param v The view within the expandable list/ListView that was clicked 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param groupPosition The group position that contains the child that 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * was clicked 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param childPosition The child position within the group 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The row id of the child that was clicked 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if the click was handled 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean onChildClick(ExpandableListView parent, View v, int groupPosition, 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int childPosition, long id); 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private OnChildClickListener mOnChildClickListener; 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnChildClickListener(OnChildClickListener onChildClickListener) { 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnChildClickListener = onChildClickListener; 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Converts a flat list position (the raw position of an item (child or 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * group) in the list) to an group and/or child position (represented in a 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * packed position). This is useful in situations where the caller needs to 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use the underlying {@link ListView}'s methods. Use 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ExpandableListView#getPackedPositionType} , 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ExpandableListView#getPackedPositionChild}, 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ExpandableListView#getPackedPositionGroup} to unpack. 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flatListPosition The flat list position to be converted. 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The group and/or child position for the given flat list position 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in packed position representation. 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getExpandableListPosition(int flatListPosition) { 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PositionMetadata pm = mConnector.getUnflattenedPos(flatListPosition); 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long packedPos = pm.position.getPackedPosition(); 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pm.recycle(); 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return packedPos; 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Converts a group and/or child position to a flat list position. This is 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * useful in situations where the caller needs to use the underlying 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ListView}'s methods. 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param packedPosition The group and/or child positions to be converted in 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * packed position representation. Use 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getPackedPositionForChild(int, int)} or 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getPackedPositionForGroup(int)}. 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The flat list position for the given child or group. 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getFlatListPosition(long packedPosition) { 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PositionMetadata pm = mConnector.getFlattenedPos(ExpandableListPosition 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .obtainPosition(packedPosition)); 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int retValue = pm.position.flatListPos; 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pm.recycle(); 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return retValue; 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the position of the currently selected group or child (along with 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * its type). Can return {@link #PACKED_POSITION_VALUE_NULL} if no selection. 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A packed position containing the currently selected group or 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * child's position and type. #PACKED_POSITION_VALUE_NULL if no selection. 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getSelectedPosition() { 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int selectedPos = getSelectedItemPosition(); 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (selectedPos == -1) return PACKED_POSITION_VALUE_NULL; 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getExpandableListPosition(selectedPos); 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the ID of the currently selected group or child. Can return -1 if no 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selection. 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The ID of the currently selected group or child. -1 if no 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selection. 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getSelectedId() { 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long packedPos = getSelectedPosition(); 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packedPos == PACKED_POSITION_VALUE_NULL) return -1; 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int groupPos = getPackedPositionGroup(packedPos); 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getPackedPositionType(packedPos) == PACKED_POSITION_TYPE_GROUP) { 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // It's a group 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAdapter.getGroupId(groupPos); 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // It's a child 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAdapter.getChildId(groupPos, getPackedPositionChild(packedPos)); 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the selection to the specified group. 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param groupPosition The position of the group that should be selected. 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSelectedGroup(int groupPosition) { 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ExpandableListPosition elGroupPos = ExpandableListPosition 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .obtainGroupPosition(groupPosition); 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PositionMetadata pm = mConnector.getFlattenedPos(elGroupPos); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project elGroupPos.recycle(); 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setSelection(pm.position.flatListPos); 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pm.recycle(); 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the selection to the specified child. If the child is in a collapsed 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * group, the group will only be expanded and child subsequently selected if 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * shouldExpandGroup is set to true, otherwise the method will return false. 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param groupPosition The position of the group that contains the child. 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param childPosition The position of the child within the group. 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param shouldExpandGroup Whether the child's group should be expanded if 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it is collapsed. 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the selection was successfully set on the child. 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setSelectedChild(int groupPosition, int childPosition, boolean shouldExpandGroup) { 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ExpandableListPosition elChildPos = ExpandableListPosition.obtainChildPosition( 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project groupPosition, childPosition); 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PositionMetadata flatChildPos = mConnector.getFlattenedPos(elChildPos); 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (flatChildPos == null) { 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The child's group isn't expanded 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Shouldn't expand the group, so return false for we didn't set the selection 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!shouldExpandGroup) return false; 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project expandGroup(groupPosition); 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flatChildPos = mConnector.getFlattenedPos(elChildPos); 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Sanity check 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (flatChildPos == null) { 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException("Could not find child"); 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setSelection(flatChildPos.position.flatListPos); 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project elChildPos.recycle(); 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flatChildPos.recycle(); 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether the given group is currently expanded. 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param groupPosition The group to check. 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the group is currently expanded. 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isGroupExpanded(int groupPosition) { 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConnector.isGroupExpanded(groupPosition); 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the type of a packed position. See 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getPackedPositionForChild(int, int)}. 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param packedPosition The packed position for which to return the type. 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The type of the position contained within the packed position, 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * either {@link #PACKED_POSITION_TYPE_CHILD}, {@link #PACKED_POSITION_TYPE_GROUP}, or 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #PACKED_POSITION_TYPE_NULL}. 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int getPackedPositionType(long packedPosition) { 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packedPosition == PACKED_POSITION_VALUE_NULL) { 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PACKED_POSITION_TYPE_NULL; 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (packedPosition & PACKED_POSITION_MASK_TYPE) == PACKED_POSITION_MASK_TYPE 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? PACKED_POSITION_TYPE_CHILD 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : PACKED_POSITION_TYPE_GROUP; 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the group position from a packed position. See 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getPackedPositionForChild(int, int)}. 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param packedPosition The packed position from which the group position 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be returned. 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The group position portion of the packed position. If this does 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not contain a group, returns -1. 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int getPackedPositionGroup(long packedPosition) { 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Null 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packedPosition == PACKED_POSITION_VALUE_NULL) return -1; 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (int) ((packedPosition & PACKED_POSITION_MASK_GROUP) >> PACKED_POSITION_SHIFT_GROUP); 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the child position from a packed position that is of 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #PACKED_POSITION_TYPE_CHILD} type (use {@link #getPackedPositionType(long)}). 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * To get the group that this child belongs to, use 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getPackedPositionGroup(long)}. See 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getPackedPositionForChild(int, int)}. 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param packedPosition The packed position from which the child position 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be returned. 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The child position portion of the packed position. If this does 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not contain a child, returns -1. 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int getPackedPositionChild(long packedPosition) { 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Null 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packedPosition == PACKED_POSITION_VALUE_NULL) return -1; 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Group since a group type clears this bit 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((packedPosition & PACKED_POSITION_MASK_TYPE) != PACKED_POSITION_MASK_TYPE) return -1; 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (int) (packedPosition & PACKED_POSITION_MASK_CHILD); 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the packed position representation of a child's position. 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In general, a packed position should be used in 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * situations where the position given to/returned from an 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ExpandableListAdapter} or {@link ExpandableListView} method can 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * either be a child or group. The two positions are packed into a single 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * long which can be unpacked using 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getPackedPositionChild(long)}, 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getPackedPositionGroup(long)}, and 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getPackedPositionType(long)}. 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param groupPosition The child's parent group's position. 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param childPosition The child position within the group. 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The packed position representation of the child (and parent group). 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static long getPackedPositionForChild(int groupPosition, int childPosition) { 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (((long)PACKED_POSITION_TYPE_CHILD) << PACKED_POSITION_SHIFT_TYPE) 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | ((((long)groupPosition) & PACKED_POSITION_INT_MASK_GROUP) 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project << PACKED_POSITION_SHIFT_GROUP) 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | (childPosition & PACKED_POSITION_INT_MASK_CHILD); 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the packed position representation of a group's position. See 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getPackedPositionForChild(int, int)}. 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param groupPosition The child's parent group's position. 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The packed position representation of the group. 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static long getPackedPositionForGroup(int groupPosition) { 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // No need to OR a type in because PACKED_POSITION_GROUP == 0 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((((long)groupPosition) & PACKED_POSITION_INT_MASK_GROUP) 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project << PACKED_POSITION_SHIFT_GROUP); 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContextMenuInfo createContextMenuInfo(View view, int flatListPosition, long id) { 920fd0d627569cb250f7060a83161cc845b9616e5a1Jeff Sharkey // Adjust for and handle for header views 921fd0d627569cb250f7060a83161cc845b9616e5a1Jeff Sharkey final int adjustedPosition = flatListPosition - getHeaderViewsCount(); 922fd0d627569cb250f7060a83161cc845b9616e5a1Jeff Sharkey if (adjustedPosition < 0) { 923fd0d627569cb250f7060a83161cc845b9616e5a1Jeff Sharkey // Return normal info for header view context menus 924fd0d627569cb250f7060a83161cc845b9616e5a1Jeff Sharkey return new AdapterContextMenuInfo(view, flatListPosition, id); 925fd0d627569cb250f7060a83161cc845b9616e5a1Jeff Sharkey } 926fd0d627569cb250f7060a83161cc845b9616e5a1Jeff Sharkey 927fd0d627569cb250f7060a83161cc845b9616e5a1Jeff Sharkey PositionMetadata pm = mConnector.getUnflattenedPos(adjustedPosition); 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ExpandableListPosition pos = pm.position; 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pm.recycle(); 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project id = getChildOrGroupId(pos); 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long packedPosition = pos.getPackedPosition(); 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos.recycle(); 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new ExpandableListContextMenuInfo(view, packedPosition, id); 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the ID of the group or child at the given <code>position</code>. 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is useful since there is no ListAdapter ID -> ExpandableListAdapter 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ID conversion mechanism (in some cases, it isn't possible). 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param position The position of the child or group whose ID should be 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returned. 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long getChildOrGroupId(ExpandableListPosition position) { 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (position.type == ExpandableListPosition.CHILD) { 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAdapter.getChildId(position.groupPos, position.childPos); 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAdapter.getGroupId(position.groupPos); 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the indicator to be drawn next to a child. 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param childIndicator The drawable to be used as an indicator. If the 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * child is the last child for a group, the state 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#state_last} will be set. 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setChildIndicator(Drawable childIndicator) { 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildIndicator = childIndicator; 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the drawing bounds for the child indicator. For either, you can 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specify {@link #CHILD_INDICATOR_INHERIT} to use inherit from the general 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * indicator's bounds. 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setIndicatorBounds(int, int) 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param left The left position (relative to the left bounds of this View) 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to start drawing the indicator. 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param right The right position (relative to the left bounds of this 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * View) to end the drawing of the indicator. 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setChildIndicatorBounds(int left, int right) { 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildIndicatorLeft = left; 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildIndicatorRight = right; 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the indicator to be drawn next to a group. 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param groupIndicator The drawable to be used as an indicator. If the 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * group is empty, the state {@link android.R.attr#state_empty} will be 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * set. If the group is expanded, the state 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#state_expanded} will be set. 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setGroupIndicator(Drawable groupIndicator) { 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupIndicator = groupIndicator; 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the drawing bounds for the indicators (at minimum, the group indicator 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is affected by this; the child indicator is affected by this if the 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * child indicator bounds are set to inherit). 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setChildIndicatorBounds(int, int) 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param left The left position (relative to the left bounds of this View) 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to start drawing the indicator. 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param right The right position (relative to the left bounds of this 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * View) to end the drawing of the indicator. 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setIndicatorBounds(int left, int right) { 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndicatorLeft = left; 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIndicatorRight = right; 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Extra menu information specific to an {@link ExpandableListView} provided 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.View.OnCreateContextMenuListener#onCreateContextMenu(ContextMenu, View, ContextMenuInfo) } 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * callback when a context menu is brought up for this AdapterView. 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class ExpandableListContextMenuInfo implements ContextMenu.ContextMenuInfo { 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ExpandableListContextMenuInfo(View targetView, long packedPosition, long id) { 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.targetView = targetView; 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.packedPosition = packedPosition; 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.id = id; 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The view for which the context menu is being displayed. This 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be one of the children Views of this {@link ExpandableListView}. 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View targetView; 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The packed position in the list represented by the adapter for which 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the context menu is being displayed. Use the methods 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ExpandableListView#getPackedPositionType}, 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ExpandableListView#getPackedPositionChild}, and 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ExpandableListView#getPackedPositionGroup} to unpack this. 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long packedPosition; 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ID of the item (group or child) for which the context menu is 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * being displayed. 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long id; 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class SavedState extends BaseSavedState { 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<ExpandableListConnector.GroupMetadata> expandedGroupMetadataList; 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor called from {@link ExpandableListView#onSaveInstanceState()} 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState( 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcelable superState, 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<ExpandableListConnector.GroupMetadata> expandedGroupMetadataList) { 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(superState); 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.expandedGroupMetadataList = expandedGroupMetadataList; 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor called from {@link #CREATOR} 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SavedState(Parcel in) { 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(in); 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project expandedGroupMetadataList = new ArrayList<ExpandableListConnector.GroupMetadata>(); 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in.readList(expandedGroupMetadataList, ExpandableListConnector.class.getClassLoader()); 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.writeToParcel(out, flags); 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeList(expandedGroupMetadataList); 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<SavedState> CREATOR 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new Parcelable.Creator<SavedState>() { 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState createFromParcel(Parcel in) { 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState(in); 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState[] newArray(int size) { 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState[size]; 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Parcelable onSaveInstanceState() { 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcelable superState = super.onSaveInstanceState(); 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState(superState, 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConnector != null ? mConnector.getExpandedGroupMetadataList() : null); 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onRestoreInstanceState(Parcelable state) { 10947444e147a863b41e08815658f1bcbe426aba512bRomain Guy if (!(state instanceof SavedState)) { 10957444e147a863b41e08815658f1bcbe426aba512bRomain Guy super.onRestoreInstanceState(state); 10967444e147a863b41e08815658f1bcbe426aba512bRomain Guy return; 10977444e147a863b41e08815658f1bcbe426aba512bRomain Guy } 10987444e147a863b41e08815658f1bcbe426aba512bRomain Guy 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState ss = (SavedState) state; 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onRestoreInstanceState(ss.getSuperState()); 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mConnector != null && ss.expandedGroupMetadataList != null) { 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConnector.setExpandedGroupMetadataList(ss.expandedGroupMetadataList); 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1108