Chcę poznać różnicę między używaniem BaseAdapter
a ArrayAdapter
.
Osiągałem to, przez co chcę ArrayAdapters
.
Czy wpływa na wydajność ListView
interfejsu adaptera, w którym jest zaimplementowany?
I ostatnie pytanie brzmi: czy mogę coś zrobić z ListView
użyciem któregokolwiek z nich Adapters
, czy są pewne przypadki, w których można użyć tylko określonego adaptera?
android
performance
listview
android-arrayadapter
baseadapter
Chintan Soni
źródło
źródło
Odpowiedzi:
Oto różnica:
BaseAdapter
to bardzo ogólny adapter, który pozwala ci robić prawie wszystko, co chcesz. Jednak musisz wykonać trochę więcej kodowania, aby działało.ArrayAdapter
jest bardziej kompletną implementacją, która działa dobrze w przypadku danych w tablicach lubArrayList
s. Podobnie istnieje powiązanieCursorAdapter
, z którego powinieneś skorzystać, jeśli Twoje dane znajdują się w plikuCursor
. 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
ArrayAdapter
zapewnia, prawdopodobnie będziesz chciał rozszerzyć,BaseAdapter
aby 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 aBaseAdapter
).Możesz zrobić prawie wszystko, co chcesz, z dowolnym adapterem, ale pamiętaj, że
BaseAdapter
jest to abstrakcyjne, więc nie możesz go używać bezpośrednio.źródło
ArrayAdapter
zapewnia (jak wspomniano w @ tanis-7x) jest to, żeTextView
wewną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, musiszBaseAdapter
samodzielnie użyć i do zadania. Oczywiście możesz nadal używaćArrayAdapter
, ponieważArrayAdapter
jest to plikBaseAdapter
.BaseAdapter
jest abstrakcyjna, gdy sięArrayAdapter
rozciągaBaseAdapter
(jest to konkretna implementacja aBaseAdapter
). Jeśli rozszerzyszArrayAdapter
, dziedziczysz wszystkieArrayAdapter
funkcje i nadpisujesz jego implementację, możesz zmodyfikowaćArrayAdapter
zachowanie. Jeśli rozszerzyszBaseAdapter
, musisz zaimplementować wszystkie metody Abstract, które ArrayAdapter już implementuje.nie.
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 gdyArrayAdapter
możnaźródło
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,BaseAdapter
któ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
ArrayAdapter
zależ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
ListView
z innym rodzajem adaptera, jednak powodem tegoArrayAdapter
jest to, że zwykle ma to sens, biorąc pod uwagę, że celem jest utworzenie interaktywnej listy.ArrayAdapte
TrwaArray
, zwykleArrayList
obiektów, które następnie przetwarza go do tworzenia informacji mocująca dlaListView
. W tym sensie ustawienieArrayList
->ArrayAdapter
->ListView
logicznie ma sens.źródło
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.
Ale nie ma super klasy dla BaseAdapter. Ponieważ BaseAdapter służy jako super klasa dla wszystkich innych adapterów
źródło
List<T> UserList;
w klasie, która się przedłużaArrayAdapter<T>
Tutaj nie możemy użyć BaseAdapter jak ArrayAdapter.
źródło
BaseAdapter
s są bardziej minimalne i można je dostosowywać.ArrayAdapter
s implementują najbardziej ogólne zastosowaniaListAdapter
s, ale czasami są one niewystarczające.Jednak prawie wszystko można osiągnąć za pomocą
ArrayAdapter
s. 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
,Arrays
lubLists
w implementacji ArrayAdapter, być może będziemy chcieli, aby przełączyć sięBaseAdapter
, jakArrayAdapter
już 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ń.źródło