GridScenario.java revision 1d3165f10b12165f02b7015ac1a817c5f60e6399
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 171d3165f10b12165f02b7015ac1a817c5f60e6399Neal Nguyenpackage android.util; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Activity; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Window; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AbsListView; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AdapterView; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.BaseAdapter; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.GridView; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ListAdapter; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.TextView; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.google.android.collect.Maps; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Utility base class for creating various GridView scenarios. Configurable by the number 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of items, how tall each item should be (in relation to the screen height), and 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * what item should start with selection. 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class GridScenario extends Activity { 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private GridView mGridView; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNumItems; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mStartingSelectionPosition; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private double mItemScreenSizeFactor; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Map<Integer, Double> mOverrideItemScreenSizeFactors = Maps.newHashMap(); 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mScreenHeight; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mStackFromBottom; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mColumnWidth; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNumColumns; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mStretchMode; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mVerticalSpacing; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public GridView getGridView() { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mGridView; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected int getScreenHeight() { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mScreenHeight; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The initial number of items in the grid as specified by the scenario. 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This number may change over time. 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected int getInitialNumItems() { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNumItems; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The desired height of 1 item, ignoring overrides 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDesiredItemHeight() { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (int) (mScreenHeight * mItemScreenSizeFactor); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Better way to pass in optional params than a honkin' paramater list :) 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class Params { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNumItems = 4; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mStartingSelectionPosition = -1; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private double mItemScreenSizeFactor = 1 / 5; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Map<Integer, Double> mOverrideItemScreenSizeFactors = Maps.newHashMap(); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mStackFromBottom = false; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mMustFillScreen = true; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mColumnWidth = 0; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNumColumns = GridView.AUTO_FIT; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mStretchMode = GridView.STRETCH_COLUMN_WIDTH; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mVerticalSpacing = 0; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the number of items in the grid. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Params setNumItems(int numItems) { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumItems = numItems; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the position that starts selected. 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param startingSelectionPosition The selected position within the adapter's data set. 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pass -1 if you do not want to force a selection. 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Params setStartingSelectionPosition(int startingSelectionPosition) { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartingSelectionPosition = startingSelectionPosition; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the factor that determines how tall each item is in relation to the 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * screen height. 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Params setItemScreenSizeFactor(double itemScreenSizeFactor) { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItemScreenSizeFactor = itemScreenSizeFactor; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Override the item screen size factor for a particular item. Useful for 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * creating grids with non-uniform item height. 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param position The position in the grid. 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param itemScreenSizeFactor The screen size factor to use for the height. 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Params setPositionScreenSizeFactorOverride( 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int position, double itemScreenSizeFactor) { 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverrideItemScreenSizeFactors.put(position, itemScreenSizeFactor); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the stacking direction 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param stackFromBottom 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Params setStackFromBottom(boolean stackFromBottom) { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStackFromBottom = stackFromBottom; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets whether the sum of the height of the grid items must be at least the 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * height of the grid view. 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Params setMustFillScreen(boolean fillScreen) { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMustFillScreen = fillScreen; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the individual width of each column. 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param requestedWidth the width in pixels of the column 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Params setColumnWidth(int requestedWidth) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mColumnWidth = requestedWidth; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the number of columns in the grid. 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Params setNumColumns(int numColumns) { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumColumns = numColumns; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the stretch mode. 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Params setStretchMode(int stretchMode) { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStretchMode = stretchMode; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the spacing between rows in the grid 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Params setVerticalSpacing(int verticalSpacing) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVerticalSpacing = verticalSpacing; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How each scenario customizes its behavior. 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param params 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected abstract void init(Params params); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Override this to provide an different adapter for your scenario 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The adapter that this scenario will use 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected ListAdapter createAdapter() { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new MyAdapter(); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Override this if you want to know when something has been selected (perhaps 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more importantly, that {@link android.widget.AdapterView.OnItemSelectedListener} has 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been triggered). 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings({ "UnusedDeclaration" }) 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void positionSelected(int positon) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Override this if you want to know that nothing is selected. 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void nothingSelected() { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onCreate(Bundle icicle) { 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onCreate(icicle); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // turn off title bar 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestWindowFeature(Window.FEATURE_NO_TITLE); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenHeight = getWindowManager().getDefaultDisplay().getHeight(); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Params params = new Params(); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(params); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readAndValidateParams(params); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGridView = new GridView(this); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGridView.setLayoutParams(new ViewGroup.LayoutParams( 245980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy ViewGroup.LayoutParams.MATCH_PARENT, 246980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy ViewGroup.LayoutParams.MATCH_PARENT)); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGridView.setDrawSelectorOnTop(false); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNumColumns >= GridView.AUTO_FIT) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGridView.setNumColumns(mNumColumns); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mColumnWidth > 0) { 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGridView.setColumnWidth(mColumnWidth); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mVerticalSpacing > 0) { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGridView.setVerticalSpacing(mVerticalSpacing); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGridView.setStretchMode(mStretchMode); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGridView.setAdapter(createAdapter()); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mStartingSelectionPosition >= 0) { 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGridView.setSelection(mStartingSelectionPosition); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGridView.setPadding(10, 10, 10, 10); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGridView.setStackFromBottom(mStackFromBottom); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGridView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onItemSelected(AdapterView parent, View v, int position, long id) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project positionSelected(position); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onNothingSelected(AdapterView parent) { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nothingSelected(); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setContentView(mGridView); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read in and validate all of the params passed in by the scenario. 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param params 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readAndValidateParams(Params params) { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (params.mMustFillScreen ) { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double totalFactor = 0.0; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < params.mNumItems; i++) { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (params.mOverrideItemScreenSizeFactors.containsKey(i)) { 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalFactor += params.mOverrideItemScreenSizeFactors.get(i); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalFactor += params.mItemScreenSizeFactor; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (totalFactor < 1.0) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("grid items must combine to be at least " + 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "the height of the screen. this is not the case with " + params.mNumItems 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " items and " + params.mItemScreenSizeFactor + " screen factor and " + 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "screen height of " + mScreenHeight); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumItems = params.mNumItems; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartingSelectionPosition = params.mStartingSelectionPosition; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItemScreenSizeFactor = params.mItemScreenSizeFactor; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOverrideItemScreenSizeFactors.putAll(params.mOverrideItemScreenSizeFactors); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStackFromBottom = params.mStackFromBottom; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mColumnWidth = params.mColumnWidth; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumColumns = params.mNumColumns; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStretchMode = params.mStretchMode; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVerticalSpacing = params.mVerticalSpacing; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final String getValueAtPosition(int position) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "postion " + position; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a view for a grid item. Override this to create a custom view beyond 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the simple focusable / unfocusable text view. 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param position The position. 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parent The parent 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param desiredHeight The height the view should be to respect the desired item 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to screen height ratio. 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a view for the grid. 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected View createView(int position, ViewGroup parent, int desiredHeight) { 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView result = new TextView(parent.getContext()); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result.setHeight(desiredHeight); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result.setText(getValueAtPosition(position)); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ViewGroup.LayoutParams lp = new AbsListView.LayoutParams( 333980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy ViewGroup.LayoutParams.MATCH_PARENT, 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewGroup.LayoutParams.WRAP_CONTENT); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result.setLayoutParams(lp); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result.setId(position); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result.setBackgroundColor(0x55ffffff); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class MyAdapter extends BaseAdapter { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getCount() { 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNumItems; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object getItem(int position) { 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getValueAtPosition(position); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getItemId(int position) { 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return position; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (convertView != null) { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((TextView) convertView).setText(getValueAtPosition(position)); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project convertView.setId(position); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return convertView; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int desiredHeight = getDesiredItemHeight(); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOverrideItemScreenSizeFactors.containsKey(position)) { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project desiredHeight = (int) (mScreenHeight * mOverrideItemScreenSizeFactors.get(position)); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createView(position, parent, desiredHeight); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 371