2011-07-11 27 views
7

tratar de hacer una lista de puntuación más alta, que es desplazable, y se ve así:GridView con diferentes tamaños de la columna

foo   1000 
bar   876 
foobar  500 
foobarfoo 1 

Actualmente estoy haciendo con un GridView. Me gustaría establecer el ancho de la columna del nombre al 60% de la pantalla y el ancho de la columna de puntuación al 40%. ¿Es posible?

Actualmente estoy intentando a través de un adaptador Costum. Esta es la funcion getView para ello:

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; 
} 

La disposición es construido por el 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 permitir la adición de diferentes columnas de tamaño? Si es así, ¿entonces mi enfoque es bueno? (Probablemente no, ya que no funciona :)) ¿Me perdí algo?

¡Gracias de antemano!

+0

puede que intente configurar el ancho de columna a wrap_content en lugar de 0DP y luego ver si funciona? –

+0

Eso lamentablemente no es un valor válido para el ancho de columna. ¡Pero, gracias por el comentario! – Szellszi

+0

En ese caso, podría usar un ListView en lugar de GridView, y para cada fila, use un diseño con dos vistas de texto (LinearLayout preferiblemente) que complete en el método getView de su adaptador. –

Respuesta

1

¡Trabajando como un encanto! Muchas gracias a Abhinav, quien 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 cree que puede mejorar este código (ya que soy un novato en este campo) Don 'dude, para responder! ¡Gracias por adelantado!

+1

Buena explicación, pero si tengo 3 columnas, ¿cómo lograr esto? – Randroid

5

Teníamos que hacer esto para un proyecto, y no queríamos usar nada más que un GridView porque la funcionalidad se repitió, pero en uno GridView necesitábamos una configuración de vista ligeramente diferente (pero aún usando un adaptador y todo esa otra cosa buena). Descubrimos que puede HACER esto si invalida la función GridViewlayoutChildren, aunque está bastante poco documentada.

Nuestra aplicación tiene un cheque por una visión especial y por si el nuevo diseño ya ha sido implementado:

@Override 
protected void layoutChildren(){ 
    super.layoutChildren(); 
    if(!isSpecial || layoutAlreadySet) return; 
    layoutAlreadySet = true; 
    //Implement special layout.... 
} 
+0

Hola Steve. Encontré este hilo porque estaba buscando una solución para mi problema. Intento mostrar dos tipos diferentes de una vista personalizada en mi GridView. El tipo A tiene un ancho de 150dp y el tipo B tiene un ancho de 310dp. Siempre quiero que la celda envuelva su contenido. ¿Es eso posible con tu solución? – JensJensen

+1

Esta solución es solo para hacer que el GridView haga algo diferente de lo que normalmente haría, pero aún así alimentarlo con información de un Adaptador. Puede ser más fácil hacer lo que intenta hacer con un objeto de diseño diferente, como LinearLayout. Dicho esto, usamos este código para implementar una celda de tamaño personalizado dentro de un GridView, por lo que si ese es el tipo de cosas que necesita hacer, esta es una ruta que puede tomar. – Steve

Cuestiones relacionadas