2012-03-01 14 views
6

Estoy viendo un comportamiento extraño con mi ListView, que parece que no puedo moverme.Altura dinámica para la fila ListView en android

Tengo un ListView, que se completa con algunos datos. Cada fila contiene una imagen y tres etiquetas de texto. Aquí está mi XML para la fila (estoy inflarlo en el método del adaptador getView):

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:paddingTop="0dip" 
    android:paddingBottom="0dip" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 

    <ImageView android:id="@+id/Icon" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="2" 
     android:padding="2dp" 
     android:scaleType="fitCenter" 
     android:contentDescription="@string/app_icon"/> 

    <TextView android:id="@+id/TxtName" 
     android:scrollHorizontally="false" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:textColor="@android:color/black" 
     android:background="@color/list_bg1" 
     android:layout_weight="2" 
     android:padding="2dp"/> 

    <TextView android:id="@+id/TxtPackage" 
     android:scrollHorizontally="false" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="2" 
     android:textColor="@android:color/black" 
     android:background="@color/list_bg2" 
     android:padding="2dp"/> 

    <TextView android:id="@+id/TxtSource" 
     android:scrollHorizontally="false" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="2" 
     android:background="@color/list_bg3" 
     android:textColor="@android:color/black" 
     android:padding="2dp"/> 
</LinearLayout> 

Ahora, lo que entra en los campos de texto pueden ser de cualquier longitud (desde unos pocos caracteres de 80-100 caracteres) y quiero que las etiquetas se envuelvan y la altura de la fila se expanda para acomodar la altura de las etiquetas envueltas.

Sin embargo, las etiquetas se envuelven correctamente, pero la altura de la fila no se expande, por lo tanto, la parte inferior de las etiquetas se corta. Aquí está mi getView método:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    SetInfo app = (SetInfo)getItem(position); 
    if(app == null) 
     return null; 

    LinearLayout row = (LinearLayout) (convertView == null 
       ? LayoutInflater.from(context).inflate(R.layout.listitem, parent, false) 
       : convertView); 
    ((TextView)row.findViewById(R.id.TxtName)).setText(app.getName()); 
    ((TextView)row.findViewById(R.id.TxtPackage)).setText(app.getPackage()); 
    ((TextView)row.findViewById(R.id.TxtSource)).setText(app.getSource()); 
    if(app.getIcon() != null) 
     ((ImageView)row.findViewById(R.id.Icon)).setImageDrawable(app.getIcon()); 
    return row; 
} 

¿Cómo puedo tener las filas a ser de diferente altura, ajusta automáticamente para adaptarse a todos los contenidos?

+0

Mejor forma de usar android: maxLines = 1 en Textview en Diseño de fila es Impedir más de una línea de texto –

+0

¿Ha intentado adujusting android: layout_weight a 1 o algo así? –

+0

@Samir: Quiero exactamente lo contrario: las etiquetas DEBEN envolver, ya que necesito que todo el texto esté visible. –

Respuesta

8

Intenta cambiar tus TextViews por android: layout_height = "wrap_content".

+0

Esto casi hace lo que quiero. Es decir, la altura de la fila ahora se extiende para permitir el envolvimiento de las etiquetas, sin embargo, pierdo la capacidad de colorear correctamente las columnas estableciendo diferentes colores de fondo para diferentes etiquetas. Ahora el color solo se extiende tanto como la etiqueta se enrolla y, si otra etiqueta se ajusta a más líneas, obtengo un fondo predeterminado blanco debajo de mi etiqueta de color. ¿Alguna idea de cómo abordar esto? –

+0

Aceptaré esta respuesta, ya que esto es lo que tenía que hacer, y luego iré con un montón de otros procesos dolorosos para obtener el diseño como quería. –

4

Tuve el problema de Sam y la respuesta de @maebe no funcionó para mí. Para que funcione, tuve que llamar a requestLayout() en mi TextView en getView del adaptador.

Así, en su caso, se tendría que llamar requestLayout() para cada TextView:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    // Inflate your view etc. 

    row.findViewById(R.id.TxtName).requestLayout(); 
    row.findViewById(R.id.TxtPackage).requestLayout(); 
    row.findViewById(R.id.TxtSource).requestLayout(); 
    return row; 
} 

Probé todo tipo de trucos y este es el único que trabajó en mi caso.

+0

+1 para este truco. Me alegró el día. Muchas gracias @muscardinus – niranjan94

Cuestiones relacionadas