Qual è la differenza tra BaseAdapter e ArrayAdapter?


100

Voglio conoscere la differenza tra l'utilizzo BaseAdaptere ArrayAdapter.

Ho ottenuto quello che voglio attraverso ArrayAdapters.

Influisce sulle prestazioni ListViewdell'interfaccia dell'adattatore in cui è implementato?

E l'ultima domanda è: posso ottenere qualcosa con l' ListViewutilizzo di uno qualsiasi di questi Adapterso, in alcuni casi, è possibile utilizzare solo un adattatore specifico?


2
developer.android.com/reference/android/widget/… . ArrayAdpter. developer.android.com/reference/android/widget/BaseAdapter.html . BaseAdapter. ArrayAdapter è una sottoclasse concreta di BaseAdapter
Raghunandan

5
Semplicemente ArrayAdapter è già costruito, dobbiamo solo usarlo. ma il BaseAdapter è un adattatore più generico per il quale dobbiamo fornire l'implementazione. (metodi getView (), getcount () ecc in Adapter)
Pragnani

Risposte:


111

Ecco la differenza:

  • BaseAdapterè un adattatore molto generico che ti permette di fare praticamente tutto quello che vuoi. Tuttavia, devi fare un po 'più di codice da solo per farlo funzionare.
  • ArrayAdapterè un'implementazione più completa che funziona bene per i dati in array o ArrayLists. Allo stesso modo, c'è un correlato CursorAdapterche dovresti usare se i tuoi dati sono in un file Cursor. Entrambi si estendono BaseAdapter.

Se i tuoi dati si trovano in una raccolta specializzata di qualche tipo o se non desideri il comportamento predefinito che ArrayAdapterfornisce, probabilmente vorrai estenderli BaseAdapterper ottenere la flessibilità di cui hai bisogno.

Le prestazioni di ciascuno dipendono davvero da come vengono implementate o modificate il loro comportamento. In sostanza, entrambi possono essere altrettanto efficaci (soprattutto considerando che an ArrayAdapter è a BaseAdapter).

Puoi fare praticamente tutto ciò che vuoi con qualsiasi adattatore, ma tieni presente che BaseAdapterè astratto, quindi non puoi usarlo direttamente.


2
Il comportamento predefinito che ArrayAdapterfornisce (come menzionato da @ tanis-7x) è che ci può essere solo 1 TextViewall'interno dell'elemento dell'elenco, in realtà un comportamento molto limitato. Se sono presenti più controlli in ogni voce di elenco, è necessario utilizzare BaseAdaptere per il lavoro da soli. Ovviamente puoi ancora usare ArrayAdapter, perché ArrayAdapterè un file BaseAdapter.
Felix

21

BaseAdapterè astratto mentre si ArrayAdapterestende BaseAdapter(è un'implementazione concreta di a BaseAdapter). Se si estende per ArrayAdapterereditare tutte le ArrayAdapterfunzionalità di e, ignorando la sua implementazione, è possibile modificare il ArrayAdaptercomportamento. Se si estende BaseAdapterè necessario implementare tutti i metodi Abstract, che ArrayAdapter già implementa.

Inoltre, influisce sulle prestazioni di ListView

no non lo fa.

E l'ultima domanda è: posso ottenere qualcosa da fare con ListView utilizzando uno qualsiasi di questi adattatori o, in alcuni casi, è possibile utilizzare solo un adattatore specifico?

Se l'implementazione nell'SDK soddisfa le tue esigenze, perché è necessario sostituirla e reinventare la ruota?

La differenza principale tra loro è che BaseAdapter non è possibile istanziarla mentre è ArrayAdapterpossibile


9

In risposta alle tue 3 domande:

(1) BaseAdapter , secondo la documentazione di Android, è solo una superclasse di una serie di tipi di adattatori, uno dei quali è ArrayAdapter. Ci sono una serie di altri adattatori derivati ​​da quelli BaseAdapterche si adattano a scopi diversi. Di conseguenza è improbabile che ci sia qualche differenza di efficienza tra i due; hai solo accesso a un diverso insieme di funzioni / metodi con le varie sottoclassi.

(2) L'efficienza del tuo ArrayAdapterdipende dall'efficienza di ciò che stai facendo all'interno di quella classe, cioè l'elaborazione di bitmap e altri dati.

(3) Probabilmente potresti trovare un modo per lavorare ListViewusando un diverso tipo di adattatore, tuttavia, il motivo ArrayAdapterfunziona è perché di solito ha senso dato che l'obiettivo è costruire un elenco interattivo. Il ArrayAdapteprende un Array, solitamente un ArrayListdi oggetti, che poi elabora per creare le informazioni di supporto per il ListView. In questo senso l'impostazione di ArrayList-> ArrayAdapter-> ListViewha senso logicamente.


7

Un'altra differenza tra BaseAdapter e ArrayAdapters è che se estendi l'adattatore di array devi chiamare il costruttore della super classe nel costruttore della sottoclasse.

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;
   }

}

Ma non esiste una super classe per BaseAdapter. Poiché BaseAdapter funge da super classe per tutti gli altri adattatori

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;
   }

}

E non c'è bisogno di DataType specificato in BaseAdapter come in ArrayAdapter. Esempio: ArrayAdapter <String>
John

inoltre non dovresti mai usare List<T> UserList;nella classe che si 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);

Qui non possiamo usare BaseAdapter come ArrayAdapter.


3

BaseAdaptersono più minimali e personalizzabili. ArrayAdapters implementano gli usi più generali di ListAdapters, ma a volte non sono sufficienti.

Tuttavia, quasi tutto può essere ottenuto utilizzando ArrayAdapters. Se i tuoi elenchi funzionano già utilizzando correttamente ArrayAdapter, non hai nulla da guadagnare da BaseAdapter.

Tuttavia, se si archiviano la vostra Context, Arrayso Listsnell'implementazione ArrayAdapter, forse ti consigliamo di passare a BaseAdapter, come ArrayAdaptergià li ha implementati.

Ad ogni modo, se lo stai facendo, puoi sempre rimuovere quegli elementi e ricorrere all'uso getItem()per ottenere gli elementi Array, getCount()per ottenere la dimensione dell'array e getContext()per aumentare le tue visualizzazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.