Was ist der Unterschied zwischen BaseAdapter und ArrayAdapter?

100

Ich möchte den Unterschied zwischen BaseAdapterund kennen ArrayAdapter.

Ich habe erreicht, was ich will ArrayAdapters.

Beeinträchtigt es die Leistung ListViewder Adapterschnittstelle, in der es implementiert ist?

Und die letzte Frage ist, kann ich irgendetwas erreichen, wenn ich ListVieweines davon benutze Adapters, oder gibt es bestimmte Fälle, in denen nur ein bestimmter Adapter verwendet werden kann?

Chintan Soni
quelle
2
developer.android.com/reference/android/widget/… . ArrayAdpter. developer.android.com/reference/android/widget/BaseAdapter.html . BaseAdapter. ArrayAdapter ist eine konkrete Unterklasse von BaseAdapter
Raghunandan
5
Einfach ArrayAdapter ist bereits aufgebaut, wir müssen es nur verwenden. Aber der BaseAdapter ist ein allgemeinerer Adapter, für den wir die Implementierung bereitstellen müssen (Methoden getView (), getcount () usw. in Adapter)
Pragnani

Antworten:

111

Hier ist der Unterschied:

  • BaseAdapterist ein sehr allgemeiner Adapter, mit dem Sie so ziemlich alles tun können, was Sie wollen. Sie müssen jedoch etwas mehr selbst programmieren, damit es funktioniert.
  • ArrayAdapterist eine vollständigere Implementierung, die für Daten in Arrays oder ArrayLists gut funktioniert . Ebenso gibt es einen verwandten CursorAdapter, den Sie verwenden sollten, wenn sich Ihre Daten in einem befinden Cursor. Beide erstrecken sich BaseAdapter.

Wenn sich Ihre Daten in einer speziellen Sammlung befinden oder wenn Sie nicht das Standardverhalten wünschen, das bereitgestellt ArrayAdapterwird, möchten Sie wahrscheinlich erweitern BaseAdapter, um die Flexibilität zu erhalten, die Sie benötigen.

Die Leistung jedes einzelnen hängt wirklich davon ab, wie Sie sie implementieren oder ihr Verhalten ändern. Im Kern kann entweder eine sein ebenso wirksam (besonders wenn man bedenkt , dass ein ArrayAdapter ist ein BaseAdapter).

Sie können mit jedem Adapter so ziemlich alles tun, was Sie wollen, aber denken Sie daran, dass dies BaseAdapterabstrakt ist, sodass Sie es nicht direkt verwenden können.

Bryan Herbst
quelle
2
Das Standardverhalten ArrayAdapter(wie von @ tanis-7x erwähnt) ist, dass TextViewdas Listenelement nur 1 enthalten kann , was tatsächlich ein sehr begrenztes Verhalten darstellt. Wenn in jedem Listenelement mehrere Steuerelemente vorhanden sind, müssen Sie BaseAdapterund für den Job selbst verwenden. Natürlich können Sie noch verwenden ArrayAdapter, da ArrayAdapteres sich um eine handelt BaseAdapter.
Felix
21

BaseAdapterist abstrakt während ArrayAdaptererweitert BaseAdapter(es ist eine konkrete Implementierung von a BaseAdapter). Wenn Sie erweitern, weil ArrayAdapterSie alle ArrayAdapterFunktionen von erben , und die Implementierung überschreiben, können Sie das ArrayAdapterVerhalten ändern . Wenn Sie erweitern BaseAdapter, müssen Sie alle Abstract-Methoden implementieren, die ArrayAdapter bereits implementiert.

Beeinträchtigt dies auch die Leistung der ListView?

Nein, tut es nicht.

Und die letzte Frage ist, kann ich mit ListView mit einem dieser Adapter etwas erreichen, oder gibt es bestimmte Fälle, in denen nur ein bestimmter Adapter verwendet werden kann?

Wenn die Implementierung im SDK Ihren Anforderungen entspricht, warum müssen Sie sie überschreiben und das Rad neu erfinden?

Der Hauptunterschied zwischen ihnen ist, dass BaseAdapter nicht instanziiert werden ArrayAdapterkann, während kann

Schwarzer Gürtel
quelle
9

Als Antwort auf Ihre 3 Fragen:

(1) BaseAdapter ist laut Android-Dokumentation nur eine Oberklasse einer Reihe von Adaptertypen , von denen einer ist ArrayAdapter. Es gibt eine Reihe anderer Adapter, die davon abgeleitet sind und BaseAdapterfür andere Zwecke geeignet sind. Infolgedessen ist es unwahrscheinlich, dass zwischen beiden ein Unterschied in der Effizienz besteht. Sie erhalten nur Zugriff auf verschiedene Funktionen / Methoden mit den verschiedenen Unterklassen.

(2) Die Effizienz Ihrer ArrayAdapterArbeit hängt von der Effizienz Ihrer Arbeit in dieser Klasse ab, dh von der Verarbeitung von Bitmaps und anderen Daten.

(3) Sie könnten wahrscheinlich einen Weg finden, wie Sie ListViewmit einem anderen Adapter arbeiten können. Der Grund dafür ArrayAdapterist jedoch, dass dies normalerweise sinnvoll ist, da das Ziel darin besteht, eine interaktive Liste zu erstellen. Das ArrayAdaptenimmt ein Array, normalerweise eines ArrayListvon Objekten, das es dann verarbeitet, um die Hintergrundinformationen für das zu erstellen ListView. In diesem Sinne ist die Einrichtung von ArrayList-> ArrayAdapter-> ListViewnur logisch sinnvoll.

Rarw
quelle
7

Ein weiterer Unterschied zwischen BaseAdapter und ArrayAdapters besteht darin, dass Sie beim Erweitern des Array-Adapters den Superklassenkonstruktor im Unterklassenkonstruktor aufrufen müssen.

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

}

Es gibt jedoch keine Superklasse für BaseAdapter. Als BaseAdapter dient als Superklasse für alle anderen Adapter

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
quelle
Und keine Notwendigkeit für den in BaseAdapter angegebenen Datentyp wie in ArrayAdapter. Beispiel: ArrayAdapter <String>
John
Auch sollten Sie nie List<T> UserList;in der Klasse verwenden, die erweitert 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);

Hier können wir BaseAdapter nicht wie ArrayAdapter verwenden.

Amit Yadav
quelle
3

BaseAdapters sind minimaler und anpassbar. ArrayAdapters implementieren die allgemeinsten Verwendungen von ListAdapters, aber manchmal reichen sie nicht aus.

Mit ArrayAdapters kann jedoch fast alles erreicht werden . Wenn Ihre Listen bereits mit ArrayAdapter korrekt funktionieren, können Sie mit BaseAdapter nichts gewinnen.

Wenn Sie jedoch Ihre oder Ihre ArrayAdapter-Implementierung speichern Context, möchten Sie möglicherweise zu , as wechselnArraysListsBaseAdapterArrayAdapter bereits implementiert sind.

Wenn Sie dies tun, können Sie diese Elemente jederzeit entfernen und verwenden getItem(), um die Array-Elemente abzurufen, getCount()die Größe des Arrays zu ermitteln und getContext()Ihre Ansichten zu vergrößern .

Charlie-Blake
quelle