2
respostas

Problema com ListView dentro de ListView

Boa tarde a todos, estou desenvolvendo uma aplicação onde esta possui uma activity onde gera uma ListView de Pedidos, e dentro do Adapter desta lista de pedidos, eu tenho outra ListView que são os itens, ou seja, eu tenho uma ListView dentro de outra ListView.

O problema é que o Android não deixa colocar uma ListView dentro de uma View que possua ScrollView, e por padrão, uma ListView já tem Scroll.

Para resolver isso, eu encontrei em fóruns na internet um código que percorreria os itens da minha list filha, pegar o tamanho de cada linha e assim, somando um tamanho total, porém ele não funcionou muito certo no meu projeto, alguém teria uma outra solução para isso? obrigado.

Código que encontrei na internet:

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

    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.UNSPECIFIED);
    int totalHeight = 0;
    View view = null;
    for (int i = 0; i < listAdapter.getCount(); i++) {
        view = listAdapter.getView(i, view, listView);
        if (i == 0)
            view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LayoutParams.WRAP_CONTENT));

        view.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
        totalHeight += view.getMeasuredHeight();
    }
    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
}
2 respostas

Fala ai Gabriel, de boa ?

Não curto muito a ideia de ter uma lista dentro de outra, para questão de usabilidade não é tão interessante.

Será que não é mais jogo tu pegar e pra cada pedido fazer um clique onde vê os detalhes dele e assim mostrar essa segunda lista ?

Bom dia Matheus!

Obrigado pela dica, mas infelizmente para o propósito da tela, o interessante seria uma listview dentro de outra...

Consegui resolver o problema a algumas semanas atrás fazendo adaptações no código citado a cima, segue o código que resolveu o problema para mim:

public void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            return;
        }

        int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();
        int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.AT_MOST);
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);

            if(listItem != null){
                // This next line is needed before you call measure or else you won't get measured height at all. The listitem needs to be drawn first to know the height.
                listItem.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT));
                listItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
                totalHeight += listItem.getMeasuredHeight();

            }
        }

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

Vale ressaltar que eu chamo esta função dentro do adapter da lista "filha".