/* * Copyright (C) 2011 Cyril Mottier (http://www.cyrilmottier.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package greendroid.app; import greendroid.widget.ActionBar; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.View; import android.view.View.OnCreateContextMenuListener; import android.view.ViewGroup.LayoutParams; import android.widget.ExpandableListAdapter; import android.widget.ExpandableListView; import com.cyrilmottier.android.greendroid.R; /** * A {@link GDActivity} equivalent to ExpandableListActivity that manages an * ExpandableListView. */ public class GDExpandableListActivity extends GDActivity implements OnCreateContextMenuListener, ExpandableListView.OnChildClickListener, ExpandableListView.OnGroupCollapseListener, ExpandableListView.OnGroupExpandListener { private ExpandableListAdapter mAdapter; private ExpandableListView mList; private View mEmptyView; boolean mFinishedStart = false; public GDExpandableListActivity() { super(); } public GDExpandableListActivity(ActionBar.Type actionBarType) { super(actionBarType); } /** * Override this to populate the context menu when an item is long pressed. * menuInfo will contain an * android.widget.ExpandableListView.ExpandableListContextMenuInfo whose * packedPosition is a packed position that should be used with * ExpandableListView#getPackedPositionType(long) and the other similar * methods. * <p> * {@inheritDoc} */ @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { } /** * Override this for receiving callbacks when a child has been clicked. * <p> * {@inheritDoc} */ public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { return false; } /** * Override this for receiving callbacks when a group has been collapsed. */ public void onGroupCollapse(int groupPosition) { } /** * Override this for receiving callbacks when a group has been expanded. */ public void onGroupExpand(int groupPosition) { } /** * Provide the adapter for the expandable list. */ public void setListAdapter(ExpandableListAdapter adapter) { synchronized (this) { ensureLayout(); mAdapter = adapter; mList.setAdapter(adapter); } } /** * Get the activity's expandable list view widget. This can be used to get * the selection, set the selection, and many other useful functions. * * @see ExpandableListView */ public ExpandableListView getExpandableListView() { ensureLayout(); return mList; } /** * Get the ExpandableListAdapter associated with this activity's * ExpandableListView. */ public ExpandableListAdapter getExpandableListAdapter() { return mAdapter; } @Override public int createLayout() { switch (getActionBarType()) { case Dashboard: return R.layout.gd_expandable_list_content_dashboard; case Empty: return R.layout.gd_expandable_list_content_empty; case Normal: default: return R.layout.gd_expandable_list_content_normal; } } @Override public void onPreContentChanged() { super.onPreContentChanged(); mEmptyView = findViewById(android.R.id.empty); mList = (ExpandableListView) findViewById(android.R.id.list); if (mList == null) { throw new RuntimeException("Your content must have a ExpandableListView whose id attribute is " + "'android.R.id.list'"); } } @Override public void onPostContentChanged() { super.onPostContentChanged(); if (mEmptyView != null) { mList.setEmptyView(mEmptyView); } mList.setOnChildClickListener(this); mList.setOnGroupExpandListener(this); mList.setOnGroupCollapseListener(this); if (mFinishedStart) { setListAdapter(mAdapter); } mFinishedStart = true; } @Override public void setActionBarContentView(int resID) { throwSetActionBarContentViewException(); } @Override public void setActionBarContentView(View view, LayoutParams params) { throwSetActionBarContentViewException(); } @Override public void setActionBarContentView(View view) { throwSetActionBarContentViewException(); } private void throwSetActionBarContentViewException() { throw new UnsupportedOperationException( "The setActionBarContentView method is not supported for GDListActivity. In order to get a custom layout you must return a layout identifier in createLayout"); } @Override protected boolean verifyLayout() { return super.verifyLayout() && mList != null; } /** * Gets the ID of the currently selected group or child. * * @return The ID of the currently selected group or child. */ public long getSelectedId() { return mList.getSelectedId(); } /** * Gets the position (in packed position representation) of the currently * selected group or child. Use ExpandableListView#getPackedPositionType, * ExpandableListView#getPackedPositionGroup, and * ExpandableListView#getPackedPositionChild to unpack the returned packed * position. * * @return A packed position representation containing the currently * selected group or child's position and type. */ public long getSelectedPosition() { return mList.getSelectedPosition(); } /** * Sets the selection to the specified child. If the child is in a collapsed * group, the group will only be expanded and child subsequently selected if * shouldExpandGroup is set to true, otherwise the method will return false. * * @param groupPosition The position of the group that contains the child. * @param childPosition The position of the child within the group. * @param shouldExpandGroup Whether the child's group should be expanded if * it is collapsed. * @return Whether the selection was successfully set on the child. */ public boolean setSelectedChild(int groupPosition, int childPosition, boolean shouldExpandGroup) { return mList.setSelectedChild(groupPosition, childPosition, shouldExpandGroup); } /** * Sets the selection to the specified group. * * @param groupPosition The position of the group that should be selected. */ public void setSelectedGroup(int groupPosition) { mList.setSelectedGroup(groupPosition); } }