在数据库发生变化时停止刷新 listView
Stop refreshing listView on change in Database
我正在使用 cursorLoader
创建 ListView
。如果数据库发生任何变化,我不想刷新我的列表数据或重新启动加载程序。有什么解决办法吗?
这是我从数据库加载数据的方式。
@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);
因为 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);
}
};
}
这将 return 一个没有通知 uri 的游标,因此当数据库更改时它不会收到通知
我正在使用 cursorLoader
创建 ListView
。如果数据库发生任何变化,我不想刷新我的列表数据或重新启动加载程序。有什么解决办法吗?
这是我从数据库加载数据的方式。
@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);
因为 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);
}
};
}
这将 return 一个没有通知 uri 的游标,因此当数据库更改时它不会收到通知