Eu quero saber a diferença entre usar BaseAdapter
e ArrayAdapter
.
Tenho conseguido o que desejo ArrayAdapters
.
Isso afeta o desempenho da ListView
interface do adaptador em que é implementado?
E, a última pergunta é, posso conseguir algo com o ListView
uso de qualquer um desses Adapters
, ou, há certos casos em que apenas um adaptador específico pode ser usado?
android
performance
listview
android-arrayadapter
baseadapter
Chintan Soni
fonte
fonte
Respostas:
Aqui está a diferença:
BaseAdapter
é um adaptador muito genérico que permite fazer praticamente o que quiser. No entanto, você mesmo precisa codificar um pouco mais para fazê-lo funcionar.ArrayAdapter
é uma implementação mais completa que funciona bem para dados em arrays ouArrayList
s. Da mesma forma, há um item relacionadoCursorAdapter
que você deve usar se seus dados estiverem em umCursor
. Ambos se estendemBaseAdapter
.Se seus dados estiverem em uma coleção especializada de algum tipo ou se você não quiser o comportamento padrão
ArrayAdapter
fornecido, provavelmente desejará estenderBaseAdapter
para obter a flexibilidade de que precisa.O desempenho de cada um realmente depende de como você os implementa ou muda seu comportamento. Em sua essência, qualquer um pode ser igualmente eficaz (especialmente considerando que um
ArrayAdapter
é aBaseAdapter
).Você pode fazer praticamente o que quiser com qualquer adaptador, mas lembre-se de que isso
BaseAdapter
é abstrato, portanto, você não pode usá-lo diretamente.fonte
ArrayAdapter
fornecido (conforme mencionado por @ tanis-7x) é que pode haver apenas 1TextView
dentro do item da lista, na verdade, um comportamento muito limitado. Se houver vários controles em cada item da lista, você deve usarBaseAdapter
e fazer o trabalho sozinho. Claro que você ainda pode usarArrayAdapter
, porqueArrayAdapter
é aBaseAdapter
.BaseAdapter
é abstrato enquantoArrayAdapter
estendeBaseAdapter
(é uma implementação concreta de aBaseAdapter
). Se você estende paraArrayAdapter
você está herdando todos osArrayAdapter
recursos do e, sobrescrever sua implementação, você pode modificar oArrayAdapter
comportamento. Se você estende,BaseAdapter
deve implementar todos os métodos Abstract que ArrayAdapter já implementa.não, não tem.
Se a implementação no SDK atende às suas necessidades, por que você precisa substituí-la e reinventar a roda?
A principal diferença entre eles é que
BaseAdapter
não podem ser instanciados enquantoArrayAdapter
podemfonte
Em resposta às suas 3 perguntas:
(1) BaseAdapter , de acordo com os documentos do Android, é apenas uma superclasse de vários tipos de adaptadores, um dos quais é
ArrayAdapter
. Existem vários outros adaptadores derivadosBaseAdapter
que se adaptam a finalidades diferentes. Como resultado, é improvável que haja alguma diferença de eficiência entre os dois; você apenas obtém acesso a um conjunto diferente de funções / métodos com as várias subclasses.(2) A eficiência do seu
ArrayAdapter
depende da eficiência do que você está fazendo dentro dessa classe, ou seja, o processamento de bitmaps e outros dados.(3) Você provavelmente poderia descobrir uma maneira de trabalhar
ListView
usando um tipo diferente de adaptador; no entanto, o motivo pelo qualArrayAdapter
funciona é porque geralmente faz sentido, visto que o objetivo é construir uma lista interativa. OArrayAdapte
pega umArray
, geralmente umArrayList
de objetos, que então processa para criar as informações de apoio para oListView
. Nesse sentido, a configuração deArrayList
->ArrayAdapter
->ListView
logicamente faz sentido.fonte
Mais uma diferença entre BaseAdapter e ArrayAdapters é, se você estender o adaptador de array, terá que chamar o construtor da superclasse no construtor da subclasse.
Mas não há superclasse para BaseAdapter. Como BaseAdapter serve como superclasse para todos os outros adaptadores
fonte
List<T> UserList;
na classe que se estendeArrayAdapter<T>
Aqui não podemos usar BaseAdapter como ArrayAdapter.
fonte
BaseAdapter
s são mais mínimos e personalizáveis.ArrayAdapter
s implementam os usos mais gerais deListAdapter
s, mas às vezes não são suficientes.No entanto, quase tudo pode ser alcançado com o uso de
ArrayAdapter
s. Se suas listas já estão funcionando usando ArrayAdapter corretamente, você não tem nada a ganhar com BaseAdapter.No entanto, se você estiver armazenando seu
Context
,Arrays
ouLists
em sua implementação de ArrayAdapter, talvez você queira mudar paraBaseAdapter
, poisArrayAdapter
já os implementou.De qualquer forma, se você estiver fazendo isso, você sempre pode remover esses itens e recorrer ao uso
getItem()
para obter os itens do Array,getCount()
para obter o tamanho do array egetContext()
para aumentar suas visualizações.fonte