Яка різниця між BaseAdapter і ArrayAdapter?


100

Я хочу знати різницю між використанням BaseAdapterта ArrayAdapter.

Я досягав того, що хочу ArrayAdapters.

Чи впливає це на продуктивність ListViewінтерфейсу адаптера, в якому він реалізований?

І, останнє питання, чи можу я домогтися чогось із ListViewвикористання будь-якого з них Adapters, чи є певні випадки, коли можна використовувати лише конкретний адаптер?


2
developer.android.com/reference/android/widget/… . ArrayAdpter. developer.android.com/reference/android/widget/BaseAdapter.html . BaseAdapter. ArrayAdapter - це конкретний підклас BaseAdapter
Рагунандан

5
Просто ArrayAdapter вже побудований, нам просто потрібно його використовувати. але BaseAdapter - це більш загальний адаптер, для якого нам потрібно забезпечити реалізацію. (getView (), getcount () і т.д. методи в Adapter)
Pragnani

Відповіді:


111

Ось різниця:

  • BaseAdapterце дуже загальний адаптер, який дозволяє робити майже все, що завгодно. Однак вам потрібно зробити трохи більше кодування, щоб налагодити його роботу.
  • ArrayAdapter- це більш повна реалізація, яка добре працює для даних у масивах або ArrayLists. Так само є пов'язане, CursorAdapterяке ви повинні використовувати, якщо ваші дані є в Cursor. Обидва ці дії поширюються BaseAdapter.

Якщо ваші дані знаходяться у спеціалізованій колекції, або якщо ви не хочете, щоб це було поведінкою за замовчуванням ArrayAdapter, ви, ймовірно, захочете розширити, BaseAdapterщоб отримати необхідну гнучкість.

Продуктивність кожного насправді залежить від того, як ти їх реалізуєш чи зміниш їх поведінку. За своєю суттю, або один може бути настільки ж ефективним (особливо з огляду на , що ArrayAdapter цеBaseAdapter ).

З будь-яким адаптером ви можете робити все, що завгодно, але пам’ятайте, що BaseAdapterце абстрактно, тому ви не можете використовувати його безпосередньо.


2
Поведінка за замовчуванням, яка ArrayAdapterпередбачає (як згадує @ tanis-7x), полягає в тому, що TextViewвсередині елемента списку може бути лише 1 , насправді дуже обмежена поведінка. Якщо в кожному елементі списку є кілька елементів керування, ви повинні користуватися BaseAdapterі виконувати завдання самостійно. Звичайно, ви все одно можете використовувати ArrayAdapter, тому що ArrayAdapterце BaseAdapter.
Фелікс

21

BaseAdapterє абстрактним, а ArrayAdapterрозширюється BaseAdapter(це конкретна реалізація а BaseAdapter). Якщо ви розширюєте, ArrayAdapterви успадковуєте всі функції ArrayAdapterросійської мови і, заміняючи її реалізацію, ви можете змінити ArrayAdapterповедінку. Якщо ви розширюєте, BaseAdapterви повинні реалізувати всі абстрактні методи, які ArrayAdapter вже реалізує.

Також це впливає на ефективність ListView

ні, це не є.

І, останнє питання, чи можу я досягти чогось із ListView, використовуючи будь-який з цих адаптерів, або, є певні випадки, коли можна використовувати лише конкретний адаптер?

Якщо реалізація в SDK відповідає вашим потребам, чому вам потрібно її перекрити і заново винайти колесо?

Основна відмінність між ними полягає в тому, що BaseAdapter не можна інстанціювати, поки ArrayAdapterможна


9

У відповідь на ваші 3 запитання:

(1) BaseAdapter , згідно з документами Android, - це лише суперклас з декількох типів адаптерів, один з яких є ArrayAdapter. Існує ряд інших адаптерів, які походять від BaseAdapterрізних цілей. Як результат, це не викликає різниці між ефективністю між ними; ви просто отримуєте доступ до іншого набору функцій / методів з різними підкласами.

(2) Ефективність роботи ArrayAdapterзалежить від ефективності того, що ви робите всередині цього класу, тобто обробки растрових зображень та інших даних.

(3) Ви, мабуть, могли б розібратися у способі роботи з ListViewвикористанням адаптера іншого типу, однак, причина ArrayAdapterпрацює в тому, що це зазвичай має сенс, враховуючи, що метою є створення інтерактивного списку. ArrayAdapteПриймає Array, як правило, ArrayListз об'єктів, які вона обробляє інформацію для створення підкладки для ListView. У цьому сенсі налаштування ArrayList-> ArrayAdapter-> ListViewпросто логічно має сенс.


7

Ще одна відмінність між BaseAdapter і ArrayAdapters полягає в тому, що якщо ви розширите адаптер масиву, вам доведеться викликати конструктор суперкласу в конструкторі підкласу.

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

}

Але не існує суперкласу для BaseAdapter. Оскільки BaseAdapter служить суперкласом для всіх інших адаптерів

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

}

І немає необхідності в DataType, зазначеному в BaseAdapter, як у ArrayAdapter. Приклад: ArrayAdapter <String>
Джон

також ви ніколи не повинні використовувати List<T> UserList;в класі, який продовжує ArrayAdapter<T>
Селвін

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

Тут ми не можемо використовувати BaseAdapter, як ArrayAdapter.


3

BaseAdapters є більш мінімальними та настроюваними. ArrayAdapters реалізувати найбільш загальні використання ListAdapters, але іноді їх недостатньо.

Однак майже все можна досягти за допомогою використання ArrayAdapters. Якщо ваші списки вже працюють при правильному використанні ArrayAdapter, у вас немає чого отримати від BaseAdapter.

Тим НЕ менше, якщо ви зберігаєте ваші Context, Arraysабо Listsу вашій реалізації ArrayAdapter, може бути , ви хочете перейти BaseAdapter, а ArrayAdapterвже їх реалізації.

У будь-якому випадку, якщо ви робите це, ви завжди можете видалити ці елементи та вдатися до використання getItem()елементів масиву, getCount()отримання розміру масиву та getContext()збільшення ваших поглядів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.