19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 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 android.database.DataSetObservable; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.DataSetObserver; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for a {@link ExpandableListAdapter} used to provide data and Views 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from some data to an expandable list view. 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adapters inheriting this class should verify that the base implementations of 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getCombinedChildId(long, long)} and {@link #getCombinedGroupId(long)} 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are correct in generating unique IDs from the group/children IDs. 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see SimpleExpandableListAdapter 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see SimpleCursorTreeAdapter 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 338340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunnepublic abstract class BaseExpandableListAdapter implements ExpandableListAdapter, 348340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne HeterogeneousExpandableList { 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final DataSetObservable mDataSetObservable = new DataSetObservable(); 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void registerDataSetObserver(DataSetObserver observer) { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataSetObservable.registerObserver(observer); 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unregisterDataSetObserver(DataSetObserver observer) { 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataSetObservable.unregisterObserver(observer); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 468e364ed01afd8b64e4e5464e46ba6fde301ac724Gilles Debunne * @see DataSetObservable#notifyInvalidated() 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyDataSetInvalidated() { 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataSetObservable.notifyInvalidated(); 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 538e364ed01afd8b64e4e5464e46ba6fde301ac724Gilles Debunne * @see DataSetObservable#notifyChanged() 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyDataSetChanged() { 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataSetObservable.notifyChanged(); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean areAllItemsEnabled() { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onGroupCollapsed(int groupPosition) { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onGroupExpanded(int groupPosition) { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Override this method if you foresee a clash in IDs based on this scheme: 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base implementation returns a long: 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> bit 0: Whether this ID points to a child (unset) or group (set), so for this method 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this bit will be 1. 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> bit 1-31: Lower 31 bits of the groupId 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> bit 32-63: Lower 32 bits of the childId. 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getCombinedChildId(long groupId, long childId) { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0x8000000000000000L | ((groupId & 0x7FFFFFFF) << 32) | (childId & 0xFFFFFFFF); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Override this method if you foresee a clash in IDs based on this scheme: 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base implementation returns a long: 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> bit 0: Whether this ID points to a child (unset) or group (set), so for this method 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this bit will be 0. 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> bit 1-31: Lower 31 bits of the groupId 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> bit 32-63: Lower 32 bits of the childId. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getCombinedGroupId(long groupId) { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (groupId & 0x7FFFFFFF) << 32; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isEmpty() { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getGroupCount() == 0; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1058340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne 1068340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne 1078340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne /** 1088340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne * {@inheritDoc} 1098340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne * @return 0 for any group or child position, since only one child type count is declared. 1108340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne */ 1118340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne public int getChildType(int groupPosition, int childPosition) { 1128340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne return 0; 1138340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne } 1148340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne 1158340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne /** 1168340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne * {@inheritDoc} 1178340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne * @return 1 as a default value in BaseExpandableListAdapter. 1188340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne */ 1198340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne public int getChildTypeCount() { 1208340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne return 1; 1218340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne } 1228340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne 1238340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne /** 1248340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne * {@inheritDoc} 1258340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne * @return 0 for any groupPosition, since only one group type count is declared. 1268340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne */ 1278340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne public int getGroupType(int groupPosition) { 1288340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne return 0; 1298340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne } 1308340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne 1318340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne /** 1328340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne * {@inheritDoc} 1338340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne * @return 1 as a default value in BaseExpandableListAdapter. 1348340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne */ 1358340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne public int getGroupTypeCount() { 1368340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne return 1; 1378340afe0f66663f032dd999e2d377564df0bb6d5Gilles Debunne } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 139