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 d’adaptateur dans laquelle il est implémenté?
Et, la dernière question est, puis-je faire quelque chose avec ListView
utilisant l’un de ces Adapters
, ou il y a certains cas où 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 faire un peu plus de codage pour que cela fonctionne. ArrayAdapter
est une implémentation plus complète qui fonctionne bien pour les données des tableaux ou des ArrayList
. De même, il existe un CursorAdapter
que vous devez utiliser si vos données se CursorAdapter
dans un Cursor
. Tous deux étendent BaseAdapter
. Si vos données se ArrayAdapter
dans une collection spécialisée quelconque ou si vous ne voulez pas le comportement par défaut ArrayAdapter
par ArrayAdapter
, vous souhaiterez probablement étendre BaseAdapter
pour obtenir la flexibilité dont vous avez besoin.
La performance de chacun dépend vraiment de la façon dont vous les implémentez ou modifiez leur comportement. Au fond, 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 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 alors ArrayAdapter
étend BaseAdapter
(c’est une implémentation concrète d’un BaseAdapter
). Si vous ArrayAdapter
pour ArrayAdapter
vous héritez de toutes les fonctionnalités de ArrayAdapter
et remplacez son implémentation, vous pouvez modifier le ArrayAdapter
ArrayAdapter. Si vous BaseAdapter
vous devez implémenter toutes les méthodes Abstract implémentées par ArrayAdapter.
En outre, cela affecte-t-il les performances de ListView?
non.
Et, la dernière question est, puis-je faire quelque chose avec ListView en utilisant l’un de ces adaptateurs, ou il y a certains cas où seul un adaptateur spécifique peut être utilisé?
Si la mise en œuvre dans le SDK répond à vos besoins, pourquoi devez-vous la remplacer et réinventer la roue?
La principale différence entre eux est que BaseAdapter
ne peut pas être instatiate alors que ArrayAdapter
peut
En réponse à vos 3 questions:
(1) BaseAdapter , selon les documents Android, est juste une super-classe de plusieurs types d’adaptateurs, dont ArrayAdapter
. Il existe un certain nombre d’autres adaptateurs dérivés de BaseAdapter
qui répondent à des besoins différents. En conséquence, il n’y a pas de différence d’efficacité entre les deux; vous avez juste access à 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 le traitement des bitmaps et d’autres données.
(3) Vous pourriez probablement trouver un moyen de travailler votre ListView
utilisant un autre type d’adaptateur, mais la raison ArrayAdapter
laquelle ArrayAdapter
fonctionne est que cela a du sens, étant donné que l’objective est de créer une liste interactive. ArrayAdapte
prend un Array
, généralement une liste d’objects ArrayList
, qu’il traite ensuite pour créer les informations de sauvegarde pour ListView
. En ce sens, la configuration de ArrayList
-> ArrayAdapter
-> ListView
est logique.
Une autre différence entre BaseAdapter et ArrayAdapters est que, si vous étendez un adaptateur de tableau, vous devez appeler le constructeur de la super classe dans le constructeur de la sous-classe.
UserListAdapter extends ArrayAdapter{ List UserList; Context context; public UserListAdapter(Context context, int resource,List 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 UserList; Context context; public UserListAdapter(Context context, int resource,List listUsers) { /* No super class constructor */ UserList = listUsers; this.context = context; } }
private static final Ssortingng[] COUNTRIES = new Ssortingng[]{ "Afghanistan", "Angola", "Australia", "Bangladesh", "Belgium", "Bhutan", "Brazil", "Canada", "China", "Denmark" }; ArrayAdapter 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
sont plus minimalistes et personnalisables. ArrayAdapter
implémente les utilisations les plus générales de ListAdapter
, mais elles ne sont parfois pas suffisantes.
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 souhaiterez peut-être basculer vers BaseAdapter
, car ArrayAdapter
déjà implémentées.
Quoi qu’il en soit, si vous faites cela, vous pouvez toujours supprimer ces éléments et utiliser getItem()
pour obtenir les éléments Array, getCount()
pour obtenir la taille du tableau et getContext()
pour gonfler vos vues.