如果LZ用的是CursorLoader(CursorLoader自带观察者,内部的cursor一旦发现数据库有变化会自动启动startloading,于是就会调用回调函数onLoaderFinished),那么在
OnLoaderFinished里面
adapter.swap(cursor);class MyAdapter extends XXX {
private Cursor mCursor;
...
void swap(Cursor cursor) {
   mCursor = cursor;   //变更数据
   notifyDataSetChanged();  //如LS所言,这里是关键,告诉适配器MyAdapter数据有变化要更新view
}
...
}

解决方案 »

  1.   

    这是要覆盖swapCursor方法吗?我在数据改变后调用restartLoad方法也达到了效果,就是不知效率高不高? 
      

  2.   

    这是要覆盖swapCursor方法吗?我在数据改变后调用restartLoad方法也达到了效果,就是不知效率高不高? restartLoad是需要慎用的。对于CursorLoader来说,只要你的查询语句不需要改变,就不要使用restartLoad。使用restartLoad相当于重新new了一个CursorLoader,和没用Loader没啥区别了。
    swapCursor并不必须是官方的方法,可以是你私人的,你也可以取别的名字。关键是adapter公开出这个方法,让LoaderManager在回调函数OnLoaderFinished里面调用。而一旦一个CursurLoader的数据有变化,其内部经过一系列调用,最终也会触发OnLoaderFinished,并调用里面的swapCursor(也可以是其他的名字,反正能实现更新你adapter里面的数据,并同时通知你的adapter数据已改变,需要更新UI,即调用notifyDataSetChanged()就行了)
      

  3.   

    这是要覆盖swapCursor方法吗?我在数据改变后调用restartLoad方法也达到了效果,就是不知效率高不高? restartLoad是需要慎用的。对于CursorLoader来说,只要你的查询语句不需要改变,就不要使用restartLoad。使用restartLoad相当于重新new了一个CursorLoader,和没用Loader没啥区别了。
    swapCursor并不必须是官方的方法,可以是你私人的,你也可以取别的名字。关键是adapter公开出这个方法,让LoaderManager在回调函数OnLoaderFinished里面调用。而一旦一个CursurLoader的数据有变化,其内部经过一系列调用,最终也会触发OnLoaderFinished,并调用里面的swapCursor(也可以是其他的名字,反正能实现更新你adapter里面的数据,并同时通知你的adapter数据已改变,需要更新UI,即调用notifyDataSetChanged()就行了)
    谢谢回复。
    现在是这个问题,我自己的adapter继承自CursorAdapter。覆盖了bindView函数,在此函数中我删除了数据库中的一条目。可onLoadFinished却没有被自动调用。只用当退出这个activity在从新进入时才会调用这个函数刷新。Loader和adapter需要什么关联吗?
      

  4.   

    就是感觉Loader自带的观察者没体作用,没有检测到数据库的变化.
      

  5.   

    问题解决了:
    增删数据后要加上 getContext().getContentResolver().notifyChange(uri, null);通知所有观察者数据改变。查询返回cursor前设置其观察的uri: cursor.setNotificationUri(getContext().getContentResolver(), uri);
      

  6.   

    setNotificationUri这句代码具体什么意思,有人知道吗?