studio llenar example developer custom arrayadapter android android-listview android-adapterview

llenar - Androide. ¿Cómo funciona el método notifyDataSetChanged() y ListViews?



listview android studio (4)

Como está ampliando BaseAdapter para crear una subclase, también obtendrá el método notifyDataSetChanged() .

Estoy tratando de entender el concepto ListView y cómo funciona y estoy tratando de crear mi propio adaptador que amplíe BaseAdapter . Para ArrayAdapter por ejemplo, existe el método notifyDataSetChanged() que debe notifyDataSetChanged() después de que haya actualizado la lista de matrices que contiene todos sus datos, con el fin de actualizar el ListView .

Pero estoy creando mi propia subclase de BaseAdapter . Ese método no está disponible para mí, ¿o sí? ¿Cómo implemento este método? Básicamente, ¿qué hace exactamente ese método? Tal vez lo entiendo entonces.

En el caso de ArrayAdapter que mira en qué posición se muestra ListView actualmente y comprueba si es el mismo que en ArrayList después de que se actualizó. O...

Dice que el método:

Notifica a los observadores adjuntos que los datos subyacentes se han modificado y que cualquier Vista que refleje el conjunto de datos debe actualizarse.

Pero, ¿cómo se actualiza?

¿Alguien puede explicar por favor?


Supongamos que su ListView muestra algunos datos almacenados en una ArrayList .

Después de cambiar el contenido de ArrayList , debe indicarle a la lista que el origen de los datos ha cambiado y que necesita volver a dibujarse para mostrar los datos nuevos.

Entonces, ahí es donde notifyDatasetChanged() en notifyDatasetChanged() . Le dice a ListView que los datos han sido modificados; y para mostrar los datos nuevos, ListView debe volver a dibujarse.


BaseAdapter puede ser "observado" por otras clases. Cuando está llamando al método de ListView setAdapter() se trata de las llamadas registerDataSetObserver of adapter. Entonces, el adaptador sabe quién está interesado en nuevos datos.

Puede verificar la fuente de BaseAdapter here . Es bastante pequeño

notifyDataSetChanged está disponible para usted y básicamente no debe anularlo (porque no está haciendo nada especial, por lo que puede reutilizarlo en su propia clase).


Lo he descubierto . No podía entender cómo comenzó el adaptador y cómo sabía dónde obtener los datos. Cuando extendí la clase BaseAdapter , en el constructor de esa clase, inicié la lista de elementos que quería ver en ListView . Pero no pude entender cómo se usarían estos valores y cuándo.

¡Así que aquí está la cosa! :

En BaseAdapter hay algunos métodos que deben ser anulados. Entre estos, hay getCount() .

Cuando se crea el ListView y todo lo getCount() , llama a getCount() . Si esto devuelve un valor diferente a 0 ( getView() el tamaño de ArrayList que he inicializado previamente en el constructor), llama a getView() suficientes veces para llenar la pantalla con elementos. Por ejemplo , inicié ArrayList con 20 elementos. Como solo cabían inicialmente 8 elementos en la pantalla, se llamó a getView() 8 veces, cada vez que preguntaba por la posición que necesitaba para volver (más precisamente, quería saber cómo se vería la fila en la lista en esa posición específica). , qué datos necesitaba contener). Si me getView() hacia abajo en la lista, getView() se llama una y otra vez, hasta que llego al final de la lista, en mi caso 20 elementos / filas.

Lo que notifyDataSetChanged() es ... cuando se llama, busca qué elementos se muestran en la pantalla en el momento de su llamada (más precisamente qué índices de fila) y llama a getView() con esas posiciones.

es decir, si está mostrando los primeros 8 elementos en la lista (entonces esos son los visibles en la pantalla) y agrega otro elemento entre el 2 ° y 3 ° elemento de la lista y llama a notifyDataSetChanged() se getView() 8 veces, con posiciones comenzando desde 0 y terminando con 7, y porque en el método getView() está obteniendo datos de ArrayList entonces automáticamente devolverá el nuevo elemento insertado en la lista junto con 7 de los 8 anteriores (7 y no 8 porque el último elemento cayó una posición hacia abajo, por lo que ya no está visible), y el ListView volverá a dibujar, o lo que sea, con estos elementos.

Además, es importante especificar que si ha implementado getView() correctamente, terminará reciclando los elementos (los objetos) ya mostrados (en lugar de crear otros nuevos). Vea este video alrededor de las 12:00 minutos para ver la forma correcta de implementar getView()

He descubierto todo esto haciendo llamadas a LogCat en cada método y siguiendo lo que estaba pasando.

Espero que esto ayude a alguien que recién está empezando a entender cómo funciona ListView .

PD Este ejemplo también me ayudó mucho a entender.