studio recyclerview ejemplo clase arrayadapter adapterview android dataadapter

recyclerview - Android-¿Qué hace adapter.notifyDataSetInvalidated?



listview android studio (4)

De acuerdo con la conferencia " el mundo de listView ", debe usarla cada vez que listView no tenga nada que mostrar (es decir, datos vacíos).

Un ejemplo del que hablan es cuando se realiza el filtrado (en el método "publishResults"). en el video de la conferencia, es a las 36:00.

Lo extraño es que, ¿por qué no lo fusionaron simplemente con notificationDataSetChanged, que podría verificar el número de elementos y decidir llamarlo por sí mismo ...

Según lo que he visto, lo que se habló en la conferencia no está del todo bien. Si el adaptador ha mostrado algo de contenido anteriormente, y ahora no contiene nada, y ahora llama a NotifyDataSetInvalidated, no ocurrirá nada, por lo que el contenido permanecerá, por lo que creo que es seguro usar notifyDataSetInvalidated solo cuando los datos no cambian .

Por ejemplo, si maneja el filtrado y obtiene los mismos resultados (y tal vez sea suficiente para verificar el número de resultados) que antes, puede llamar a NotifyDataSetInvalidated en lugar de notifyDataSetChanged

¿Qué logra el método adapter.notifyDataSetInvalidated ()? No hay documentación al respecto.

Estoy tratando de recargar un ListView y notifyDataSetChanged o notifyDataSetInvalidated parece no lograr nada.


Depende de la implementación del adaptador ... si miras el código fuente, verás que:

  1. notifyDataSetInvalidated() llama a notifyInvalidated() de la clase DataSetObservable ( vea aquí )
  2. Luego, notifyInvalidated() llama al método onInvalidated() para cada DataSetObserver ( ver aquí ).
  3. Luego viene la parte divertida: onInvalidated() no hace nada ...

Esta es su implementación:

public void onInvalidated() { // Do nothing }

DataSetObserver es una clase abstracta, por lo que depende de la subclase decidir qué hacer en onInvalidated() .


Hace poco me encontré con esta pregunta y quería elaborar para aquellos que se preguntan por programación qué está ocurriendo cuando llama a notifyDataSetChanged() y notifyDataSetInvalidated() . * Respuesta corta, ve here

Como @Cristian declaró en su respuesta, cuando llama a estos métodos de notificación en su Adaptador, básicamente llama a través de algunas clases y termina llamando a onChanged() / onInvalidated() en los DataSetObserver registrados para su Adaptador.

Si sigue el código, verá que DataSetObserver es abstracto como se indica y que los onChanged() / onInvalidated() están vacíos esperando la implementación de una subclase.

Si este fuera el final de la historia, ¿por qué los ingenieros de marcos de Android siguen diciéndonos que llamemos a estos métodos si no hacen nada? Tomó un poco de investigación pero resulta que ya existe una subclase de este DataSetObserver llamado DataSetObserver y vive en la clase abstracta AdapterView (que se extiende por clases como GridView y ListView ). Este observador es creado automáticamente por Android cuando setAdapter() en tu AdapterView y te registered en tu adaptador.

Es aquí donde puedes ver todas las locuras que hacen estos métodos. La documentación es deficiente y al principio pensé que necesitaba registrar mi propio DataSetObserver subclasificado para que funcionara, pero resulta que uno ya está creado para usted.

* Algo que pensé podría ser útil: creo que puede registrar más de un DataSetObserver en su Adaptador (además del predeterminado). Esto le permitiría realizar un trabajo adicional si fuera necesario (como cambiar la vista de la barra de progreso con una vista de imagen cuando los mapas de bits se hayan descargado).


Que yo sepa, el método notifyDataSetInvalidated() impide que el adaptador acceda a los datos (en caso de que no sea válido, no esté disponible, etc.). El método notifyDataSetChanged() actualiza el ListView para que pueda ver los nuevos datos agregados, pero debe llamarlo en el subproceso de la interfaz de usuario.

Me ayudó mucho ver este video : hay dos secciones donde mencionan esos métodos y explican cómo usarlos correctamente. Tal vez te ayuda también :)