Quelle est la différence entre BaseAdapter et ArrayAdapter?

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.