2011-12-29 11 views
7

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?

Respuesta

20

AFAIK, debe implementar la notificación usted mismo en ContentProvider. Para ello, añadir algo como getContext().getContentResolver().notifyChange(uri, null);-insert, update y delete método de ContentProvider e invocar .setNotificationUri(getContext().getContentResolver(), uri) en su Cursor en query como se describe en official documentation. Here puede encontrar la imagen completa.

Nota: No debe cerrar el cursor (cursor.close()) con el fin de obtener notificaciones acerca de los cambios.

+0

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

+0

Para que quede claro, también estaba hablando de CursorLoaders. – ernazm

+4

Siempre olvido configurarNotificationUri en mi consulta y siempre me pregunto por qué el cargador de cursor no está refrescando ...: - | – Tarun

Cuestiones relacionadas