web-dev-qa-db-fra.com

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 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é?

99
Chintan Soni

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 ArrayLists. 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 ArrayAdapterest 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.

109
Tanis.7x

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

20
Blackbelt

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.

9
Rarw

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;
   }

}
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);

Ici, nous ne pouvons pas utiliser BaseAdapter comme ArrayAdapter.

5
Amit Yadav

BaseAdapters sont plus minimes et personnalisables. ArrayAdapters implémente les utilisations les plus générales de ListAdapters, mais parfois elles ne suffisent pas.

Cependant, presque tout peut être réalisé en utilisant ArrayAdapters. 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.

3
Charlie-Blake