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


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

Я добиваюсь того, что я хочу через ArrayAdapters.

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

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

6 96

6 ответов:

вот в чем разница:

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

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

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

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

BaseAdapter является абстрактным в то время как ArrayAdapter extends BaseAdapter (это конкретная реализация a BaseAdapter). Если вы расширяется для 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 являются более минимальными и настраиваемыми. ArrayAdapters реализовать наиболее общее использование ListAdapterS, но иногда их не хватает.

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

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

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