В чем разница между BaseAdapter и ArrayAdapter?
Я хочу знать разницу между использованием BaseAdapter и ArrayAdapter.
Я добиваюсь того, что я хочу через ArrayAdapters.
влияет ли это на производительность ListView на интерфейсе адаптера, в котором он реализован ?
и, последний вопрос, Могу ли я добиться чего-либо с помощью ListView используя любой из этих Adapters, или, в некоторых случаях адаптер может быть использован только?
6 ответов:
вот в чем разница:
BaseAdapter- Это очень универсальный адаптер, который позволяет делать почти все, что вы хотите. Однако, вы должны сделать немного больше кодирования себя, чтобы заставить его работать.ArrayAdapterявляется более полной реализацией, которая хорошо работает для данных в массивах илиArrayListы. Аналогично, существует связанная с этимCursorAdapterчто вы должны использовать, если ваши данные находятся вCursor. Оба эти расширенияBaseAdapter.если ваши данные в специализированной коллекции какой-то или если вы не хотите поведение по умолчанию, что
ArrayAdapterобеспечивает, вы, вероятно, захотите расширитьBaseAdapterчтобы получить необходимую гибкость.производительность каждого из них действительно зависит от того, как вы их реализуете или меняете свое поведение. По сути своей, любой из них может быть столь же эффективным (особенно учитывая, что
ArrayAdapterи aBaseAdapter).вы можете сделать почти все, что вы хотите с любым адаптером, но имейте в виду, что
BaseAdapterабстрактен, поэтому вы не можете использовать его напрямую.
BaseAdapterявляется абстрактным в то время какArrayAdapterextendsBaseAdapter(это конкретная реализация aBaseAdapter). Если вы расширяется дляArrayAdapterвы наследуете всеArrayAdapter's функции и, переопределить его реализацию Вы можете изменитьArrayAdapterbeahviour. Если вы расширяетесь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.
BaseAdapters являются более минимальными и настраиваемыми.ArrayAdapters реализовать наиболее общее использованиеListAdapterS, но иногда их не хватает.однако, почти все может быть достигнуто с помощью
ArrayAdapters.Если ваши списки уже работают с помощью ArrayAdapter правильно, у вас нет ничего, чтобы получить от BaseAdapter.однако, если вы храните ваш
Context,ArraysилиListsв вашей реализации ArrayAdapter, возможно, вы захотите переключиться наBaseAdapter, аArrayAdapterони уже реализованы.в любом случае, если вы делаете это, вы всегда можете удалить эти элементы, и прибегнуть к помощи
getItem()чтобы получить элементы массива,getCount()чтобы получить размер массива, иgetContext()чтобы раздуть ваши взгляды.