Qual é a diferença entre BaseAdapter e ArrayAdapter?

100

Eu quero saber a diferença entre usar BaseAdaptere ArrayAdapter.

Tenho conseguido o que desejo ArrayAdapters.

Isso afeta o desempenho da ListViewinterface do adaptador em que é implementado?

E, a última pergunta é, posso conseguir algo com o ListViewuso de qualquer um desses Adapters, ou, há certos casos em que apenas um adaptador específico pode ser usado?

Chintan Soni
fonte
2
developer.android.com/reference/android/widget/… . ArrayAdpter. developer.android.com/reference/android/widget/BaseAdapter.html . BaseAdapter. ArrayAdapter é uma subclasse concreta de BaseAdapter
Raghunandan
5
Simplesmente ArrayAdapter já está construído, só precisamos usá-lo. mas o BaseAdapter é um adaptador mais genérico para o qual precisamos fornecer implementação. (métodos getView (), getcount () etc. no adaptador)
Pragnani

Respostas:

111

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 ou ArrayLists. Da mesma forma, há um item relacionado CursorAdapterque você deve usar se seus dados estiverem em um Cursor. Ambos se estendem BaseAdapter.

Se seus dados estiverem em uma coleção especializada de algum tipo ou se você não quiser o comportamento padrão ArrayAdapterfornecido, provavelmente desejará estender BaseAdapterpara 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 é a BaseAdapter).

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.

Bryan Herbst
fonte
2
O comportamento padrão ArrayAdapterfornecido (conforme mencionado por @ tanis-7x) é que pode haver apenas 1 TextViewdentro do item da lista, na verdade, um comportamento muito limitado. Se houver vários controles em cada item da lista, você deve usar BaseAdaptere fazer o trabalho sozinho. Claro que você ainda pode usar ArrayAdapter, porque ArrayAdapteré a BaseAdapter.
Felix
21

BaseAdapteré abstrato enquanto ArrayAdapterestende BaseAdapter(é uma implementação concreta de a BaseAdapter). Se você estende para ArrayAdaptervocê está herdando todos os ArrayAdapterrecursos do e, sobrescrever sua implementação, você pode modificar o ArrayAdaptercomportamento. Se você estende, BaseAdapterdeve implementar todos os métodos Abstract que ArrayAdapter já implementa.

Além disso, isso afeta o desempenho do ListView

não, não tem.

E, a última pergunta é: posso conseguir alguma coisa com ListView usando qualquer um desses adaptadores, ou, há certos casos em que apenas um adaptador específico pode ser usado?

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 enquanto ArrayAdapterpodem

Cinto preto
fonte
9

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 derivados BaseAdapterque 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 ArrayAdapterdepende 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 ListViewusando um tipo diferente de adaptador; no entanto, o motivo pelo qual ArrayAdapterfunciona é porque geralmente faz sentido, visto que o objetivo é construir uma lista interativa. O ArrayAdaptepega um Array, geralmente um ArrayListde objetos, que então processa para criar as informações de apoio para o ListView. Nesse sentido, a configuração de ArrayList-> ArrayAdapter-> ListViewlogicamente faz sentido.

Rarw
fonte
7

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.

UserListAdapter extends ArrayAdapter<String>{

   List<String> UserList;
   Context context;

   public UserListAdapter(Context context, int resource,List<String> listUsers) {
     super(context, resource, listUsers);      /* Super class constructor is called */
     UserList = listUsers;
     this.context = context;
   }

}

Mas não há superclasse para BaseAdapter. Como BaseAdapter serve como superclasse para todos os outros adaptadores

UserListAdapter extends BaseAdapter{

   List<String> UserList;
   Context context;

   public UserListAdapter(Context context, int resource,List<String> listUsers) {
     /* No super class constructor */
     UserList = listUsers;
     this.context = context;
   }

}
John
fonte
E não há necessidade de DataType especificado em BaseAdapter como em ArrayAdapter. Exemplo: ArrayAdapter <String>
John
também você nunca deve usar List<T> UserList;na classe que se estende ArrayAdapter<T>
Selvin
6
private static final String[] COUNTRIES = new String[]{
            "Afghanistan", "Angola", "Australia", "Bangladesh", "Belgium",
            "Bhutan", "Brazil", "Canada", "China", "Denmark"
    };

ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, COUNTRIES);
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.countries_list);
textView.setAdapter(adapter);

Aqui não podemos usar BaseAdapter como ArrayAdapter.

Amit Yadav
fonte
3

BaseAdapters são mais mínimos e personalizáveis. ArrayAdapters implementam os usos mais gerais de ListAdapters, mas às vezes não são suficientes.

No entanto, quase tudo pode ser alcançado com o uso de ArrayAdapters. 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, Arraysou Listsem sua implementação de ArrayAdapter, talvez você queira mudar para BaseAdapter, pois ArrayAdapterjá 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 e getContext()para aumentar suas visualizações.

Charlie-Blake
fonte