2012-03-09 34 views
8

Tengo un ListView en una ListActivity vinculada a algunos datos. Tengo un proveedor de contenido que proporciona los datos.Android ListView Live Updating

El ListActivity obtiene los datos mediante la consulta de un dispositivo de resolución contenido:

Uri uri = Uri.parse("content://my.provider.DocumentProvider/mystuff"); 
contentCursor = this.getContentResolver().query(uri, null, null, null, null); 

Así que ahora tiene la actividad del cursor. Crea un adaptador y lo conecta a la lista:

ListAdapter adapter = new DocumentListCursorAdapter(this, R.layout.main_row_layout, contentCursor, new String[] { "titleColumn" }, new int[] { titleColumnIndex }); 
setListAdapter(adapter); 

Esto funciona bien; la lista muestra los datos en el cursor.

Pero ahora el proveedor de contenido tiene nuevos datos. Quiero que la lista se actualice para mostrar los nuevos datos.

Los ejemplos que he visto implican una llamada al notifyDataSetChanged del adaptador, pero me parece que esto rompe la separación entre el proveedor de contenido y la lista, que está consumiendo el contenido.

¿El proveedor de contenido necesita saber qué adaptadores están conectados al cursor para que pueda llamar a su método notifyDataSetChanged? ¿O hay una mejor manera de no ver estas dos cosas acopladas de esta manera?

+0

¿Ha visto http://developer.android.com/reference/android/content/ContentResolver.html#notifyChange%28android.net.Uri,%20android.database.ContentObserver,%20boolean%29? – Luksprog

+0

Intenté registrarme con registerContentObserver, pero no vi un cambio cuando cambió el cursor. ¿Debería eso funcionar? – stevex

+0

igual que slukian, además puede necesitar 'contentCursor.setNotificationUri (cr, uri);' – njzk2

Respuesta

6

he encontrado la respuesta aquí:

http://mylifewithandroid.blogspot.com/2008/03/observing-content.html

En un nutshel l, el proveedor llama NotifyChange para indicar que el contenido en el URI ha cambiado:

getContext().getContentResolver().notifyChange(uri, null); 

Y el ListActivity llama setNotificationUri en el cursor para registrar que está interesado en recibir la notificación de cambios:

contentCursor.setNotificationUri(getContentResolver(), uri); 

(Gracias njzk2 por señalarme en la dirección correcta).

+0

hehe unos segundos antes que yo – Selvin

+1

Hola, estoy trabajando en un problema similar. Tengo un BaseAdapter personalizado y paso un Cursor obtenido del Proveedor de Contenido al Adaptador. Ahora basado en su Q & A. Si puedo preguntar, en la documentación 'setNotificationUri' ** Notifica al oyente conectado al Resolver **. ¿Cómo está usando esto para actualizar Listview? ¿No estás usando ContentObserver? –

+0

¿El URI es solo un valor inventado? ¿Cómo sé que mi URI no es accidentalmente igual que el URI de otra aplicación? –

0

Quiere decir, desea actualizar la lista según los datos modificados.
Para que acaba de intentar esto:
cuando llegue nuevo cursor y luego sólo hay que poner este código en lugar set nuevo adaptador a la lista ..

adapter.notifyDatasetChanged(); 

y

listview.invalidate() 
+0

¿Cómo sé cuándo obtener un nuevo cursor? Los datos han cambiado (por ejemplo, debido a alguna actividad de red, se han recibido nuevos datos) y el proveedor de contenido es consciente de que los datos han cambiado. ¿Qué hace el proveedor de contenido para enviar la notificación a ListActivity? Es bastante fácil resolver esto si supone que el proveedor y la lista están en la misma aplicación, pero ¿qué ocurre si el proveedor de contenido está conectado a una lista en un proceso diferente? ¿Qué hace el proveedor de contenido para comunicar el cambio a donde está la lista? – stevex

+0

¿Necesitamos hacer los dos o 'adapter.notifyDatasetChanged()' actualizará Listview? –

1

Asumiendo que ContentProvider es suya se debe añadir en su cursor.setNotificationUri(getContext().getContentResolver(), uri);query aplicación de CP (antes de regresar cursor) y getContext().getContentResolver().notifyChange(uri, null); en update, insert, delete ... SimpleCursorAdapter que es prolly base de su DocumentListCursorAdapter debe tener cuidado acerca de cómo actualizar vista de lista .