14c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein/* 24c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * Copyright (C) 2012 Google Inc. All Rights Reserved. 34c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein */ 44c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 54c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzsteinpackage com.android.deskclock.widget.sgv; 64c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzsteinimport android.view.View; 74c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzsteinimport android.view.ViewGroup; 84c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzsteinimport android.widget.BaseAdapter; 94c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 104c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzsteinimport com.android.deskclock.widget.sgv.ReorderUtils; 114c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 124c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein/** 134c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * Adapter for use with {@link StaggeredGridView}. Copied from Keep. 144c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * TODO: Keep up to date with fixes to their code; if they move into a shared library, use that. 154c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein */ 164c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzsteinpublic abstract class GridAdapter extends BaseAdapter { 174c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein /** 184c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * A tag key which stores the id of the associated object. If set, this 194c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * allows for faster creation of views. 204c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein */ 214c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein private static final int GRID_ID_TAG = "gridIdTag".hashCode(); 224c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein private View mHeaderView; 234c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein private View mFooterView; 244c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 254c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein public GridAdapter() { 264c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein super(); 274c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 284c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 294c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein /** 304c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * Checks to see if the child at the specified position is draggable 314c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @param position The position of the child to check against 324c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @return boolean If true, the child at the specified position is draggable. 334c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein */ 344c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein public boolean isDraggable(int position) { 354c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein return false; 364c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 374c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 384c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein /** 394c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * For a view at the specified position, return the region around the view that is a possible 404c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * reordering area. 414c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @param position The adapter position 424c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @param isLastColumnInGrid Flag to indicate whether the view at the specified position is 434c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * laid out at the last column in the grid. Being in the last column has some UI implications 444c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * when it comes to reordering. As an example, if a view has reordering area set to Left, and 454c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * is laid out in the last column, the grid may also choose to enable the right reordering area 464c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * for this view as well so that the user has the convenience have dropping views on the right 474c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * edge of the grid to re-order. 484c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @return int The re-ordering area for the view at this adapter position. 494c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * Possible return values are a combination of 504c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * {@link ReorderUtils#REORDER_AREA_NONE}, {@link ReorderUtils#REORDER_AREA_VALID} 514c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein */ 524c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein public int getReorderingArea(int position, boolean isLastColumnInGrid) { 534c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein return ReorderUtils.REORDER_AREA_NONE; 544c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 554c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 564c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein /** 574c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * The direction for drag to reorder that is allowed. By default, the allowed direction 584c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * is free across both horizontal and vertical axes. 594c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @return int The allowed direction for drag to reorder. Possible return values are a 604c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * combination of {@link ReorderUtils#REORDER_DIRECTION_VERTICAL} and/or 614c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * {@link ReorderUtils#REORDER_DIRECTION_HORIZONTAL} 624c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein */ 634c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein public int getReorderingDirection() { 644c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein return ReorderUtils.REORDER_DIRECTION_VERTICAL | ReorderUtils.REORDER_DIRECTION_HORIZONTAL; 654c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 664c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 674c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein public View getHeaderView() { 684c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein return mHeaderView; 694c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 704c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 714c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein public void setHeaderView(View view) { 724c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein mHeaderView = view; 734c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 744c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 754c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein public View getFooterView() { 764c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein return mFooterView; 774c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 784c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 794c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein public void setFooterView(View view) { 804c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein mFooterView = view; 814c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 824c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 834c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein public boolean hasHeader() { 844c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein return mHeaderView != null; 854c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 864c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 874c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein public boolean hasFooter() { 884c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein return mFooterView != null; 894c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 904c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 914c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein /** 924c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * Views created via the GridAdapter or any subclasses should call this to 934c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * store the id of the item associated with them. 944c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein */ 954c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein public void setItemId(View view, long id) { 964c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein view.setTag(GRID_ID_TAG, id); 974c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 984c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 994c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein /** 1004c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * Get the id of the item associated with this view. 1014c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein */ 1024c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein public long getItemIdFromView(View view, int position) { 1034c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein final Object id = view.getTag(GRID_ID_TAG); 1044c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein if (id != null) { 1054c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein return (Long) id; 1064c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 1074c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 1084c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein return getItemId(position); 1094c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 1104c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 1114c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein /** 1124c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * Get the id of the item associated with this view. The specified Object is associated with 1134c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * the view at this position, and can be used to optimize retrieval of the id by the adapter. 1144c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @param item Object associated with this view at this position. 1154c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @param position Position of the item. 1164c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @return id Id for the item at this position. 1174c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein */ 1184c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein public long getItemId(Object item, int position) { 1194c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein // TODO: Rather than using Object, use BaseNode so that we're not confused between this 1204c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein // method, and the method above. 1214c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein return getItemId(position); 1224c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 1234c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 1244c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein /** 1254c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * Get the type of the view given the item it will display based on its 1264c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * position in the cursor managed by the adapter. Previously, the adapter 1274c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * would create an item based on the position and use that item to get the 1284c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * view type. However, if the item already exists due to another call that 1294c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * required it, it is much better to reuse the item than recreate it. 1304c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * 1314c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @param item Object associated with the view at this position 1324c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @param position Position of the item we are verifying 1334c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @return int representing the type of the item at the supplied position 1344c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein */ 1354c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein public int getItemViewType(Object item, int position) { 1364c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein return getItemViewType(position); 1374c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 1384c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 1394c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein /** 1404c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * Get the view given its associated item. 1414c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * 1424c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @param item Object associated with the view at this position 1434c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @param position Position of the item we are verifying 1444c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @param scrap The old view to reuse, if possible. Note: You should check 1454c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * that this view is non-null and of an appropriate type before 1464c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * using. If it is not possible to convert this view to display 1474c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * the correct data, this method can create a new view. 1484c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * Heterogeneous lists can specify their number of view types, so 1494c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * that this View is always of the right type (see 1504c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * getViewTypeCount() and getItemViewType(int)). 1514c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @param parent The parent view this view will eventually be attached to 1524c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @param measuredWidth 1534c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * @return View 1544c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein */ 1554c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein public View getView(Object item, int position, View scrap, ViewGroup parent, 1564c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein int measuredWidth) { 1574c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein return getView(position, scrap, parent); 1584c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 1594c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 1604c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein /** 1614c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * Get how many columns a specific view will span in the grid. 1624c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein */ 1634c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein abstract public int getItemColumnSpan(Object item, int position); 1644c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 1654c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein /** 1664c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * The first change position of all items. It will be used by 1674c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * StaggeredGridView to optimize rendering, such as skip unchanged items. By 1684c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * default it returns 0, so StaggeredGridView will not try to optimize. 1694c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein */ 1704c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein public int getFirstChangedPosition() { 1714c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein return 0; 1724c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 1734c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein 1744c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein /** 1754c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * StaggeredGridView only works with stable id. Any adapter which wants to 1764c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein * use staggered grid view is enforced to use stable ids. 1774c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein */ 1784c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein @Override 1794c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein public boolean hasStableIds() { 1804c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein return true; 1814c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein } 1824c68a4b737d7776fd23e857eb612f89c6dba3ec0Sam Blitzstein} 183