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.