Quelle est la différence entre BaseAdapter et ArrayAdapter?

100

Je veux connaître la différence entre utiliser BaseAdapteret ArrayAdapter.

J'ai réalisé ce que je voulais ArrayAdapters.

Cela affecte-t-il les performances de l' ListViewinterface de l'adaptateur dans laquelle il est implémenté?

Et, la dernière question est, puis-je réaliser quelque chose en ListViewutilisant l'un de ces éléments Adapters, ou, dans certains cas, seul un adaptateur spécifique peut être utilisé?

Chintan Soni
la source
2
developer.android.com/reference/android/widget/… . ArrayAdpter. developer.android.com/reference/android/widget/BaseAdapter.html . BaseAdapter. ArrayAdapter est une sous-classe concrète de BaseAdapter
Raghunandan
5
Simplement ArrayAdapter est déjà construit, il suffit de l'utiliser. mais le BaseAdapter est un adaptateur plus générique pour lequel nous devons fournir une implémentation. (méthodes getView (), getcount () etc dans Adapter)
Pragnani

Réponses:

111

Voici la différence:

  • BaseAdapterest un adaptateur très générique qui vous permet de faire à peu près tout ce que vous voulez. Cependant, vous devez coder un peu plus vous-même pour que cela fonctionne.
  • ArrayAdapterest une implémentation plus complète qui fonctionne bien pour les données dans des tableaux ou des ArrayLists. De même, il existe un lien CursorAdapterque vous devez utiliser si vos données sont dans un fichier Cursor. Les deux s'étendent BaseAdapter.

Si vos données se trouvent dans une collection spécialisée ou si vous ne voulez pas du comportement par défaut ArrayAdapterfourni, vous souhaiterez probablement les étendre BaseAdapterpour 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. À la base, l'un ou l'autre peut être tout aussi efficace (d'autant plus que an ArrayAdapter est a BaseAdapter).

Vous pouvez faire à peu près tout ce que vous voulez avec n'importe quel adaptateur, mais gardez à l'esprit que BaseAdapterc'est abstrait, vous ne pouvez donc pas l'utiliser directement.

Bryan Herbst
la source
2
Le comportement par défaut qui ArrayAdapterfournit (comme mentionné par @ tanis-7x) est qu'il ne peut y avoir qu'un seul TextViewdans l'élément de liste, en fait un comportement très limité. S'il y a plusieurs contrôles dans chaque élément de liste, vous devez utiliser BaseAdapteret pour le travail par vous-même. Bien sûr, vous pouvez toujours utiliser ArrayAdapter, car ArrayAdapterc'est un fichier BaseAdapter.
Felix
21

BaseAdapterest abstrait tandis que ArrayAdapters'étend BaseAdapter(c'est une implémentation concrète de a BaseAdapter). Si vous étendez pour ArrayAdaptervous héritez de toutes les ArrayAdapterfonctionnalités de et, remplacez son implémentation, vous pouvez modifier le ArrayAdaptercomportement. Si vous BaseAdapterétendez, vous devez implémenter toutes les méthodes abstraites, qu'ArrayAdapter implémente déjà.

En outre, cela affecte-t-il les performances de ListView

non.

Et, la dernière question est, puis-je réaliser quoi que ce soit 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 devez-vous la remplacer et réinventer la roue?

La principale différence entre eux est qu'ils BaseAdapter ne peuvent pas être instanciés alors qu'ils ArrayAdapterpeuvent

Ceinture noire
la source
9

En réponse à vos 3 questions:

(1) BaseAdapter , selon la documentation Android, n'est qu'une superclasse d'un certain nombre de types d'adaptateurs, dont l'un est ArrayAdapter. Il existe un certain nombre d'autres adaptateurs dérivés BaseAdapterqui répondent à des objectifs différents. En conséquence, il est peu probable qu'il y ait une différence d'efficacité entre les deux; vous avez juste accès à un ensemble différent de fonctions / méthodes avec les différentes sous-classes.

(2) L'efficacité de votre ArrayAdapterdé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 en ListViewutilisant un autre type d'adaptateur, cependant, la raison ArrayAdapterfonctionne parce que cela a généralement du sens étant donné que l'objectif est de créer une liste interactive. Le ArrayAdapteprend un Array, généralement un ArrayListobjet, qu'il traite ensuite pour créer les informations de sauvegarde pour le ListView. En ce sens, la configuration de ArrayList-> ArrayAdapter-> a ListViewtout simplement un sens.

Rarw
la source
7

Une autre différence entre BaseAdapter et ArrayAdapters est que si vous étendez l'adaptateur de tableau, vous devez appeler le constructeur de super-classe dans le constructeur de 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;
   }

}
John
la source
Et pas besoin de DataType spécifié dans BaseAdapter comme dans ArrayAdapter. Exemple: ArrayAdapter <String>
John
aussi vous ne devriez jamais utiliser List<T> UserList;dans la classe qui s'étend ArrayAdapter<T>
Selvin
6
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.

Amit Yadav
la source
3

BaseAdapters sont plus minimes et personnalisables. ArrayAdapters implémentent les utilisations les plus générales deListAdapter s, mais parfois elles ne suffisent pas.

Cependant, presque tout peut être réalisé en utilisant ArrayAdapter art. Si vos listes fonctionnent déjà en utilisant correctement ArrayAdapter, vous n'avez rien à gagner de BaseAdapter.

Cependant, si vous stockez votre Context, Arraysou Listsdans votre implémentation ArrayAdapter, vous voudrez peut-être passer à BaseAdapter, commeArrayAdapter déjà implémenté.

Quoi qu'il en soit, si vous faites cela, vous pouvez toujours supprimer ces éléments et recourir à l'utilisation getItem()pour obtenir les éléments du tableau, getCount()pour obtenir la taille du tableau et getContext()pour gonfler vos vues.

Charlie-Blake
la source