我正在使用 ListView
创建 cursorLoader
。如果在Database中发生任何更改,我不想刷新列表数据或重新启动加载器。有没有解决方案?
以下是我从数据库加载数据的方法。
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
String SELECTION = MyContactsQuery.SELECTION ;
return new CursorLoader(SelectContactsForGroup.this, MyContactsProvider.CONTENT_URI, MyContactsQuery.PROJECTION,SELECTION, null, MyContactsQuery.SORT_ORDER);
}
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
if(arg1.getCount() <= 0){
invitelist.setFastScrollAlwaysVisible(false);
}else{
invitelist.post(fitsOnScreen);
}
if(!isfromRestartLoader){
arg1.moveToFirst();
while(arg1.moveToNext()){
checkedStates.put(arg1.getString(arg1.getColumnIndex(MyContactsConstants.CONTACT_JID)), false);
}
arg1.moveToFirst();
}
madapter.swapCursor(arg1);
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
if (arg0.getId() == MyContactsQuery.QUERY_ID){
madapter.swapCursor(null);
}
}
在我的onCreate方法中:
getLoaderManager().initLoader(MyContactsQuery.QUERY_ID, null, (LoaderCallbacks<Cursor>) this);
答案 0 :(得分:1)
由于CursorLoarder
在uri上注册ContentObserver
,您可以使用Loader
的其他实现
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
String SELECTION = MyContactsQuery.SELECTION ;
return new AsyncTaskLoader<Cursor>(SelectContactsForGroup.this) {
@Override
public Cursor loadInBackground() {
return getContentResolver().query(MyContactsProvider.CONTENT_URI,
MyContactsQuery.PROJECTION,
SELECTION,
null,
MyContactsQuery.SORT_ORDER);
}
};
}
这将返回一个没有通知uri的游标,因此当db更改时它将不会被通知