Какая разница между 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
. В этом смысле установка ArrayList
→ ArrayAdapter
→ ListView
просто логически имеет смысл.
Ответ 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()
, чтобы раздуть ваши просмотров.