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:
- Animar la transición de fragmentos cuando se cargan fragmentos de XML
- Cómo iniciar un modo de acción en android 3.0
- Android GridView con categorías?
- Preferencia personalizada, targetSdkVersion = "11": falta el sangrado?
- ¿Cómo alinear los elementos en la barra de acción a la izquierda?
Muchas gracias.
- Flash en WebView no funciona en Android 3.2
- HLS (http streaming en vivo) en Android 3.0 y buscando
- Android 3.x SOLO Selección de texto de WebView + JavaScript
- Emulador de panal invertido pantalla en retrato
- Estilo de pestaña de Android ActionBar para Honeycomb
- WebView dentro de ViewPager o ScrollView - extraño error de renderizado en Android 3.0+
- ¿Funciona la gran pila de Android para teléfonos antiguos actualizados a ICS?
- ¿Cómo ocultar la barra de acción antes de que se cree la actividad, y luego mostrarla de nuevo?
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; } }
Probablemente este código le ayudará. Se trata de SectionedGridRecyclerViewAdapter, resultado se ve así: