Tengo un contentProvider simple, un diseño con un ListView y un botón para agregar elementos en el proveedor de contenido y un CursorLoader. Los http://developer.android.com/reference/android/app/LoaderManager.LoaderCallbacks.html#onLoadFinished(android.content.Loader, D) remisión se desprende que¿Por qué cursorLoader no notificó cambios en los datos de origen?
El cargador monitorearán de cambios en los datos, e informar a a través de nuevas llamadas aquí. No debe supervisar los datos usted mismo. Por ejemplo, si los datos son un cursor y lo coloca en un CursorAdapter , utilice el CursorAdapter (android.content.Context, android.database.Cursor, int) constructor sin pasar en cualquier FLAG_AUTO_REQUERY o FLAG_REGISTER_CONTENT_OBSERVER (es decir , use 0 para el argumento de indicadores). Esto impide que el CursorAdapter haga su propia observación del Cursor, que no es necesario ya que cuando ocurre un cambio , obtendrá un nuevo Cursor que lanzará otra llamada aquí.
Pero la línea Log.info en el método onLoadFinished no se ejecutó y listView no se actualizó. Aquí está mi código (simple):
public class HomeActivity extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor>{
static final String TAG = "HomeActivity";
SimpleCursorAdapter adapter;
ListView listAnnunciVicini;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.home);
listAnnunciVicini = (ListView) findViewById(R.id.lista_annunci_vicini);
adapter = new SimpleCursorAdapter(this, R.layout.list_item, null,
new String[] {
ContentDescriptor.Annunci.Cols.ID,
ContentDescriptor.Annunci.Cols.TITOLO,
ContentDescriptor.Annunci.Cols.DESCRIZIONE
}, new int[] {
R.id.list_annunci_item_id_annuncio,
R.id.list_annunci_item_titolo_annuncio,
R.id.list_annunci_item_descrizione_annuncio
}, 0);
listAnnunciVicini.setAdapter(adapter);
// Prepare the loader. Either re-connect with an existing one,
// or start a new one.
getSupportLoaderManager().initLoader(0, null, this).forceLoad();
}
public void addRandomItem(View sender) {
ContentValues dataToAdd = new ContentValues();
dataToAdd.put(ContentDescriptor.Annunci.Cols.TITOLO, "Titolo");
dataToAdd.put(ContentDescriptor.Annunci.Cols.DESCRIZIONE, "Lorem ipsum dolor sit amet.");
this.getContentResolver().insert(ContentDescriptor.Annunci.CONTENT_URI, dataToAdd);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// creating a Cursor for the data being displayed.
String[] proiezione = new String[] {ContentDescriptor.Annunci.Cols.ID, ContentDescriptor.Annunci.Cols.TITOLO, ContentDescriptor.Annunci.Cols.DESCRIZIONE };
CursorLoader cl = new CursorLoader(this, ContentDescriptor.Annunci.CONTENT_URI, proiezione, null, null, null);
return cl;
}
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// Swap the new cursor in. (The framework will take care of closing the
// old cursor once we return.)
adapter.swapCursor(data);
Log.i(TAG, "I dati sono stati ricaricati");
}
public void onLoaderReset(Loader<Cursor> loader) {
// This is called when the last Cursor provided to onLoadFinished()
// above is about to be closed. We need to make sure we are no
// longer using it.
adapter.swapCursor(null);
}
}
¿Alguna sugerencia?
Estoy usando la nueva API de cargadores de Android 3.X + porque el viejo método managedQuery está en desuso. Y también he notificado el método Change en mi ContentProvider ... – ilcaduceo
Para que quede claro, también estaba hablando de CursorLoaders. – ernazm
Siempre olvido configurarNotificationUri en mi consulta y siempre me pregunto por qué el cargador de cursor no está refrescando ...: - | – Tarun