如果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
}
...
}
OnLoaderFinished里面
adapter.swap(cursor);class MyAdapter extends XXX {
private Cursor mCursor;
...
void swap(Cursor cursor) {
mCursor = cursor; //变更数据
notifyDataSetChanged(); //如LS所言,这里是关键,告诉适配器MyAdapter数据有变化要更新view
}
...
}
解决方案 »
- 各路大神帮忙看看 哪里错了?
- 有人知道怎么监控程序崩溃么?
- 想入门一下,求入门书籍。
- 问一个简单的问题:关于gen
- 请问大家一个很基础的问题:
- aidl连接问题
- 不能使用listview控件 方法里 getView() 里面 View 缓存。。。
- 【分享工具】SDKUtils多渠道接入工具
- 在使用android ndk中:android_runtime/AndroidRuntime.h: No such file or directory
- Android Surfaceview+Mediaplayer 播放视频只有声音,屏幕是黑的
- SimpleCursorAdapter的构造函数被声明为废除,不能用了吗?那该用什么代替呢
- 关于Android画图程序中的Canvas类使用的疑问
swapCursor并不必须是官方的方法,可以是你私人的,你也可以取别的名字。关键是adapter公开出这个方法,让LoaderManager在回调函数OnLoaderFinished里面调用。而一旦一个CursurLoader的数据有变化,其内部经过一系列调用,最终也会触发OnLoaderFinished,并调用里面的swapCursor(也可以是其他的名字,反正能实现更新你adapter里面的数据,并同时通知你的adapter数据已改变,需要更新UI,即调用notifyDataSetChanged()就行了)
swapCursor并不必须是官方的方法,可以是你私人的,你也可以取别的名字。关键是adapter公开出这个方法,让LoaderManager在回调函数OnLoaderFinished里面调用。而一旦一个CursurLoader的数据有变化,其内部经过一系列调用,最终也会触发OnLoaderFinished,并调用里面的swapCursor(也可以是其他的名字,反正能实现更新你adapter里面的数据,并同时通知你的adapter数据已改变,需要更新UI,即调用notifyDataSetChanged()就行了)
谢谢回复。
现在是这个问题,我自己的adapter继承自CursorAdapter。覆盖了bindView函数,在此函数中我删除了数据库中的一条目。可onLoadFinished却没有被自动调用。只用当退出这个activity在从新进入时才会调用这个函数刷新。Loader和adapter需要什么关联吗?
增删数据后要加上 getContext().getContentResolver().notifyChange(uri, null);通知所有观察者数据改变。查询返回cursor前设置其观察的uri: cursor.setNotificationUri(getContext().getContentResolver(), uri);