Я хочу знать разницу между использованием BaseAdapter
иArrayAdapter
.
Я добился того, чего хочу ArrayAdapters
.
Влияет ли это на производительность ListView
интерфейса адаптера, в котором он реализован?
И последний вопрос: могу ли я чего-нибудь добиться с ListView
помощью любого из них Adapters
, или есть определенные случаи, когда можно использовать только определенный адаптер?
android
performance
listview
android-arrayadapter
baseadapter
Чинтан Сони
источник
источник
Ответы:
Вот разница:
BaseAdapter
- это универсальный адаптер, который позволяет вам делать практически все, что вы хотите. Однако вам нужно написать немного больше кода, чтобы он заработал.ArrayAdapter
- это более полная реализация, которая хорошо работает для данных в массивах или массивахArrayList
. Точно так же есть связанный,CursorAdapter
который вы должны использовать, если ваши данные находятся вCursor
. Оба они расширяютсяBaseAdapter
.Если ваши данные находятся в какой-либо специализированной коллекции или если вам не нужно поведение по умолчанию, которое
ArrayAdapter
обеспечивает, вы, вероятно, захотите расширить,BaseAdapter
чтобы получить необходимую гибкость.Эффективность каждого из них действительно зависит от того, как вы их реализуете или изменяете их поведение. По сути, любой из них может быть столь же эффективным (особенно с учетом того, что an
ArrayAdapter
есть aBaseAdapter
).Вы можете делать практически все, что захотите, с любым адаптером, но имейте в виду, что
BaseAdapter
это абстрактно, поэтому вы не можете использовать его напрямую.источник
ArrayAdapter
обеспечивает (как упомянуто @ tanis-7x), заключается в том, чтоTextView
внутри элемента списка может быть только 1 , что на самом деле очень ограниченное поведение. Если в каждом элементе списка есть несколько элементов управления, вы должны использоватьBaseAdapter
и для задания самостоятельно. Конечно, вы все еще можете использоватьArrayAdapter
, потому чтоArrayAdapter
этоBaseAdapter
.BaseAdapter
является абстрактным, в то время какArrayAdapter
extendsBaseAdapter
(это конкретная реализация aBaseAdapter
). Если вы расширяете,ArrayAdapter
вы наследуете всеArrayAdapter
функции и, переопределив его реализацию, вы можете изменитьArrayAdapter
поведение. Если вы расширяете,BaseAdapter
вы должны реализовать все абстрактные методы, которые уже реализует ArrayAdapter.нет.
Если реализация в SDK отвечает вашим потребностям, почему вам нужно переопределить ее и заново изобрести колесо?
Основное различие между ними заключается в том , что
BaseAdapter
не может быть Instantiate , аArrayAdapter
может ,источник
В ответ на ваши 3 вопроса:
(1) BaseAdapter , согласно документации Android, является просто суперклассом нескольких типов адаптеров, одним из которых является
ArrayAdapter
. Существует ряд других адаптеров, разработанных дляBaseAdapter
различных целей. В результате маловероятно, что между ними есть разница в эффективности; вы просто получаете доступ к другому набору функций / методов с различными подклассами.(2) Эффективность вашего
ArrayAdapter
зависит от эффективности того, что вы делаете внутри этого класса, т. Е. Обработки растровых изображений и других данных.(3) Вероятно, вы могли бы найти способ работы,
ListView
используя другой тип адаптера, однако причина вArrayAdapter
том, что это обычно имеет смысл, учитывая, что цель состоит в создании интерактивного списка.ArrayAdapte
ПринимаетArray
, как правило,ArrayList
из объектов, которые она обрабатывает информацию для создания подложки дляListView
. В этом смысле установкаArrayList
->ArrayAdapter
->ListView
логически имеет смысл.источник
Еще одно различие между BaseAdapter и ArrayAdapters заключается в том, что если вы расширяете адаптер массива, вам нужно вызывать конструктор суперкласса в конструкторе подкласса.
Но для BaseAdapter нет суперкласса. Поскольку BaseAdapter служит суперклассом для всех остальных адаптеров
источник
List<T> UserList;
в классе, который расширяетсяArrayAdapter<T>
Здесь мы не можем использовать BaseAdapter, как ArrayAdapter.
источник
BaseAdapter
s более минималистичны и настраиваемы.ArrayAdapter
s реализуют наиболее общие способы использованияListAdapter
s, но иногда этого недостаточно.Однако почти всего можно добиться с помощью
ArrayAdapter
s. Если ваши списки уже работают с правильным использованием ArrayAdapter, вам нечего получить от BaseAdapter.Тем не менее, если вы храните
Context
,Arrays
илиLists
в вашей реализации ArrayAdapter, может быть , вы хотите переключитьсяBaseAdapter
, аArrayAdapter
уже их реализации.В любом случае, если вы это делаете, вы всегда можете удалить эти элементы и прибегнуть к использованию,
getItem()
чтобы получить элементы массива,getCount()
получить размер массива иgetContext()
раздуть свои представления.источник