Android GridView con categorías?

¿Es posible usar categorías o algún tipo de encabezados con un GridView en Android?

Puse una ilustración rápida de lo que estaba pensando:

Introduzca aquí la descripción de la imagen

Muchas gracias.

Puede utilizar la biblioteca Stickygridheaders directamente o como modelo para crear su propio widget.

Creo que puedes hacerlo, pero tienes que implementar SeparatedListAdapter de Jeff Shrkey

No hay una manera fácil de crear estas listas separadas, así que he juntado SeparatedListAdapter que lo hace rápidamente. Para resumir, estamos creando un nuevo BaseAdapter que puede contener varios otros adaptadores, cada uno con sus propios encabezados de sección.

Puede modificar el adaptador de listview habitual para devolver una cuadrícula en cada fila, ver aquí

 public GenericModelAdapter(Context context, int textViewResourceId, List<Map<String, List<Object>>> items, Map<String, String> sectionHeaderTitles, int numberOfCols, View.OnClickListener mItemClickListener){ super(context, textViewResourceId, items); this.items = items; this.numberOfCols = numberOfCols; layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); this.mItemClickListener = mItemClickListener; this.sectionHeaderTitles = sectionHeaderTitles; } @Override public View getView(int position, View convertView, ViewGroup parent) { if(isHeaderPosition(position)){ convertView = layoutInflater.inflate(R.layout.grid_header_view, null); TextView headerText = (TextView)convertView.findViewById(R.id.headerText); String section = getItemTypeAtPosition(position); headerText.setText(getHeaderForSection(section)); return convertView; }else{ LinearLayout row = (LinearLayout)layoutInflater.inflate(R.layout.row_item, null); Map<String, List<Object>> map = getItem(position); List<Object> list = map.get(getItemTypeAtPosition(position)); for (int i = 0; i < numberOfCols; i++){ FrameLayout grid = (FrameLayout)layoutInflater.inflate(R.layout.grid_item, row, false); ImageView imageView; if (i < list.size()){ GenericModel model = (GenericModel)list.get(i); if (grid != null){ imageView = (ImageView)grid.findViewWithTag("image"); imageView.setBackgroundResource(model.getImageResource()); TextView textView = (TextView)grid.findViewWithTag("subHeader"); textView.setText(model.getHeader()); grid.setTag(R.id.row, position); grid.setTag(R.id.col, i); grid.setOnClickListener(mItemClickListener); } }else{ if (grid != null){ grid.setVisibility(View.INVISIBLE); grid.setOnClickListener(null); } } row.addView(grid); } return row; } } @Override public int getCount() { int totalItems = 0; for (Map<String, List<Object>> map : items){ Set<String> set = map.keySet(); for(String key : set){ //calculate the number of rows each set homogeneous grid would occupy List<Object> l = map.get(key); int rows = l.size() % numberOfCols == 0 ? l.size() / numberOfCols : (l.size() / numberOfCols) + 1; // insert the header position if (rows > 0){ headerPositions.add(String.valueOf(totalItems)); offsetForItemTypeMap.put(key, totalItems); itemTypePositionsMap.put(key, totalItems + "," + (totalItems + rows) ); totalItems += 1; // header view takes up one position } totalItems+= rows; } } return totalItems; } @Override public Map<String, List<Object>> getItem(int position) { if (!isHeaderPosition(position)){ String itemType = getItemTypeAtPosition(position); List<Object> list = null; for (Map<String, List<Object>> map : items) { if (map.containsKey(itemType)){ list = map.get(itemType); break; } } if (list != null){ int offset = position - getOffsetForItemType(itemType); //remove header position offset -= 1; int low = offset * numberOfCols; int high = low + numberOfCols < list.size() ? (low + numberOfCols) : list.size(); List<Object> subList = list.subList(low, high); Map<String, List<Object>> subListMap = new HashMap<String, List<Object>>(); subListMap.put(itemType, subList); return subListMap; } } return null; } public String getItemTypeAtPosition(int position){ String itemType = "Unknown"; Set<String> set = itemTypePositionsMap.keySet(); for(String key : set){ String[] bounds = itemTypePositionsMap.get(key).split(","); int lowerBound = Integer.valueOf(bounds[0]); int upperBoundary = Integer.valueOf(bounds[1]); if (position >= lowerBound && position <= upperBoundary){ itemType = key; break; } } return itemType; } public int getOffsetForItemType(String itemType){ return offsetForItemTypeMap.get(itemType); } public boolean isHeaderPosition(int position){ return headerPositions.contains(String.valueOf(position)); } private String getHeaderForSection(String section){ if (sectionHeaderTitles != null){ return sectionHeaderTitles.get(section); }else{ return section; } } 

GridView con categorías de fruta de muestra

Probablemente este código le ayudará. Se trata de SectionedGridRecyclerViewAdapter, resultado se ve así:

Introduzca aquí la descripción de la imagen

  • Barra de Acción Contextual en Honeycomb
  • Android GridView no está siendo detectado
  • Notificaciones de nido de abeja - ¿Cómo configurar largeIcon en el tamaño correcto?
  • Android Honeycomb: Cómo estilo de flecha de la esquina derecha en spinner en un ActionBar
  • Shared Toast no se muestra en Android 3.0.1 en Motorola Xoom
  • IllegalArgumentException al girar el dispositivo en el selector de Live Wallpaper Android 3.0
  • ¿Cómo quitar el margen entre el icono de la aplicación y el borde de la pantalla en el ActionBar?
  • Cómo detectar los clics de botón del sistema "Aplicaciones recientes" (Honeycomb +)
  • KeyListener en SearchView en Honeycomb ActionBar no funciona
  • Android: ¿Cómo cambiar el icono "Home" de ActionBar para que sea algo distinto del icono de la aplicación?
  • GetActionBar () devuelve null
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.