Jaka jest różnica między BaseAdapter i ArrayAdapter?

100

Chcę poznać różnicę między używaniem BaseAdaptera ArrayAdapter.

Osiągałem to, przez co chcę ArrayAdapters.

Czy wpływa na wydajność ListViewinterfejsu adaptera, w którym jest zaimplementowany?

I ostatnie pytanie brzmi: czy mogę coś zrobić z ListViewużyciem któregokolwiek z nich Adapters, czy są pewne przypadki, w których można użyć tylko określonego adaptera?

Chintan Soni
źródło
2
developer.android.com/reference/android/widget/… . ArrayAdpter. developer.android.com/reference/android/widget/BaseAdapter.html . BaseAdapter. ArrayAdapter jest konkretną podklasą BaseAdapter
Raghunandan
5
Po prostu ArrayAdapter jest już skonstruowany, po prostu musimy go użyć. ale BaseAdapter jest bardziej ogólnym adapterem, dla którego musimy zapewnić implementację. (metody getView (), getcount () itp. w adapterze)
Pragnani

Odpowiedzi:

111

Oto różnica:

  • BaseAdapterto bardzo ogólny adapter, który pozwala ci robić prawie wszystko, co chcesz. Jednak musisz wykonać trochę więcej kodowania, aby działało.
  • ArrayAdapterjest bardziej kompletną implementacją, która działa dobrze w przypadku danych w tablicach lub ArrayLists. Podobnie istnieje powiązanie CursorAdapter, z którego powinieneś skorzystać, jeśli Twoje dane znajdują się w pliku Cursor. Obydwa rozciągają się BaseAdapter.

Jeśli Twoje dane znajdują się w jakiejś wyspecjalizowanej kolekcji lub jeśli nie chcesz domyślnego zachowania, które ArrayAdapterzapewnia, prawdopodobnie będziesz chciał rozszerzyć, BaseAdapteraby uzyskać potrzebną elastyczność.

Wydajność każdego z nich naprawdę zależy od tego, jak je wdrożysz lub zmienisz ich zachowanie. W gruncie rzeczy każdy z nich może być równie skuteczny (zwłaszcza biorąc pod uwagę, że jest ArrayAdapter to a BaseAdapter).

Możesz zrobić prawie wszystko, co chcesz, z dowolnym adapterem, ale pamiętaj, że BaseAdapterjest to abstrakcyjne, więc nie możesz go używać bezpośrednio.

Bryan Herbst
źródło
2
Domyślnym zachowaniem, które ArrayAdapterzapewnia (jak wspomniano w @ tanis-7x) jest to, że TextViewwewnątrz elementu listy może znajdować się tylko 1 , w rzeczywistości bardzo ograniczone zachowanie. Jeśli w każdym elemencie listy znajduje się wiele elementów sterujących, musisz BaseAdaptersamodzielnie użyć i do zadania. Oczywiście możesz nadal używać ArrayAdapter, ponieważ ArrayAdapterjest to plik BaseAdapter.
Felix
21

BaseAdapterjest abstrakcyjna, gdy się ArrayAdapterrozciąga BaseAdapter(jest to konkretna implementacja a BaseAdapter). Jeśli rozszerzysz ArrayAdapter, dziedziczysz wszystkie ArrayAdapterfunkcje i nadpisujesz jego implementację, możesz zmodyfikować ArrayAdapterzachowanie. Jeśli rozszerzysz BaseAdapter, musisz zaimplementować wszystkie metody Abstract, które ArrayAdapter już implementuje.

Czy ma to również wpływ na wydajność ListView

nie.

I ostatnie pytanie brzmi: czy mogę coś zrobić z ListView przy użyciu któregokolwiek z tych adapterów, czy też są pewne przypadki, w których można użyć tylko określonego adaptera?

Jeśli implementacja w SDK spełnia Twoje potrzeby, dlaczego musisz ją zastąpić i ponownie wymyślić koło?

Główna różnica między nimi polega na tym, że BaseAdapter nie można utworzyć wystąpienia, podczas gdy ArrayAdaptermożna

Czarny pas
źródło
9

W odpowiedzi na Twoje 3 pytania:

(1) BaseAdapter , zgodnie z dokumentacją Androida, jest po prostu nadklasą wielu typów adapterów, z których jeden to ArrayAdapter. Istnieje wiele innych adapterów, które są pochodnymi, BaseAdapterktóre pasują do różnych celów. W rezultacie jest mało prawdopodobne, aby istniała jakakolwiek różnica w wydajności między nimi; po prostu uzyskujesz dostęp do innego zestawu funkcji / metod z różnymi podklasami.

(2) Wydajność twojego ArrayAdapterzależy od wydajności tego, co robisz wewnątrz tej klasy, tj. Przetwarzania bitmap i innych danych.

(3) Prawdopodobnie mógłbyś wymyślić sposób pracy ListViewz innym rodzajem adaptera, jednak powodem tego ArrayAdapterjest to, że zwykle ma to sens, biorąc pod uwagę, że celem jest utworzenie interaktywnej listy. ArrayAdapteTrwa Array, zwykle ArrayListobiektów, które następnie przetwarza go do tworzenia informacji mocująca dla ListView. W tym sensie ustawienie ArrayList-> ArrayAdapter-> ListViewlogicznie ma sens.

Rarw
źródło
7

Jeszcze jedna różnica między BaseAdapter i ArrayAdapters polega na tym, że jeśli rozszerzasz adapter tablicy, musisz wywołać konstruktor superklasy w konstruktorze podklasy.

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

}

Ale nie ma super klasy dla BaseAdapter. Ponieważ BaseAdapter służy jako super klasa dla wszystkich innych adapterów

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

}
Jan
źródło
I nie ma potrzeby stosowania DataType określonego w BaseAdapter, tak jak w ArrayAdapter. Przykład: ArrayAdapter <String>
Jan
również nigdy nie powinieneś używać List<T> UserList;w klasie, która się przedłuża 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);

Tutaj nie możemy użyć BaseAdapter jak ArrayAdapter.

Amit Yadav
źródło
3

BaseAdapters są bardziej minimalne i można je dostosowywać. ArrayAdapters implementują najbardziej ogólne zastosowania ListAdapters, ale czasami są one niewystarczające.

Jednak prawie wszystko można osiągnąć za pomocą ArrayAdapters. Jeśli Twoje listy już działają przy prawidłowym użyciu ArrayAdapter, nie masz nic do zyskania z BaseAdapter.

Jednakże, jeśli przechowywania Context, Arrayslub Listsw implementacji ArrayAdapter, być może będziemy chcieli, aby przełączyć się BaseAdapter, jak ArrayAdapterjuż ich wdrożenia.

W każdym razie, jeśli to robisz, zawsze możesz usunąć te elementy i uciec się do użycia, getItem()aby uzyskać elementy tablicy, getCount()uzyskać rozmiar tablicy i zwiększyć getContext()liczbę wyświetleń.

Charlie-Blake
źródło