Como gerar uma ListView com cabeçalhos acima de algumas seções?
-
25-09-2019 - |
Pergunta
Eu quero gerar um ListView
Isso tem alguns divisores entre algumas das entradas, como se possa ser visto em algumas das seções da propriedade. Veja o exemplo abaixo. Eu tento gerar um List
que consiste em alguns TextViews seguido por um dos divisores sofisticados explicando a próxima parte da lista e depois algumas visualizações de texto. Como isso pode ser feito? Pensei em criar visualizações diferentes para adicionar à lista? É este o caminho a percorrer?
Solução
Eu tenho uma solução. Não sei se é o melhor.
Eu uso um adaptador personalizado derivado de Arrayadapter para a lista, conforme descrito neste tutorial. Na classe adaptadora, verifico se a posição no método getView é uma linha normal, inflar o layout da linha. Se for a primeira linha de um novo grupo, inflar um layout de manchete que é uma linha normal, mais a manchete do grupo acima dele.
Se você não quiser misturar o cabeçalho em uma de suas linhas. Considere a seguinte solução:
Você pode substituir os dois métodos getItemViewType e getViewTyPeCount. Agora você tem uma lista que pode exibir linhas diferentes. Você precisa verificar o tipo de visualização esperado para o item no método getview e inflar layouts diferentes, dependendo dele.
A lista lidará com a reciclagem para você, de uma maneira que retornará apenas as visualizações de reciclagem corretas ao seu método GetView, isso significa que, se o RecycleView não for nulo, poderá ser usado para exibir sua célula atual.
Outras dicas
Você pode usar meu SectionedAdapter
, se o GPLV3 for aceitável (licenciado dessa maneira devido a algum código a montante). Você pode usar meu MergeAdapter
, se você precisar de algo mais flexível e com uma licença com menos limitação (Apache 2).
Eu acho que você pode estar procurando Android.widget.expandablelistView
http://developer.android.com/reference/android/widget/expandablelistView.html
Também estou interessado em uma resposta para isso. Deve haver uma maneira mais direta de fazer isso.
Ao olhar para o adaptador, há um método, adaptador.getItemViewType (posição int).
ListView define um valor de retorno, item_view_type_header_or_footer, que indica se o item retornado é um cabeçalho ou rodapé.
Não tentei, mas presumo que, se você criar seu próprio adaptador e devolver um item com o tipo indicando que é um cabeçalho ou rodapé, que o ListView o exibirá adequadamente.