В чем разница между BaseAdapter и ArrayAdapter?

100

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

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

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

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

Чинтан Сони
источник
2
developer.android.com/reference/android/widget/… . ArrayAdpter. developer.android.com/reference/android/widget/BaseAdapter.html . BaseAdapter. ArrayAdapter является конкретным суб класс BaseAdapter
Raghunandan
5
Просто ArrayAdapter уже построен, нам просто нужно его использовать. но BaseAdapter - это более общий адаптер, для которого нам необходимо обеспечить реализацию. (методы getView (), getcount () и т. д. в адаптере)
Pragnani

Ответы:

111

Вот разница:

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

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

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

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

Брайан Хербст
источник
2
Поведение по умолчанию, которое ArrayAdapterобеспечивает (как упомянуто @ tanis-7x), заключается в том, что TextViewвнутри элемента списка может быть только 1 , что на самом деле очень ограниченное поведение. Если в каждом элементе списка есть несколько элементов управления, вы должны использовать BaseAdapterи для задания самостоятельно. Конечно, вы все еще можете использовать ArrayAdapter, потому что ArrayAdapterэто BaseAdapter.
Феликс
21

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

Кроме того, влияет ли это на производительность ListView

нет.

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

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

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

Черный пояс
источник
9

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

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

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

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

Rarw
источник
7

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

}
Джон
источник
И нет необходимости в DataType, указанном в BaseAdapter, как в ArrayAdapter. Пример: ArrayAdapter <String>
Джон
также вы никогда не должны использовать List<T> UserList;в классе, который расширяется ArrayAdapter<T>
Селвин
6
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.

Амит Ядав
источник
3

BaseAdapters более минималистичны и настраиваемы. ArrayAdapters реализуют наиболее общие способы использованияListAdapter s, но иногда этого недостаточно.

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

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

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

Чарли-Блейк
источник