ejemplo custom arrayadapter android performance listview android-arrayadapter baseadapter

custom - base adapter android



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

Aquí está la diferencia:

  • BaseAdapter es un adaptador muy genérico que te permite hacer prácticamente todo lo que quieras. Sin embargo, tienes que codificarte un poco más para que funcione.
  • ArrayAdapter es una implementación más completa que funciona bien para datos en matrices o ArrayList . Del mismo modo, hay un CursorAdapter relacionado que debe usar si sus datos están en un Cursor . Ambos extienden BaseAdapter .

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

El rendimiento de cada uno realmente depende de cómo los implemente o cambie su comportamiento. En esencia, cualquiera de los dos puede ser igual de efectivo (especialmente si se considera que un ArrayAdapter es un BaseAdapter ).

Puede hacer casi cualquier cosa que desee con cualquier adaptador, pero tenga en cuenta que BaseAdapter es abstracto, por lo que no puede usarlo directamente.

Quiero saber la diferencia entre usar BaseAdapter y ArrayAdapter .

He logrado lo que quiero a través de ArrayAdapters .

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

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


En respuesta a sus 3 preguntas:

(1) developer.android.com/reference/android/widget/BaseAdapter.html , de acuerdo con los documentos de Android, es simplemente una superclase de varios tipos de adaptadores, uno de los cuales es ArrayAdapter . Hay una serie de otros adaptadores derivados de BaseAdapter que se adaptan a diferentes propósitos. Como resultado, es poco probable que haya alguna diferencia en la eficiencia entre los dos; solo tiene 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 bitmaps y otros datos.

(3) Probablemente pueda encontrar una manera de trabajar con su ListView usando un tipo diferente de adaptador, sin embargo, la razón por la cual ArrayAdapter funciona es porque generalmente tiene sentido dado que el objetivo es construir una lista interactiva. ArrayAdapte toma una Array , normalmente una ArrayList de objetos, que luego procesa para crear la información de respaldo para ListView . En ese sentido, la configuración de ArrayList -> ArrayAdapter -> ListView simplemente tiene sentido lógicamente.


Una diferencia más entre BaseAdapter y ArrayAdapters es que, si extiende el adaptador de matriz, debe llamar al constructor de la clase superior en el constructor de la 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 súper clase 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; } }


BaseAdapter es abstracto mientras ArrayAdapter extiende BaseAdapter (es una implementación concreta de un BaseAdapter ). Si se extiende para ArrayAdapter , está incorporando todas las características de ArrayAdapter y, anulando su implementación, puede modificar el ArrayAdapter ArrayAdapter. Si extiende BaseAdapter , debe implementar todos los métodos abstractos que ArrayAdapter ya implementa.

Además, ¿afecta el rendimiento de ListView

No, no lo hace.

Y, la última pregunta es, ¿puedo lograr algo haciendo 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 anularlo y reinventar la rueda?

La principal diferencia entre ellos es que BaseAdapter no puede instalarse mientras que ArrayAdapter puede


BaseAdapter s son más minimalistas y personalizables. ArrayAdapter s implementa los usos más generales de ListAdapter s, pero a veces no son suficientes.

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

Sin embargo, si está almacenando su Context , Arrays o Lists en su implementación de ArrayAdapter, tal vez querrá cambiar a BaseAdapter , ya que ArrayAdapter ya los tiene implementados.

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


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.