2012-03-01 14 views
6

Vedo uno strano comportamento con il mio ListView, che non riesco a capire.Altezza dinamica per riga ListView in Android

Ho un ListView, che è popolato con alcuni dati. Ogni riga contiene un'immagine e tre etichette di testo. Ecco la mia XML per la fila (sto gonfiando nel metodo dell'adattatore 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> 

Ora, tutto ciò che entra nei campi di testo può essere di qualsiasi lunghezza (da pochi caratteri a 80-100 caratteri) e voglio che le etichette si avvolgano appena e l'altezza della riga si espanda per adattarsi all'altezza delle etichette avvolte.

Tuttavia, le etichette si avvolgono correttamente, ma l'altezza della riga non si espande, pertanto la parte inferiore delle etichette viene tagliata. Ecco il mio metodo getView:

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

Come posso avere le righe per essere di diversa altezza, regolata automaticamente per adattarsi tutti i contenuti?

+0

Modo migliore utilizzare Android: maxLines = 1 in Textview in Layout di riga suo Prevenire più di un testo di riga –

+0

Hai provato adujusting Android: layout_weight a 1 o qualcosa del genere? –

+0

@Samir: Voglio l'esatto contrario: le etichette DEVONO avvolgere, poiché ho bisogno che tutto il testo sia visibile. –

risposta

8

Prova a modificare le tue TextView con Android: layout_height = "wrap_content".

+0

Questo fa quasi quello che voglio. Cioè, l'altezza della riga ora si estende per consentire l'avvolgimento delle etichette, tuttavia perdo la capacità di colorare correttamente le colonne impostando diversi colori di sfondo su etichette diverse. Ora il colore si estende solo fino a quando l'etichetta si avvolge e, se un'altra etichetta si avvolge su più linee, ottengo uno sfondo bianco di default sotto la mia etichetta colorata. Qualche idea su come affrontarlo? –

+0

Accetterò questa risposta poiché alla fine questo è ciò che dovevo fare e poi ho passato un sacco di altre elaborazioni dolorose per ottenere il layout come volevo. –

4

Ho avuto il problema di Sam e la risposta di @ maebe non ha funzionato per me. Per farlo funzionare, ho dovuto chiamare requestLayout() sul mio TextView in getView dell'adattatore.

Quindi, nel tuo caso, si dovrebbe chiamare requestLayout() per ogni 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; 
} 

ho provato ogni sorta di trucchi e questo è l'unico che ha funzionato nel mio caso.

+0

+1 per questo trucco. Ha reso la mia giornata. Grazie mille @muscardinus – niranjan94

Problemi correlati