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

我有一个简单的contentProvider,一个带有ListView的布局和一个用于在内容Provider和CursorLoader中添加Items的按钮. http://developer.android.com/reference/android/app/LoaderManager.LoaderCallbacks.html#onLoadFinished(android.content.Loader,D)参考说明了这一点

The Loader will monitor for changes to the data,and report them to
you through new calls here. You should not monitor the data yourself.
For example,if the data is a Cursor and you place it in a
CursorAdapter,use the CursorAdapter(android.content.Context,
android.database.Cursor,int) constructor without passing in either
FLAG_AUTO_REQUERY or FLAG_REGISTER_CONTENT_OBSERVER (that is,use 0
for the flags argument). This prevents the CursorAdapter from doing
its own observing of the Cursor,which is not needed since when a
change happens you will get a new Cursor throw another call here.

但是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,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.DESCRIZIONE };

    CursorLoader cl = new CursorLoader(this,ContentDescriptor.Annunci.CONTENT_URI,proiezione,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);
}
}

有什么建议吗?

解决方法

AFAIK,您需要自己在ContentProvider中实现通知.为此,添加类似getContext()的内容.getContentResolver().notifyChange(uri,null);插入,更新和删除ContentProvider的方法和invoke.setNotificationUri(getContext().getContentResolver(),uri)在 official documentation. Here中描述的查询中你可以找到整个图片.

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

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...