Какая разница между BaseAdapter и ArrayAdapter?

Я хочу знать разницу между использованием BaseAdapter и ArrayAdapter.

Я добился того, чего хочу через ArrayAdapters.

Это влияет на производительность ListView на интерфейсе адаптера, в котором он реализован?

И последний вопрос: могу ли я что-нибудь сделать с помощью ListView с помощью любого из этих Adapters, или есть определенные случаи, когда конкретный адаптер можно использовать только?

Ответ 1

Вот разница:

  • BaseAdapter - очень общий адаптер, который позволяет вам делать все, что угодно. Тем не менее, вы должны сделать немного больше кодирования, чтобы заставить его работать.
  • ArrayAdapter - это более полная реализация, которая хорошо работает для данных в массивах или ArrayList s. Аналогичным образом существует связанный CursorAdapter, который вы должны использовать, если ваши данные находятся в Cursor. Оба они расширяются BaseAdapter.

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

Производительность каждого действительно зависит от того, как вы их реализуете или изменяете свое поведение. По своей сути любой из них может быть столь же эффективным (особенно учитывая, что ArrayAdapter является BaseAdapter).

Вы можете делать все, что угодно, с любым адаптером, но имейте в виду, что BaseAdapter является абстрактным, поэтому вы не можете использовать его напрямую.

Ответ 2

BaseAdapter является абстрактным, а ArrayAdapter расширяет BaseAdapter (это конкретная реализация BaseAdapter). Если вы расширяете ArrayAdapter вы наследуете все функции ArrayAdapter и, переопределив его реализацию, вы можете изменить поведение ArrayAdapter. Если вы расширяете BaseAdapter вы должны реализовать все методы Abstract, которые ArrayAdapter уже реализует.

Также влияет ли это на производительность ListView

нет.

И последний вопрос: могу ли я добиться чего-либо, используя ListView, используя любой из этих адаптеров, или в определенных случаях можно использовать только конкретный адаптер?

Если реализация в SDK отвечает вашим потребностям, зачем вам ее переопределять и заново изобретать колесо?

Основное различие между ними заключается в том, что BaseAdapter не может быть ArrayAdapter а ArrayAdapter может

Ответ 3

В ответ на ваши 3 вопроса:

(1) BaseAdapter, согласно документации Android, является просто суперклассом нескольких типов адаптеров, одним из которых является ArrayAdapter. Существует ряд других адаптеров, основанных на BaseAdapter которые подходят для разных целей. В результате, между ними нет никакой разницы в эффективности; вы просто получаете доступ к другому набору функций/методов с различными подклассами.

(2) Эффективность вашего ArrayAdapter зависит от эффективности того, что вы делаете внутри этого класса, то есть обработки растровых изображений и других данных.

(3) Возможно, вы могли бы найти способ работы со своим ListView с использованием адаптера другого типа, однако причина, по которой ArrayAdapter работает, заключается в том, что он обычно имеет смысл, учитывая, что целью является создание интерактивного списка. ArrayAdapte принимает Array, обычно ArrayList объектов, который затем обрабатывает для создания вспомогательной информации для ListView. В этом смысле установка ArrayListArrayAdapterListView просто логически имеет смысл.

Ответ 4

Еще одно отличие между 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;
   }

}

Ответ 5

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.

Ответ 6

BaseAdapter являются более минимальными и настраиваемыми. ArrayAdapter реализовать наиболее общие применения ListAdapter s, но иногда их недостаточно.

Однако почти все может быть достигнуто с помощью ArrayAdapter s. Если ваши списки уже работают с использованием ArrayAdapter правильно, вам нечего выиграть от BaseAdapter.

Однако, если вы сохраняете свои Context, Arrays или Lists в своей реализации ArrayAdapter, возможно, вам захочется переключиться на BaseAdapter, поскольку ArrayAdapter уже их реализовала.

В любом случае, если вы это делаете, вы всегда можете удалить эти элементы и прибегать к использованию getItem() для получения элементов массива, getCount(), чтобы получить размер массива, и getContext(), чтобы раздуть ваши просмотров.