В чем разница между BaseAdapter и ArrayAdapter?
Я хочу знать разницу между использованием BaseAdapter
и ArrayAdapter
.
Я добиваюсь того, что я хочу через ArrayAdapters
.
влияет ли это на производительность ListView
на интерфейсе адаптера, в котором он реализован ?
и, последний вопрос, Могу ли я добиться чего-либо с помощью ListView
используя любой из этих Adapters
, или, в некоторых случаях адаптер может быть использован только?
6 ответов:
вот в чем разница:
BaseAdapter
- Это очень универсальный адаптер, который позволяет делать почти все, что вы хотите. Однако, вы должны сделать немного больше кодирования себя, чтобы заставить его работать.ArrayAdapter
является более полной реализацией, которая хорошо работает для данных в массивах илиArrayList
ы. Аналогично, существует связанная с этимCursorAdapter
что вы должны использовать, если ваши данные находятся вCursor
. Оба эти расширенияBaseAdapter
.если ваши данные в специализированной коллекции какой-то или если вы не хотите поведение по умолчанию, что
ArrayAdapter
обеспечивает, вы, вероятно, захотите расширитьBaseAdapter
чтобы получить необходимую гибкость.производительность каждого из них действительно зависит от того, как вы их реализуете или меняете свое поведение. По сути своей, любой из них может быть столь же эффективным (особенно учитывая, что
ArrayAdapter
и aBaseAdapter
).вы можете сделать почти все, что вы хотите с любым адаптером, но имейте в виду, что
BaseAdapter
абстрактен, поэтому вы не можете использовать его напрямую.
BaseAdapter
является абстрактным в то время какArrayAdapter
extendsBaseAdapter
(это конкретная реализация aBaseAdapter
). Если вы расширяется дляArrayAdapter
вы наследуете всеArrayAdapter
's функции и, переопределить его реализацию Вы можете изменитьArrayAdapter
beahviour. Если вы расширяетесьBaseAdapter
вы должны реализовать все абстрактные методы, которые ArrayAdapter уже реализует.кроме того, это влияет на производительность ListView
в ответ на ваши 3 вопроса:
(1) BaseAdapter, согласно документам Android, это всего лишь суперкласс из нескольких типов адаптеров, один из которых
ArrayAdapter
. Существует ряд других адаптеров, производных отBaseAdapter
, которые подходят для разных целей. В результате вряд ли существует какая-либо разница в эффективности между ними; вы просто получаете доступ к другому набору функций/методов с различными подклассами.(2) Эффективность вашего
ArrayAdapter
зависит от эффективности того, что вы делаете внутри этого класса, т. е. обработки растровых изображений и других данных.(3) Вы могли бы выяснить способ работать ваш
ListView
используя другой вид адаптера, однако, причинаArrayAdapter
работает потому, что это обычно имеет смысл, учитывая цель состоит в том, чтобы построить интерактивный список. ЭлементArrayAdapte
принимаетArray
обычноArrayList
объектов, которые он затем обрабатывает для создания резервной копии информация дляListView
. В этом смысле настройкаArrayList
-->ArrayAdapter
-->ListView
просто логически имеет смысл.
еще одно различие между 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; } }
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.
BaseAdapter
s являются более минимальными и настраиваемыми.ArrayAdapter
s реализовать наиболее общее использованиеListAdapter
S, но иногда их не хватает.однако, почти все может быть достигнуто с помощью
ArrayAdapter
s.Если ваши списки уже работают с помощью ArrayAdapter правильно, у вас нет ничего, чтобы получить от BaseAdapter.однако, если вы храните ваш
Context
,Arrays
илиLists
в вашей реализации ArrayAdapter, возможно, вы захотите переключиться наBaseAdapter
, аArrayAdapter
они уже реализованы.в любом случае, если вы делаете это, вы всегда можете удалить эти элементы, и прибегнуть к помощи
getItem()
чтобы получить элементы массива,getCount()
чтобы получить размер массива, иgetContext()
чтобы раздуть ваши взгляды.