2010-07-10 28 views

Respuesta

26

Depende de la implementación del adaptador ... si se toma un aspecto del código fuente se verá que:

  1. notifyDataSetInvalidated() llama al notifyInvalidated() de la clase DataSetObservable (see here)
  2. Entonces, notifyInvalidated() llama al método onInvalidated() para cada DataSetObserver (see here).
  3. Luego viene la parte divertida: onInvalidated()does not do anything ...

Esta es su aplicación:

public void onInvalidated() { 
    // Do nothing 
} 

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

+0

Tenga en cuenta que casi siempre quiere llamar a 'notifyDataSetChanged()' en lugar de invalidar; el cambio se redibujará automáticamente. – karl

28

Hasta donde yo sé, el método notifyDataSetInvalidated() detiene el acceso del adaptador 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 hilo de la interfaz de usuario.

Me ayudó mucho ver this video - hay dos secciones donde mencionan esos métodos y explican cómo usarlos correctamente. Quizás también te ayude :)

+0

Gran video. El aspecto más preciso es el 17:35 - http://youtu.be/wDBM6wVEO70?t=17m35s, "los datos ya no están, ya no vamos a acceder", por ejemplo, se eliminó el archivo. Eso lo clavó para mí. – gor

18

Hace poco me topé con esta pregunta y quise elaborar para aquellos que se preguntan programáticamente qué está sucediendo cuando llamas al notifyDataSetChanged() y notifyDataSetInvalidated(). * Respuesta corta, vaya here

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

Si sigue el código se verá en efecto, que DataSetObserver es abstracta como se ha dicho, y que los onChanged()/onInvalidated() métodos se espera vacía para su aplicación por una subclase.

Si este fuera el final de la historia, ¿por qué los ingenieros del framework Android nos dicen que llamemos a estos métodos si no hacen nada? Me tomó un poco de excavación pero resulta que ya existe una subclase de DataSetObserver llamada AdapterDataSetObserver y vive en la clase abstracta AdapterView (que se extiende por clases como GridView y ListView). Este observador se crea automáticamente por Android cuando setAdapter() en su AdapterView y obtiene registered a su adaptador.

Aquí puede ver todas las locuras que estos métodos realmente hacen.La documentación es pobre y al principio pensé que necesitaba registrar mi propia subclase DataSetObserver para que funcionen, pero resulta que una ya está creada para usted.

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

3

De acuerdo con la conferencia "the world of listView", debe usarlo cada vez que listView no muestre nada (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, son las 36:00.

Lo extraño es, ¿por qué no acaba de combinarlo con los notifyDataSetChanged, lo que podría comprobar si el número de los artículos y decidir llamarlo por sí mismo ...

De acuerdo con lo que he visto , lo que se habló en la conferencia no es del todo correcto. 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 utilizar notifyDataSetInvalidated solo cuando los datos no cambian .

Por ejemplo, si se maneja el filtrado, y se obtiene los mismos resultados (y tal vez es suficiente para comprobar el número de resultados) como antes, puede llamar notifyDataSetInvalidated en lugar de notifyDataSetChanged

+0

Como su último párrafo, si obtiene los mismos resultados, no necesita hacer nada, ya que los datos son los mismos que antes: p – HendraWD

+0

@HendraWijayaDjiono Eso es lo que escribí. Es extraño ya que no veo el punto de usar esto alguna vez. No puedo encontrar un buen escenario que sea útil. –