¿Cuál es la diferencia entre BaseAdapter y ArrayAdapter?

100

Quiero saber la diferencia entre usar BaseAdaptery ArrayAdapter.

He logrado lo que quiero ArrayAdapters.

¿Afecta el rendimiento de la ListViewinterfaz del adaptador en la que se implementa?

Y, la última pregunta es, ¿puedo lograr algo con el ListViewuso de cualquiera de estos Adapters, o hay ciertos casos en los que solo se puede usar un adaptador específico?

Chintan Soni
fuente
2
developer.android.com/reference/android/widget/… . ArrayAdpter. developer.android.com/reference/android/widget/BaseAdapter.html . BaseAdapter. ArrayAdapter es una subclase concreta de BaseAdapter
Raghunandan
5
Simply ArrayAdapter ya está construido, solo necesitamos usarlo. pero el BaseAdapter es un adaptador más genérico para el que necesitamos proporcionar implementación. (métodos getView (), getcount (), etc.en Adapter)
Pragnani

Respuestas:

111

Esta es la diferencia:

  • BaseAdapteres un adaptador muy genérico que te permite hacer prácticamente lo que quieras. Sin embargo, tienes que codificarte un poco más para que funcione.
  • ArrayAdapteres una implementación más completa que funciona bien para datos en arreglos o ArrayLists. De manera similar, hay un relacionado CursorAdapterque debe usar si sus datos están en formato Cursor. Ambos se extienden BaseAdapter.

Si sus datos se encuentran en una colección especializada de algún tipo o si no desea el comportamiento predeterminado que ArrayAdapterproporciona, es probable que desee ampliar BaseAdapterpara obtener la flexibilidad que necesita.

El desempeño de cada uno realmente depende de cómo los implemente o cambie su comportamiento. En esencia, cualquiera de los dos puede ser igualmente efectivo (especialmente considerando que an ArrayAdapter es a BaseAdapter).

Puede hacer prácticamente lo que quiera con cualquier adaptador, pero tenga en cuenta que BaseAdapteres abstracto, por lo que no puede usarlo directamente.

Bryan Herbst
fuente
2
El comportamiento predeterminado que ArrayAdapterproporciona (como lo menciona @ tanis-7x) es que solo puede haber 1 TextViewdentro del elemento de la lista, en realidad un comportamiento muy limitado. Si hay varios controles en cada elemento de la lista, debe utilizar BaseAdaptery realizar el trabajo usted mismo. Por supuesto que aún puedes usarlo ArrayAdapter, porque ArrayAdapteres un BaseAdapter.
Felix
21

BaseAdapteres abstracto mientras se ArrayAdapterextiende BaseAdapter(es una implementación concreta de a BaseAdapter). Si extiende porque ArrayAdapterestá heredando todas las ArrayAdaptercaracterísticas de 'y, anula su implementación, puede modificar el ArrayAdaptercomportamiento. Si extiende BaseAdapter, debe implementar todos los métodos Abstract, que ArrayAdapter ya implementa.

Además, ¿afecta el rendimiento de ListView?

No, no lo hace.

Y, la última pregunta es, ¿puedo lograr algo con ListView usando cualquiera de estos adaptadores, o hay ciertos casos en los que solo se puede usar un adaptador específico?

Si la implementación en el SDK satisface sus necesidades, ¿por qué necesita anularla y reinventar la rueda?

La principal diferencia entre ellos es que BaseAdapter no se puede crear una instancia mientras que se ArrayAdapterpuede

Cinta negra
fuente
9

En respuesta a sus 3 preguntas:

(1) BaseAdapter , según los documentos de Android, es solo una superclase de varios tipos de adaptadores, uno de los cuales es ArrayAdapter. Hay una serie de otros adaptadores que se derivan de BaseAdapterque se adaptan a diferentes propósitos. Como resultado, es improbable que exista alguna diferencia de eficiencia entre los dos; simplemente obtiene acceso a un conjunto diferente de funciones / métodos con las diversas subclases.

(2) La eficiencia de su ArrayAdapter depende de la eficiencia de lo que está haciendo dentro de esa clase, es decir, el procesamiento de mapas de bits y otros datos.

(3) Probablemente pueda encontrar una manera de trabajar ListViewcon un tipo diferente de adaptador, sin embargo, la razón por la que ArrayAdapterfunciona es porque generalmente tiene sentido dado que el objetivo es crear una lista interactiva. El ArrayAdaptetoma un Array, generalmente un ArrayListde objetos, que luego procesa para crear la información de respaldo para el ListView. En ese sentido, la configuración de ArrayList-> ArrayAdapter-> ListViewlógicamente tiene sentido.

Rarw
fuente
7

Una diferencia más entre BaseAdapter y ArrayAdapters es que, si extiende el adaptador de matriz, debe llamar al constructor de superclase en el constructor de subclase.

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

}

Pero no hay una superclase para BaseAdapter. Como BaseAdapter sirve como superclase para todos los demás adaptadores

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

}
Juan
fuente
Y no es necesario en DataType Specified en BaseAdapter como en ArrayAdapter. Ejemplo: ArrayAdapter <String>
John
también nunca debe usar List<T> UserList;en la clase que se extiende 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);

Aquí no podemos usar BaseAdapter como ArrayAdapter.

Amit Yadav
fuente
3

BaseAdapters son más minimalistas y personalizables. ArrayAdapters implementar los usos más generales deListAdapter s, pero a veces no son suficientes.

Sin embargo, casi todo se puede lograr mediante el uso de ArrayAdapter s. Si sus listas ya funcionan utilizando ArrayAdapter correctamente, no tiene nada que ganar con BaseAdapter.

Sin embargo, si está almacenando su implementación de ArrayAdapter Context, Arrayso Listsen su implementación, tal vez desee cambiar a BaseAdapter, comoArrayAdapter ya ya los tiene implementados.

De todos modos, si está haciendo eso, siempre puede eliminar esos elementos y recurrir al uso getItem()para obtener los elementos de la matriz, getCount()obtener el tamaño de la matriz e getContext()inflar sus vistas.

Charlie-Blake
fuente