it-swarm.com.ru

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

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

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

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

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

98
Chintan Soni

Вот разница:

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

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

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

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

108
Tanis.7x

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

Также влияет ли это на производительность ListView

нет.

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

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

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

19
Blackbelt

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

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

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

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

9
Rarw

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

}
6
John
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.

5
Amit Yadav

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

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

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

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

3
Charlie-Blake