Je veux connaître la différence entre utiliser BaseAdapter
et ArrayAdapter
.
J'ai réalisé ce que je voulais grâce à ArrayAdapters
.
Cela affecte-t-il les performances de ListView
sur l'interface de l'adaptateur dans lequel il est implémenté?
Et, dernière question, puis-je obtenir quelque chose en utilisant ListView
en utilisant l'un de ces Adapters
, ou, dans certains cas, seul un adaptateur spécifique peut être utilisé?
Voici la différence:
BaseAdapter
est un adaptateur très générique qui vous permet de faire à peu près tout ce que vous voulez. Cependant, vous devez vous coder un peu plus pour le faire fonctionner.ArrayAdapter
est une implémentation plus complète qui fonctionne bien pour les données de tableaux ou ArrayList
s. De même, il y a un CursorAdapter
connexe que vous devriez utiliser si vos données se trouvent dans un Cursor
. Les deux prolongent BaseAdapter
.Si vos données font partie d'une collection spécialisée ou si vous ne voulez pas le comportement par défaut fourni par ArrayAdapter
, vous souhaiterez probablement étendre BaseAdapter
pour obtenir la flexibilité dont vous avez besoin.
Les performances de chacun dépendent de la manière dont vous les implémentez ou modifiez leur comportement. À la base, l'un ou l'autre peut être tout aussi efficace (surtout si l'on considère qu'un ArrayAdapter
est un BaseAdapter
).
Vous pouvez faire à peu près tout ce que vous voulez avec n'importe quel adaptateur, mais gardez à l'esprit que BaseAdapter
est abstrait, vous ne pouvez donc pas l'utiliser directement.
BaseAdapter
est abstrait tandis que ArrayAdapter
s'étend BaseAdapter
(c'est une implémentation concrète d'un BaseAdapter
). Si vous prolongez pour ArrayAdapter
, vous héritez de toutes les fonctionnalités de ArrayAdapter
et, remplacez son implémentation, vous pouvez modifier le comportement de ArrayAdapter
. Si vous étendez BaseAdapter
, vous devez implémenter toutes les méthodes abstraites déjà implémentées par ArrayAdapter.
En outre, cela affecte-t-il les performances du ListView?
non.
Et, dernière question, puis-je obtenir quelque chose avec ListView en utilisant l'un de ces adaptateurs, ou, dans certains cas, seul un adaptateur spécifique peut être utilisé?
Si la mise en œuvre dans le SDK répond à vos besoins, pourquoi la remplacer et réinventer la roue?
La principale différence entre eux est que BaseAdapter
ne peut pas être instancié alors que ArrayAdapter
peut
En réponse à vos 3 questions:
(1) BaseAdapter , selon le Android docs, est simplement une superclasse d'un certain nombre de types d'adaptateur, dont l'un est ArrayAdapter
. Un certain nombre d’autres adaptateurs dérivés de BaseAdapter
répondent à des objectifs différents. En conséquence, il n’ya aucune différence d’efficacité entre les deux; vous avez simplement accès à un ensemble différent de fonctions/méthodes avec les différentes sous-classes.
(2) L’efficacité de votre ArrayAdapter
dépend de l’efficacité de ce que vous faites dans cette classe, c’est-à-dire du traitement des images bitmap et autres données.
(3) Vous pourriez probablement trouver un moyen de travailler votre ListView
en utilisant un autre type d’adaptateur. Toutefois, la raison pour laquelle ArrayAdapter
fonctionne: c’est généralement logique car l’objectif est de créer un liste interactive. Le ArrayAdapte
prend un Array
, généralement un ArrayList
d'objets, qu'il traite ensuite pour créer les informations de sauvegarde du ListView
. En ce sens, la configuration de ArrayList
-> ArrayAdapter
-> ListView
a simplement un sens.
Une autre différence entre BaseAdapter et ArrayAdapters réside dans le fait que si vous étendez l’adaptateur de matrice, vous devez appeler le constructeur de la super classe dans le constructeur de la sous-classe.
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;
}
}
Mais il n'y a pas de super classe pour BaseAdapter. Comme BaseAdapter sert de super classe pour tous les autres adaptateurs
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);
Ici, nous ne pouvons pas utiliser BaseAdapter comme ArrayAdapter.
BaseAdapter
s sont plus minimes et personnalisables. ArrayAdapter
s implémente les utilisations les plus générales de ListAdapter
s, mais parfois elles ne suffisent pas.
Cependant, presque tout peut être réalisé en utilisant ArrayAdapter
s. Si vos listes fonctionnent déjà correctement avec ArrayAdapter, vous n’avez rien à gagner de BaseAdapter.
Toutefois, si vous stockez votre Context
, Arrays
ou Lists
dans votre implémentation ArrayAdapter, vous voudrez peut-être passer à BaseAdapter
, comme ArrayAdapter
les a déjà implémentés.
Quoi qu’il en soit, si vous faites cela, vous pouvez toujours supprimer ces éléments et recourir à getItem()
pour obtenir les éléments de tableau, à getCount()
pour obtenir la taille du tableau et à getContext()
pour gonfler vos vues.