Alguém com palavras simples pode me explicar o uso getViewTypeCount()
e os getItemViewType()
métodos de ArrayAdapter
?
Eles lidam com o caso em que você deseja diferentes tipos de exibição para diferentes linhas. Por exemplo, em um aplicativo de contatos, você pode querer que as linhas pares tenham imagens no lado esquerdo e as linhas ímpares tenham imagens no lado direito. Nesse caso, você usaria:
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return position % 2;
}
A estrutura usa seu tipo de exibição para decidir quais exibições serão entregues convertView
no seu getView
método . Em outras palavras, no exemplo acima, suas linhas pares só terão vistas recicladas com imagens no lado esquerdo para reutilização, e as linhas ímpares terão apenas aquelas com imagens à direita.
Se todas as linhas da sua lista tiverem o mesmo layout, não será necessário se preocupar com os tipos de exibição. De fato, BaseAdapter.java fornece um comportamento padrão para todos os adaptadores:
public int getItemViewType(int position) {
return 0;
}
public int getViewTypeCount() {
return 1;
}
Isso realmente fornece o mesmo tipo de exibição para cada linha.
Editar - para descrever o fluxo geral:
AdapterView
uso de um adaptador.AdapterView
tentativas para exibir itens visíveis para o usuário.getItemViewType
linha n
, a linha que está prestes a exibir.n
tipo de linha . Não encontra nenhum porque ainda não foram recicladas visualizações.getView
é chamado para linha n
.getItemViewType
uma linha n
para determinar que tipo de visualização você deve usar.getView
, e a exibição da sua linha é exibida para o usuário.Agora, quando uma exibição é reciclada rolando para fora da tela, ela entra em um pool de exibições recicladas que é gerenciado pela estrutura. Eles são essencialmente organizados por tipo de visualização, de modo que uma visualização do tipo correto seja fornecida no convertView
parâmetro em seu getView
método:
getItemViewType
a linha que deseja exibir.convertView
parâmetro para o seu getView
método.
Se precisarmos mostrar um tipo diferente de exibição na exibição de lista, é bom usá-lo
getViewTypeCount()
egetItemViewType()
no adaptador em vez de alternar uma exibiçãoView.GONE
eView.VISIBLE
pode ser uma tarefa muito cara, ogetView()
que afetará a rolagem da lista.Por favor, verifique este para uso do
getViewTypeCount()
egetItemViewType()
no adaptador.Link: o-uso-de-getviewtypecount
fonte
Assista Outttt !!!!
Eu tive que enfrentar um problema ao implementar um
ListView
ontem e há dois tipos de visualizações de linhas desordenadas logo após eu rolar. Embora a resposta mais votada neste tópico dê uma boa explicação geral, ela não destacou a parte mais importante das informações para interromper o bug da interface do usuário acima mencionado.Aqui é a minha explicação:
Ambos
getViewTypeCount()
egetItemViewType()
estão sendo usados porBaseAdapter
'sgetView
método para descobrir qual o tipo de uma visão deve-se buscar, reciclados e devolvidos. (conforme explicado na resposta superior no tópico). Mas se você não implementar esses dois métodos de maneira intuitiva, de acordo com o Android API Doc, poderá entrar no problema que mencionei.Resumido Orientação para a implementação:
Para implementar vários tipos de
Views
paraListView
linhas 's temos de implementar, essencialmente,getItemViewType()
egetViewTypeCount()
métodos. E agetItemViewType()
documentação nos fornece uma nota da seguinte maneira:Portanto,
getItemViewType()
você deve retornar valores para o Tipo de exibição, começando em 0, para o último tipo como (número de tipos - 1). Por exemplo, digamos que você tenha apenas três tipos de visualizações? Portanto, dependendo do objeto de dados da exibição, você pode retornar apenas 0 ou 1 ou 2 dogetItemViewType()
método, como um índice de matriz baseado em zero. E como você tem três tipos de visualizações usadas, seugetViewTypeCount()
método deve retornar 3.De qualquer forma, se você retornar outros valores inteiros como 1, 2, 3 ou 111, 222, 333 para esse método, você definitivamente poderá experimentar o bug da interface do usuário acima, que acabou de colocar, não obedecendo ao Documento da API do Android.
Se você não recebeu a pista ou ainda não conseguiu resolver e precisa de mais informações, leia minha resposta detalhada neste tópico de perguntas e respostas do StackOverflow .
Leia o Documento do desenvolvedor do Android para obter mais informações. Você pode encontrar a pista diretamente.
Espero que esta resposta possa ser útil para alguém lá fora, para economizar muitas horas !!!
Felicidades!!!
fonte
IGNORE_ITEM_VIEW_TYPE
que tive um bug em um dos meus ListView. Usei um ArrayAdapter para inserir uma visualização composta por 1 imagem e 2 de texto. Eu tinha apenas um tipo de visualização. Tentei não substituir o método getItemViewType ou substituí-lo retornando a posição ou um número inteiro codificado. Em todos os casos, eu estava enfrentando duplicatas na minha lista, com um comportamento estranho ao rolar (alterações nas duplicatas). O retornoIGNORE_ITEM_VIEW_TYPE
do método corrigiu o problema. Obrigado.