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 来重用项目,导致您的列表保留,在您的情况下,完全稳定