ti-enxame.com

Android: como medir a altura total do ListView

Preciso medir a altura total do ListView, mas parece que estou constantemente recebendo valores errados. Estou usando este código:

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

O problema é que estou recebendo uma altura maior do que deveria. Cada item da lista é medido de maneira diferente e todos os itens têm a mesma altura, portanto, definitivamente não deve fazer isso. A altura de cada elemento é pelo menos o dobro da sua altura real.

Agradeço antecipadamente.

edit1:

Eu tenho dois ListViews e ambos têm itens com 6-7 campos EditText. Eu mostro/oculto o ListView se o usuário deseja gravar/excluir valores no EditText. Tudo funciona bem, exceto quando eu quero mostrar a lista, é preciso muito espaço porque o ListView calculado pelo método precisa de muito espaço. Por esse motivo, tenho muito espaço vazio abaixo desse ListView. Como três vezes mais espaço vazio que era necessário.

22
Cristiano

Finalmente eu consegui! Este é o código de trabalho que mede a altura do ListView e define o ListView em tamanho real:

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();

}
52
Cristiano

Tente algo como isto:

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

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

Se você deseja a altura do listView, tente o seguinte:

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

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

Você também pode verificar isso: Calcular o tamanho de uma exibição de lista ou como instruí-la a expandir completamente

3
lokoko

O ListView armazena em cache os itens da exibição e os reutiliza. Se você tem uma exibição de lista com 1000 itens e apenas 6 visíveis, por que não vale a pena exibir o 994.

Medir todo o ListView significaria renderizar cada ListItem, parece um pouco exagerado.

Não sei o que você está tentando alcançar, mas provavelmente existe uma maneira melhor :)

0
Thibault D.