2010-11-05 18 views
23

Estoy usando un GridView. Cuatro elementos en una columna. Cada elemento se compone del siguiente diseño:GridView: a veces las filas están alineadas en la parte superior, ¡a veces están alineadas con el fondo!

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <ImageView 
    android:layout_width="32dip" 
    android:layout_height="32dip"/> 

    <TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textSize="11dip" 
    android:paddingTop="2dip" /> 
</LinearLayout> 

De modo que cada elemento es una imagen pequeña con un poco de texto debajo. El diseño funciona muy bien en el primer pase. Sin embargo, si el texto de un elemento es largo, se ajusta a dos líneas. Esto funciona bien, hasta que lo desplace hacia adentro y fuera de la vista. Por defecto, todas las imágenes en una fila están alineadas en la parte superior. Cuando se desplaza una fila fuera de la pantalla, luego de vuelta a la pantalla, verá que la fila de alguna manera se alinea con el fondo. Parece que:

primer diseño:

[image] [image] [image] 
[text] [text] [text 
        wrap] 

así que aunque el tercer elemento tiene 2 líneas de texto, las tapas están alineados, que es perfecto. Si desplazo esta fila fuera de la pantalla, y luego de nuevo, se ve así:

    [image] 
[image] [image] [text 
[text] [text]  wrap] 

por lo que la fila se alinea en el botón inferior aquí. No estoy seguro de si esto es un error en GridView, o si hay alguna manera de controlar el diseño para alinear siempre las filas. Intenté establecer la gravedad del diseño del elemento como "superior", no es bueno. Tampoco parece haber ningún ajuste exclusivo para GridView para controlar esto. ¿Algunas ideas?

Gracias

+0

Todo lo que puedo pensar en que hacer por ahora es añadir un espacio en blanco para todas las cadenas a ser igual a la longitud de la cadena más larga de mi conjunto de datos. Dado que la fuente es monoespaciada (creo), entonces todo debería alinearse de nuevo de forma correcta. ¡Esto es una locura! – user291701

+0

por favor comparte la ans si ya has encontrado. – PiyushMishra

+0

@ user291701 ¿Alguna vez encontró una respuesta a esto, estoy luchando con él mismo –

Respuesta

0

Trate android:layout_gravity="top" en su LinearLayout.

Además, si usted está inflando manualmente sus diseños para las células, asegúrese de usar la versión inflate() que lleva el GridView como el segundo parámetro y el uso de falsa con el tercer parámetro.

+0

Argh no tuvo suerte con ninguno de los métodos. Aún alinea la fila inferior cuando se desplaza nuevamente a la vista. – user291701

+0

Otra cosa es que cuando se desplaza hacia arriba y hacia abajo, el cálculo de la barra de desplazamiento se vuelve loco: la vista de cuadrícula de repente le permite desplazarse infinitamente, por lo que termina mirando un lienzo en blanco. Tratar de retroceder falla en ese punto. Es un comportamiento realmente extraño, creo que es un error dentro de GridView. – user291701

+0

@ user291701: si crees que es un error, crea un proyecto de muestra que demuestre el comportamiento y publícalo con una explicación en http://b.android.com. Si lo piensas, agrega un enlace aquí al problema. – CommonsWare

14

La altura de los elementos en GridView debe ser la misma. Tienes 2 o 3 opciones.

  1. Dar una altura a la Vista de Texto
  2. Hacer la única línea de Vista de Texto con android:singleLine="true"
  3. Si usted debe tener 2 líneas en algunos de los artículos, que todos los elementos tienen 2 líneas. Puede hacerlo android:minLines="2"
+0

Gracias. Gran explicación Me ayuda mucho. –

+0

@RogerGarzonNieto ¿qué terminaste haciendo con esta respuesta? Realmente detestaba obligar a mi vista de texto a tener 2 líneas cada vez. Estoy seguro de que debería ser bastante sencillo hacer que todos los elementos secundarios en la vista de cuadrícula se alineen en la parte superior –

+0

Muchas gracias por su sugerencia de que funcionó como encanto – jyomin

0

Algunos dispositivos no funcionan bien con estilo.

grid.setColumnWidth(90); 
    grid.setNumColumns(GridView.AUTO_FIT); 
    grid.setVerticalSpacing(10); 
    grid.setHorizontalSpacing(10); 
    grid.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); 
    grid.setGravity(Gravity.CENTER); 
    grid.setOnItemClickListener(this); 

<style name="GridViewStyle" parent="@android:style/Widget.GridView"> 
     <item name="android:layout_width">fill_parent</item> 
     <item name="android:layout_height">fill_parent</item> 
     <item name="android:columnWidth">90dp</item> 
     <item name="android:numColumns">auto_fit</item> 
     <item name="android:verticalSpacing">10dp</item> 
     <item name="android:horizontalSpacing">10dp</item> 
     <item name="android:stretchMode">columnWidth</item> 
     <item name="android:gravity">center</item> 
    </style> 

// mira que mi adaptador de retorno TextView
// tengo problemas con el fin som sólo hay que refrescar adaptador (onResume o cambio de orientación)

public View getView(final int position, View convertView, ViewGroup parent) { 
     if (convertView!=null) return convertView; 

     Intent intent = (Intent) getItem(position); 
     TextView tv = new TextView(mContext); 
     tv.setGravity(Gravity.CENTER_HORIZONTAL); 
     tv.setText(intent.getStringExtra("text")); 

     try { 
      tv.setCompoundDrawablesWithIntrinsicBounds(null, mContext.getPackageManager().getActivityIcon(intent), null, null); 
     } catch (NameNotFoundException e) { 
      tv.setCompoundDrawablesWithIntrinsicBounds(0, android.R.drawable.ic_secure, 0, 0); 
     } 

     return tv; 
    } 
0

Si está utilizando un getview método, puede establecer su altura/ancho de forma dinámica, no necesita tomar todos los elementos del mismo tamaño. Recortará automáticamente la imagen desde su centro de forma dinámica.

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imageView = new ImageView(mContext); 
     imageView.setImageResource(mThumbIds[position]); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); //it will crop the image from center 
     imageView.setLayoutParams(new GridView.LayoutParams(70, 70)); 
     return imageView; 
    } 

también establecer el número de columnas que desea en su xml

<?xml version="1.0" encoding="utf-8"?> 
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/grid_view" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:numColumns="2"   // set the number of coloums 
    android:columnWidth="90dp" 
    android:horizontalSpacing="10dp" 
    android:verticalSpacing="10dp" 
    android:gravity="center" 
    android:stretchMode="columnWidth" > 
</GridView> 
Cuestiones relacionadas