GridView con diferentes tamaños de columna
Intentando crear una lista de puntuaciones altas, que es desplazable, y se ve así:
foo 1000 bar 876 foobar 500 foobarfoo 1
Actualmente lo estoy haciendo con un GridView. Me gustaría fijar el ancho de la columna de nombre al 60% de la pantalla y el ancho de la columna de puntuación al 40%. ¿Es posible?
- Comprobación de si Android Gridview se desplaza a su parte superior
- ¿Por qué los artículos cambian de orden al desplazarse en Android GridView?
- ¿Puede un GridView tener un pie de página y un encabezado igual que ListView?
- Cómo hacer que customAdapter rellene la altura de gridview
- Implementación de Radio Group en Grid View en Android
Actualmente estoy tratando a través de un adaptador de costum. Aquí está la función getview para él:
public View getView(int position, View convertView, ViewGroup parent) { TextView tv; if (convertView == null) { tv = new TextView(context); tv.setTextSize(25); tv.setTextColor(Color.WHITE); if (position % 2 == 0) { tv.setLayoutParams(new GridView.LayoutParams((width/10)*6, 50)); } else { tv.setLayoutParams(new GridView.LayoutParams((width/10)*4, 50)); } } else { tv = (TextView) convertView; } tv.setText(texts[position]); return tv; }
El diseño está construido por gridview y un botón en la parte inferior. El archivo XML es:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/top"> <GridView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="2" android:id="@+id/grid" android:numColumns="2" android:columnWidth="0dp" > </GridView> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/backbutton" android:text="@string/backstr"></Button> </LinearLayout>
Así que la pregunta de nuevo: ¿Es posible establecer el GridView para dejar la adición de diferentes columnas de tamaño? Si es así, entonces mi enfoque es bueno? (Probablemente no, ya que no funciona :)) ¿Acabo de perder algo?
¡Gracias de antemano!
- Cómo agregar espacio adicional dentro de la parte inferior de un GridView
- ¿Cómo hacer que la animación de GridView sea como en la aplicación de Google Keep?
- Establecer la altura fija de la fila de GridView
- GridView del estilo de Google Play Música
- GridView mediante Custom ArrayAdapter
- ¿Cómo puedo añadir dinámicamente imágenes a un GridView?
- Android: BaseAdapter y getLayoutInflater en un archivo de clase separado
- Carga de imágenes asíncronas en un GridView (Android)
Tuvimos que hacer esto para un proyecto, y no queríamos usar nada más que un GridView
porque la funcionalidad se repetía, pero en un GridView
necesitábamos una configuración de vista ligeramente diferente (pero aún usando un adaptador y todo lo demás bueno ). Encontramos que PUEDE hacer esto si anula la función layoutChildren
GridView
, aunque está bastante mal documentada.
Nuestra implementación tiene un cheque para una vista especial y para si el nuevo diseño ya se ha implementado:
@Override protected void layoutChildren(){ super.layoutChildren(); if(!isSpecial || layoutAlreadySet) return; layoutAlreadySet = true; //Implement special layout.... }
Trabajando como un encanto! Muchas gracias a Abhinav, que hizo un buen consejo. Aquí está el código para todos los que tienen el mismo problema:
public View getView(int position, View convertView, ViewGroup parent) { TextView tv1; TextView tv2; LinearLayout ll; if (convertView == null) { tv1 = new TextView(context); tv1.setTextSize(25); tv1.setTextColor(Color.WHITE); tv1.setGravity(Gravity.LEFT); tv1.setPadding(5, 5, 5, 5); tv1.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT, (float) 3.0)); tv2 = new TextView(context); tv2.setTextSize(25); tv2.setTextColor(Color.WHITE); tv2.setGravity(Gravity.RIGHT); tv2.setPadding(5, 5, 5, 5); tv2.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT, (float) 4.0)); ll = new LinearLayout(context); ll.setOrientation(0); ll.setPadding(5, 5, 5, 10); tv1.setText(names[position]); tv2.setText(scores[position]); ll.addView(tv1); ll.addView(tv2); } else { ll = (LinearLayout) convertView; tv1 = (TextView) ll.getChildAt(0); tv2 = (TextView) ll.getChildAt(1); tv1.setText(names[position]); tv2.setText(scores[position]); } return ll; }
Y el archivo XML:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/top"> <ListView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="2" android:numColumns="2" android:columnWidth="0dp" android:id="@+id/list"> </ListView> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/backbutton" android:text="@string/back"></Button> </LinearLayout>
Si crees que puedes mejorar este código (ya que soy un novato en este campo) no dudes, para responder! ¡Gracias por adelantado!
- Aplicación selectableItemBackground estrellándose
- ¿Cómo pasar una matriz de objetos a una actividad?