CursorLoader,取消订阅 ContentProvider 通知
CursorLoader, unsubscribe from ContentProvider notifications
我正在使用 CursorLoader
查询 ContentProvider
以填充 ListView
,使用以下代码(包含在 LoaderManager
中):
CursorLoader loader = new CursorLoader(getActivity(),
Provider.CONTENT_SOME_URI,
projection,
selection,
null,
null);
并且 AsyncQueryHandler
为给定 _id
更新 SOME_VALUE
触发点击放置在 ListView
[ 的每个条目上的 CheckBox
=24=]
final AsyncQueryHandler handler = new AsyncQueryHandler(contentResolver) {};
final ContentValues values = new ContentValues();
values.put(Table.SOME_COLUMN, someValue);
final Uri uri = Uri.withAppendedPath(Provider.CONTENT_SOME_URI, String.valueOf(someId));
handler.startUpdate(0,
null,
uri,
values,
null,
null);
最后,在我的 ContentProvider 中,我有类似的东西:
@Override
public int update(Uri uri, ...){
... // update stuff
getContext().getContentResolver().notifyChange(uri, null);
}
问题如下:
当我检查单个项目时,该项目被更新,notifyChange 告诉 CursorLoader
重新加载,整个列表重新加载,导致列表滚动到顶部,动画停止,每次 CheckBox
已选中...
不知道该怎么办...
谢谢!
当您调用 setListAdapter
时,会导致列表完全清除其数据并重新生成整个列表。您应该只在 onLoadFinished()
中调用 swapCursor()
- 这会告诉适配器数据已更改,但它将使用列表元素 ID 来重用项目,导致您的列表保留,在您的情况下,完全稳定
我正在使用 CursorLoader
查询 ContentProvider
以填充 ListView
,使用以下代码(包含在 LoaderManager
中):
CursorLoader loader = new CursorLoader(getActivity(),
Provider.CONTENT_SOME_URI,
projection,
selection,
null,
null);
并且 AsyncQueryHandler
为给定 _id
更新 SOME_VALUE
触发点击放置在 ListView
[ 的每个条目上的 CheckBox
=24=]
final AsyncQueryHandler handler = new AsyncQueryHandler(contentResolver) {};
final ContentValues values = new ContentValues();
values.put(Table.SOME_COLUMN, someValue);
final Uri uri = Uri.withAppendedPath(Provider.CONTENT_SOME_URI, String.valueOf(someId));
handler.startUpdate(0,
null,
uri,
values,
null,
null);
最后,在我的 ContentProvider 中,我有类似的东西:
@Override
public int update(Uri uri, ...){
... // update stuff
getContext().getContentResolver().notifyChange(uri, null);
}
问题如下:
当我检查单个项目时,该项目被更新,notifyChange 告诉 CursorLoader
重新加载,整个列表重新加载,导致列表滚动到顶部,动画停止,每次 CheckBox
已选中...
不知道该怎么办...
谢谢!
当您调用 setListAdapter
时,会导致列表完全清除其数据并重新生成整个列表。您应该只在 onLoadFinished()
中调用 swapCursor()
- 这会告诉适配器数据已更改,但它将使用列表元素 ID 来重用项目,导致您的列表保留,在您的情况下,完全稳定