15

Ho bisogno di misurare l'altezza totale del ListView ma sembra che ottenga costantemente valori errati. Sto usando questo codice:Android: come misurare l'altezza totale di ListView

public static void setListViewHeightBasedOnChildren(ListView listView) { 
    ListAdapter listAdapter = listView.getAdapter(); 
    if (listAdapter == null) { 
     return; 
    } 

    int totalHeight = 0; 
    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), 
      MeasureSpec.AT_MOST); 
    Log.w("DESIRED WIDTH", String.valueOf(listAdapter.getCount())); 
    for (int i = 0; i < listAdapter.getCount(); i++) { 
     View listItem = listAdapter.getView(i, null, listView); 
     listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 
     totalHeight += listItem.getMeasuredHeight(); 
     Log.w("HEIGHT"+i, String.valueOf(totalHeight)); 
    } 

    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = totalHeight 
      + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
    listView.setLayoutParams(params); 
    listView.requestLayout(); 
} 

Il problema è che sto ricevendo un'altezza superiore a quella che dovrei ricevere. Ogni elemento della lista viene misurato in modo diverso e tutti gli elementi hanno la stessa altezza, quindi sicuramente non dovrebbe farlo. L'altezza di ogni elemento è almeno il doppio della sua altezza reale.

Grazie in anticipo.

edit1:

ho due ListViews ed entrambi hanno oggetti con 6-7 campi EditText. Mostrare/nascondere ListView se l'utente vuole scrivere/cancellare valori in EditText. Tutto funziona bene, tranne quando voglio mostrare la lista, ci vuole un sacco di spazio perché il ListView calcolato dal metodo ha bisogno di molto spazio. Per questo motivo ho un sacco di spazio vuoto al di sotto di ListView. Come lo spazio vuoto tre volte più necessario.

+1

http://stackoverflow.com/questions/2312683/calculate-the-size-of-a-list-view-or- how-to-tell-it-to-fully-expand – RobinHood

+0

Grazie, ma questo non funziona per me. Penso di avere questo problema perché non ho un solo ListView. Probabilmente c'è qualche conflitto con la copertura spaziale. – Cristiano

risposta

42

Finalmente l'ho fatto! Questo è il codice di lavoro che misura l'altezza ListView e imposta ListView in piena:

public static void getTotalHeightofListView(ListView listView) { 

    ListAdapter mAdapter = listView.getAdapter(); 

    int totalHeight = 0; 

    for (int i = 0; i < mAdapter.getCount(); i++) { 
     View mView = mAdapter.getView(i, null, listView); 

     mView.measure(
       MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 

       MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 

     totalHeight += mView.getMeasuredHeight(); 
     Log.w("HEIGHT" + i, String.valueOf(totalHeight)); 

    } 

    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = totalHeight 
      + (listView.getDividerHeight() * (mAdapter.getCount() - 1)); 
    listView.setLayoutParams(params); 
    listView.requestLayout(); 

} 
+7

Dovresti cambiare il nome di questo metodo. L'inizio con "get" implica un valore di ritorno diverso da void. –

+0

Inoltre, questo metodo è molto lento da eseguire, consiglio di eseguirlo solo quando cambia il conteggio delle voci dell'elenco. –

+4

È inoltre necessario aggiungere 'listView.getPaddingTop()' e in basso. – njzk2

0

ListView memorizza nella cache gli elementi della vista e li riutilizza. Se si dispone di una vista elenco con 1000 elementi e solo 6 visibili, perché, non vale la pena di mostrare la 994 non visualizzata.

Misurare l'intero ListView significherebbe rendere ogni ListItem, sembra un po 'eccessivo.

Non so che cosa si sta cercando di raggiungere, ma probabilmente c'è un modo migliore :)

+0

Non ho tanti elementi :) Ho due ListViews e hanno entrambi articoli con 6-7 campi EditText. Mostrare/nascondere ListView se l'utente vuole scrivere/cancellare valori in EditText. Tutto funziona bene, tranne quando voglio mostrare la lista, ci vuole un sacco di spazio perché il ListView calcolato dal metodo ha bisogno di molto spazio. Per questo motivo ho un sacco di spazio vuoto al di sotto di ListView. Come lo spazio vuoto tre volte più necessario. – Cristiano

+0

Ma ListView non sa come lo userai, quindi è scritto in questo modo. Se vuoi che sparisca quello della listview e rilasci lo spazio sullo schermo per riempire l'altro elenco, usa View.setVisibility (View.GONE) –

+0

Sto usando 'View.setVisibility (View.GONE)' ma quando Lo mostro ancora ci vuole davvero molto spazio, schermo intero di spazio vuoto. Sto controllando un link che @RobinHood ha pubblicato. Sembra che siano riusciti a farlo misurandolo in modo diverso. – Cristiano

2

provare qualcosa di simile:

listItem.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

    public void onGlobalLayout() { 
    int listItemHeight = listItem.getHeight(); 
    } 
}); 

Se si desidera che l'altezza del listView quindi provare questo :

listView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

    public void onGlobalLayout() { 
    int listViewHeight = listView.getHeight(); 
    } 
}); 

Si potrebbe anche verificare questo: Calculate the size of a list view or how to tell it to fully expand

+0

Grazie, ma questo non funziona per me. Ho fatto una modifica nel primo post. Penso che il problema sia con più liste. – Cristiano

+0

Se qualcuno ha un elenco contenente elementi con la stessa altezza, suppongo che si stia facendo la lista .ayoutParams = new LinearLayout.LayoutParams (fill_parent, thisFixedHeight * Count) è la strada da percorrere. Nessuna iterazione da nessuna parte. Il vero problema è avere qualcosa che funzioni con liste di liste di liste. –