为什么cursorLoader没有通知源数据的变化?

我有一个简单的contentProvider,一个带有ListView的布局和一个用于在Content Provider和CursorLoader中添加Items的button。 http://developer.android.com/reference/android/app/LoaderManager.LoaderCallbacks.html#onLoadFinished(android.content.Loader,D )参考指出

装载程序将监视数据的变化,并在此处通过新的调用向您报告。 你不应该自己监视数据。 例如,如果数据是一个Cursor,并将其放置在CursorAdapter中,则使用CursorAdapter(android.content.Context,android.database.Cursor,int)构造函数,而不传入FLAG_AUTO_REQUERY或FLAG_REGISTER_CONTENT_OBSERVER(即,使用0标志参数)。 这可以防止CursorAdapter自己观察游标,因为当发生变化时,您将得到一个新的游标在这里再次调用游标。

但是onLoadFinished方法中的Log.info行没有被执行,listView没有刷新。 这是我的(简单)代码:

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); } } 

任何build议?

Related of "为什么cursorLoader没有通知源数据的变化?"

AFAIK,你需要在ContentProvider自己实现通知。 为此,添加一些像getContext().getContentResolver().notifyChange(uri, null); insertupdatedelete ContentProvider方法,并调用.setNotificationUri(getContext().getContentResolver(), uri)在你的Cursorquery所描述的官方文档 。 在这里你可以find整个图片。

注意:您不应closures游标( cursor.close() )以获取有关更改的通知。